pax_global_header00006660000000000000000000000064145240253550014517gustar00rootroot0000000000000052 comment=54c1407c364d21de18a1d90fc9e3173837306b7d motion-release-4.6.0/000077500000000000000000000000001452402535500144515ustar00rootroot00000000000000motion-release-4.6.0/.github/000077500000000000000000000000001452402535500160115ustar00rootroot00000000000000motion-release-4.6.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001452402535500201745ustar00rootroot00000000000000motion-release-4.6.0/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000005431452402535500221660ustar00rootroot00000000000000blank_issues_enabled: false contact_links: - name: Motion User Questions url: https://github.com/Motion-Project/motion/discussions about: Please ask and answer questions here. - name: Motion Enhancements url: https://github.com/Motion-Project/motion/discussions about: Please use the discussions page and tag as an enhancement request.motion-release-4.6.0/.github/ISSUE_TEMPLATE/issue.yml000066400000000000000000000050651452402535500220550ustar00rootroot00000000000000name: Issue Report description: File a report on a problem with the code labels: ["bug"] body: - type: markdown attributes: value: | Use this form for reporting problems with the code. - type: dropdown id: readdocs attributes: label: Did you read the guide? multiple: false options: - 'Yes' - 'No' validations: required: true - type: dropdown id: baseversion attributes: label: What is the base version number of Motion being used? multiple: false options: - 4.0.x - 4.1.x - 4.2.x - 4.3.x - 4.4.x - 4.5.x - 4.6.x validations: required: true - type: dropdown id: buildtype attributes: label: What was the install method? multiple: false options: - Built from source code - Installed via package tool validations: required: true - type: dropdown id: buildarch attributes: label: What is base architecture? multiple: false options: - ARM-32bit - ARM-64bit - x86 - Other validations: required: true - type: dropdown id: distrotype attributes: label: What is the distro being used? multiple: false options: - Raspbian - Ubuntu - Debian - BSD - Other validations: required: true - type: input id: distrover attributes: label: Disto version number description: The version number of the distro being used e.g. 20.04, bullseye validations: required: false - type: dropdown id: camtype attributes: label: Camera type(s) being used? multiple: true options: - v4l2 USB camera - v4l2 capture card - PI cam via libcamerify - PI cam via MMAL - Network camera with RTSP - Network camera with HTTP - Other validations: required: true - type: textarea id: what-happened attributes: label: Describe the issue/problem and steps to reproduce description: Issue/Problem Description placeholder: Tell us what went wrong validations: required: true - type: textarea id: logs attributes: label: Motion log output at log_level 8 description: Provide the entire log output from Motion start up to when the issue occurs so we can see the parameters. This will be automatically formatted into code, so no need for backticks. render: shell validations: required: true motion-release-4.6.0/.gitignore000066400000000000000000000014461452402535500164460ustar00rootroot00000000000000Makefile Makefile.in ABOUT-NLS compile config.guess config.h config.h.in config.h.in~ config.log config.rpath config.status config.sub configure autom4te.cache aclocal.m4 depcomp install-sh m4/ missing stamp-h1 #data data/motion.service data/motion-dist.conf data/camera1-dist.conf data/camera2-dist.conf data/camera3-dist.conf data/camera4-dist.conf #src src/*.o src/motion src/Makefile src/Makefile.in src/.deps/ src/Makefile src/Makefile.in src/raspicam/*.o src/raspicam/.dirstamp src/raspicam/.deps/ *.log .depend #po po/*.mo po/*.gmo po/Makefile po/Makefile.in po/Makefile.in.in po/Makevars.template po/POTFILES po/Rules-quot po/boldquot.sed po/en@boldquot.header po/en@quot.header po/insert-header.sin po/quot.sed po/motion.pot po/remove-potcdate.sed po/remove-potcdate.sin po/stamp-po .vscode/ motion-release-4.6.0/CONTRIBUTING.md000066400000000000000000000060111452402535500167000ustar00rootroot00000000000000# How to contribute Issues on the github site are intended to discuss code problems, crashes and application enhancements. If you are having an issue with the setup, configuration or use of Motion, we have the following additional resources which are better suited to meet these needs. * User guide: [Motion User Guide](https://motion-project.github.io/motion_guide.html) * User Group List: Please sign-up and send your issue to the list [Motion User](https://lists.sourceforge.net/lists/listinfo/motion-user) * IRC: [#motion](ircs://irc.libera.chat:6697/motion) on Libera Chat It is very important to use these resources for non-code issues since it engages a much wider audience who may have experience resolving the particular issue you are trying to resolve. ## Submitting Problems Before submitting a issue, please make sure that you are using either the latest release as posted [here](https://github.com/Motion-Project/motion/releases) or that you have built the latest source code from the github master branch. If the issue still remains with the current version, please validate that the issue has not already been reported by searching through the issue log. Next, we must be provided the following in order to replicate and ultimately resolve the issue: * A complete Motion log for a single run from startup to shutdown at the INF/7 log level. * The expected versus actual result The preferred method of providing the log file is by posting it on [gist](https://gist.github.com/). Only provide the link to the gist file within the issue. The full configuration will be printed out to the log at the INF/7 level with the most common, sensitive information (URLs, usernames/passwords, etc) masked. It is recommended that you double check before posting the log file. For more information please read [privacy wiki article](https://github.com/Motion-Project/motion/wiki/Privacy) Note that the developers do not use any front-end application to use Motion and we need the actual logs from the Motion application rather than logs from the front-end application. ## Submitting an Enhancement Request Motion has a extremely large number of configuration options. With so many options, it is important to include a description of how/why the enhancement will be used. It is possible that the existing options can be configured to address the need. (Which could then lead to a different enhancement than originally contemplated of making those options easier to use or documented better.) ## Submitting changes Generally, it is best to first submit a issue on the particular enhancement prior to a pull request. This allows the particular item to be discussed and determine how it would fit into the application. As pull requests are prepared, in addition to the actual code, please also consider: * Changes needed to the Motion_Guide.html which is our user guide. * Changes to the motion.1 file which is the manual * Changes to the configuration templates of motion.conf, camera1.conf, etc. Thanks, Motion-Project Team. motion-release-4.6.0/LICENSE000066400000000000000000000432541452402535500154660ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. motion-release-4.6.0/Makefile.am000066400000000000000000000050141452402535500165050ustar00rootroot00000000000000ACLOCAL_AMFLAGS = -I m4 SUBDIRS = src po pkgsysconfdir = $(sysconfdir)/@PACKAGE@ dist_pkgsysconf_DATA = \ data/motion-dist.conf \ data/camera1-dist.conf \ data/camera2-dist.conf \ data/camera3-dist.conf \ data/camera4-dist.conf dist_man_MANS = man/motion.1 dist_doc_DATA = \ doc/mask1.png \ doc/normal.jpg \ doc/outputmotion1.jpg \ doc/outputnormal1.jpg \ doc/motion_guide.html \ doc/motion_stylesheet.css \ doc/CREDITS \ doc/motion_build.html \ doc/motion_config.html ################################################################### ## Create pristine directories to match exactly distributed files ################################################################### cleanall: distclean @rm -rf autom4te.cache m4 @rm -f config.h.in config.h.in~ aclocal.m4 config.sub ABOUT-NLS missing @rm -f compile config.guess config.rpath configure depcomp install-sh @rm -f po/en@boldquot.header po/en@quot.header po/insert-header.sin @rm -f po/Makevars.template po/quot.sed po/remove-potcdate.sin @rm -f po/Rules-quot po/stamp-po po/*.gmo po/motion.pot po/boldquot.sed @rm -f Makefile.in src/Makefile.in po/Makefile.in.in man/Makefile.in @rm -f data/motion.service data/motion-dist.conf @rm -f data/camera1-dist.conf data/camera2-dist.conf @rm -f data/camera3-dist.conf data/camera4-dist.conf ################################################################### ## Clean out the tilde crumb files left by gettext autotool processing ################################################################### all-local: @rm -f po/*.po\~ maintainer-check: ./configure --with-prototype-flags && $(MAKE) clean && $(MAKE) ./configure --with-prototype-flags --without-mariadb && $(MAKE) clean && $(MAKE) ./configure --with-prototype-flags --without-ffmpeg && $(MAKE) clean && $(MAKE) ./configure --with-prototype-flags --without-mysql && $(MAKE) clean && $(MAKE) ./configure --with-prototype-flags --without-mariadb && $(MAKE) clean && $(MAKE) ./configure --with-prototype-flags --without-sqlite3 && $(MAKE) clean && $(MAKE) ./configure --with-prototype-flags --without-pgsql && $(MAKE) clean && $(MAKE) ./configure --with-prototype-flags --without-v4l2 && $(MAKE) clean && $(MAKE) ./configure --with-prototype-flags --without-webp && $(MAKE) clean && $(MAKE) ./configure --with-developer-flags \ --without-mysql \ --without-mariadb \ && $(MAKE) clean && $(MAKE) ./configure --with-developer-flags \ --without-mysql \ --without-mariadb \ --without-sqlite3 \ --without-pgsql \ && $(MAKE) clean && $(MAKE) motion-release-4.6.0/README.md000066400000000000000000000027171452402535500157370ustar00rootroot00000000000000Motion ============= ## Description Motion is a program that monitors the video signal from one or more cameras and is able to detect if a significant part of the picture has changed. Or in other words, it can detect motion. ## Documentation The documentation for Motion is contained within the file motion_guide.html. The offline version of this file is available in the **doc/motion** directory. The online version of the motion_guide.html file can be viewed [here](https://motion-project.github.io/motion_guide.html) In addition to the detailed building instructions included within the guide, the INSTALL file contains abbreviated building instructions. ## Resources Please join the mailing list [here](https://lists.sourceforge.net/lists/listinfo/motion-user) We prefer support through the mailing list because more people will have the benefit from the answers. A archive of mailing list discussions can be viewed [here](https://sourceforge.net/p/motion/mailman/motion-user/) ## License Motion is mainly distributed under the GNU GENERAL PUBLIC LICENSE (GPL) version 2 or later. See the copyright file for a list of all the licensing terms of the various components of Motion. The file CREDITS lists the many people who have contributed to Motion over the years. ## Contributing Issues and Patches should be submitted via github and include detail descriptions of the issue being addressed as well as any documentation updates that would be needed with the change. motion-release-4.6.0/configure.ac000066400000000000000000000435251452402535500167500ustar00rootroot00000000000000AC_INIT(motion, esyscmd(['./scripts/version.sh'])) AM_INIT_AUTOMAKE([subdir-objects foreign]) AM_MAINTAINER_MODE([enable]) AC_PROG_CC AC_PROG_CXX AC_GNU_SOURCE AC_CONFIG_HEADERS([config.h]) AC_CONFIG_SRCDIR([src/motion.c]) AC_CANONICAL_HOST AC_CONFIG_MACRO_DIR([m4]) AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT_VERSION([0.19]) ############################################################################## ### Check additional system headers ############################################################################## AC_CHECK_HEADERS(stdio.h stdlib.h sys/time.h sys/wait.h \ sys/ioctl.h sys/mman.h sys/param.h sys/socket.h stdarg.h \ fcntl.h time.h signal.h limits.h errno.h assert.h netdb.h \ ctype.h regex.h math.h locale.h dirent.h ctype.h \ arpa/inet.h netinet/in.h termios.h,,[ AC_MSG_ERROR([Required system headers do not exist.]) ] ) ############################################################################## ### Check pkg-config - Required. Needed to get lib paths/info ############################################################################## AC_CHECK_PROG([PKGCONFIG],[pkg-config],[yes],[no]) AS_IF([test "${PKGCONFIG}" = "no" ],[ AC_MSG_ERROR([Required package 'pkg-config' not found, please check motion_guide.html and install necessary dependencies.]) ] ) ############################################################################## ### Check pthread ############################################################################## AC_CHECK_HEADERS(pthread.h,,AC_MSG_ERROR([pthread is required.])) TEMP_CFLAGS="-D_THREAD_SAFE" LIBS="$LIBS -pthread " ############################################################################## ### Check JPG - Required. Needed for image processing ############################################################################## AS_IF([pkg-config libjpeg ], [ TEMP_CFLAGS="$TEMP_CFLAGS "`pkg-config --cflags libjpeg` TEMP_LIBS="$TEMP_LIBS "`pkg-config --libs libjpeg` ],[ TEMP_LIBS="$TEMP_LIBS -ljpeg" ] ) HOLD_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $TEMP_CFLAGS" AC_CHECK_HEADERS(setjmp.h jerror.h jpeglib.h,[JPGS="yes"],[JPGS="no"]) AC_MSG_CHECKING(jpg libraries) AC_MSG_RESULT($JPGS) AS_IF([test "${JPGS}" != "yes" ], [ AC_MSG_ERROR([Required jpeg headers not found, please check motion_guide.html and install necessary dependencies]) ] ) CFLAGS="$HOLD_CFLAGS" ############################################################################## ### Check libmicrohttpd - Required. Needed for stream/webcontrol ############################################################################## AS_IF([pkg-config libmicrohttpd ], [ TEMP_CFLAGS="$TEMP_CFLAGS "`pkg-config --cflags libmicrohttpd` TEMP_LIBS="$TEMP_LIBS "`pkg-config --libs libmicrohttpd` ],[ AC_MSG_ERROR([Required package libmicrohttpd-dev not found, please check motion_guide.html and install necessary dependencies]) ] ) HOLD_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $TEMP_CFLAGS" AC_CHECK_HEADERS(microhttpd.h,[MHTTP="yes"],[MHTTP="no"]) AC_MSG_CHECKING(libmicrohttpd libraries) AC_MSG_RESULT($MHTTP) AS_IF([test "${MHTTP}" != "yes" ], [ AC_MSG_ERROR([Required package libmicrohttpd-dev not found, please check motion_guide.html and install necessary dependencies]) ] ) CFLAGS="$HOLD_CFLAGS" ############################################################################## ### Check setting/getting thread names ############################################################################## AC_CHECK_HEADERS(pthread_np.h,[PTHREAD_NP="yes"],[PTHREAD_NP="no"]) AC_MSG_CHECKING([for pthread_setname_np]) AC_LINK_IFELSE( [AC_LANG_PROGRAM([#include ], [pthread_setname_np(pthread_self(), "name")]) ],[ AC_DEFINE([HAVE_PTHREAD_SETNAME_NP], [1], [Define if you have pthread_setname_np function.]) PTHREAD_SETNAME_NP="yes" AC_MSG_RESULT([yes]) ],[ PTHREAD_SETNAME_NP="no" AC_MSG_RESULT([no]) ] ) AC_MSG_CHECKING([for pthread_getname_np]) AC_LINK_IFELSE( [AC_LANG_PROGRAM([#include ], [pthread_getname_np(pthread_self(), NULL, 0)]) ],[ AC_DEFINE([HAVE_PTHREAD_GETNAME_NP], [1], [Define if you have pthread_getname_np function.]) PTHREAD_GETNAME_NP="yes" AC_MSG_RESULT([yes]) ],[ PTHREAD_GETNAME_NP="no" AC_MSG_RESULT([no]) ] ) ############################################################################## ### Check XSI strerror_r. Check for Linux/*BSD/Apple/MUSL variations ############################################################################## AC_MSG_CHECKING([for XSI strerror_r]) HOLD_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" AC_LINK_IFELSE( [AC_LANG_SOURCE[ #include #include int main(int argc, char** argv) { char buf[1024]; int ret = strerror_r(ENOMEM, buf, sizeof(buf)); return ret; }] ],[ AC_DEFINE([XSI_STRERROR_R], [1], [Define if you have XSI strerror_r function.]) XSI_STRERROR="yes" AC_MSG_RESULT([yes]) ],[ XSI_STRERROR="no" AC_MSG_RESULT([no]) ] ) CFLAGS="$HOLD_CFLAGS" ############################################################################### ### BKTR Video System - Optional ############################################################################### AC_ARG_WITH(bktr, AS_HELP_STRING([--without-bktr],[Disable bktr devices]), [BKTR="$withval"], [BKTR="yes"] ) AS_IF([test "${BKTR}" = "yes" ], [ AC_CHECK_HEADERS(dev/bktr/ioctl_meteor.h dev/bktr/ioctl_bt848.h,[BKTR="yes"],[BKTR="no"]) AS_IF([test "${BKTR}" = "no" ], [ AC_CHECK_HEADERS(dev/ic/bt8xx.h,[BKTR="yes"],[BKTR="no"]) ] ) AS_IF([test "${BKTR}" = "yes" ], [ AC_DEFINE([HAVE_BKTR], [1], [Define to 1 if BKTR is around]) ] ) ] ) ############################################################################### ### V4L2 Video System - Optional ############################################################################### AC_ARG_WITH(v4l2, AS_HELP_STRING([--without-v4l2],[Disable V4L2 devices]), [V4L2="$withval"], [V4L2="yes"] ) AS_IF([test "${V4L2}" = "yes" ], [ AC_CHECK_HEADERS(linux/videodev2.h sys/videoio.h,[V4L2="yes";break],[V4L2="no"]) AS_IF([test "${V4L2}" = "yes" ], [ AC_DEFINE([HAVE_V4L2], [1], [Define to 1 if V4L2 is around]) ] ) ] ) ############################################################################## ### Webp Image Format - Optional. ############################################################################## AC_ARG_WITH([webp], AS_HELP_STRING([--with-webp],[Compile with Webp image support]), [WEBP="$withval"], [WEBP="yes]" ) AS_IF([test "${WEBP}" = "yes" ], [ AC_MSG_CHECKING(for webp) AS_IF([pkg-config libwebpmux ], [ AC_MSG_RESULT(yes) AC_DEFINE([HAVE_WEBP], [1], [Define to 1 if WEBP is around]) TEMP_CFLAGS="$TEMP_CFLAGS "`pkg-config --cflags libwebpmux libwebp` TEMP_LIBS="$TEMP_LIBS "`pkg-config --libs libwebpmux libwebp` ],[ AC_MSG_RESULT(no) ] ) ] ) ############################################################################## ### raspberry pi mmal - Optional. ############################################################################## AC_ARG_WITH([mmal], AS_HELP_STRING([--with-mmal[=DIR]],[Compile with RasperryPi mmal camera support]), [MMAL="$withval"], [MMAL="yes"] ) AS_IF([test "${MMAL}" = "no"], [ AC_MSG_CHECKING(for MMAL) AC_MSG_RESULT(skipped) ],[ AC_MSG_CHECKING(MMAL pkg-config path) TEMP_PATH=$PKG_CONFIG_PATH AS_IF([test "${MMAL}" != "yes"], [ PKG_CONFIG_PATH=${MMAL}/lib/pkgconfig:$PKG_CONFIG_PATH MMAL="yes" ],[ PKG_CONFIG_PATH=.:/opt/vc/lib/pkgconfig ] ) export PKG_CONFIG_PATH AC_MSG_RESULT($PKG_CONFIG_PATH) AS_IF([pkg-config mmal], [ AC_CHECK_HEADERS(interface/vcos/vcos.h interface/mmal/mmal.h,,[MMAL="no"]) AC_MSG_CHECKING(for MMAL) AS_IF([test "${MMAL}" = "no"], [ AC_MSG_RESULT([no]) ],[ TEMP_CFLAGS="$TEMP_CFLAGS -Irasppicam "`pkg-config --cflags mmal` TEMP_LIBS="$TEMP_LIBS "`pkg-config --libs mmal`" -lvchostif " AC_MSG_RESULT([yes]) AC_DEFINE([HAVE_MMAL], [1], [Define to 1 if MMAL is around]) ]) ],[ AC_MSG_CHECKING(for MMAL) AC_MSG_RESULT([no]) MMAL="no" ]) PKG_CONFIG_PATH=$TEMP_PATH export PKG_CONFIG_PATH ] ) AM_CONDITIONAL([INC_MMAL_SRC],[test x${MMAL} = xyes]) ############################################################################## ### Check for ffmpeg - Optional. ############################################################################## FFMPEG_VER="--" AC_ARG_WITH([ffmpeg], AS_HELP_STRING([--with-ffmpeg[=DIR]],[Build with FFMPEG support]), [FFMPEG=$withval], [FFMPEG="yes"] ) AS_IF([test "${FFMPEG}" = "no"], [ AC_MSG_CHECKING(for FFmpeg) AC_MSG_RESULT(skipped) ],[ AC_MSG_CHECKING(FFmpeg pkg-config path) TEMP_PATH=$PKG_CONFIG_PATH AS_IF([test "${FFMPEG}" != "yes"], [ PKG_CONFIG_PATH=${FFMPEG}/lib/pkgconfig:$PKG_CONFIG_PATH FFMPEG="yes" ] ) export PKG_CONFIG_PATH AC_MSG_RESULT($PKG_CONFIG_PATH) FFMPEG_DEPS="libavutil libavformat libavcodec libswscale libavdevice" AC_MSG_CHECKING(for FFmpeg) AS_IF([pkg-config $FFMPEG_DEPS], [ FFMPEG_VER=`pkg-config --modversion libavformat` TEMP_CFLAGS="$TEMP_CFLAGS "`pkg-config --cflags $FFMPEG_DEPS` TEMP_LIBS="$TEMP_LIBS "`pkg-config --libs $FFMPEG_DEPS` AC_DEFINE([HAVE_FFMPEG], [1], [Define to 1 if FFMPEG is around]) AC_MSG_RESULT(yes) ],[ AC_MSG_RESULT(no) AC_MSG_ERROR([Required ffmpeg packages 'libavutil-dev libavformat-dev libavcodec-dev libswscale-dev libavdevice-dev' were not found. Please check motion_guide.html and install necessary dependencies or use the '--without-ffmpeg' configuration option.]) ] ) PKG_CONFIG_PATH=$TEMP_PATH export PKG_CONFIG_PATH ] ) ############################################################################## ### Check for MariaDB - Optional ############################################################################## AC_ARG_WITH(mariadb, AS_HELP_STRING([--with-mariadb[=DIR]],[Build with MariaDB support]), [MARIADB="$withval"], [MARIADB="yes"] ) AS_IF([test "${MARIADB}" = "no"], [ AC_MSG_CHECKING(for MariaDB) AC_MSG_RESULT(skipped) ],[ TEMP_PATH=$PKG_CONFIG_PATH AC_MSG_CHECKING(MariaDB pkg-config path) AS_IF([test "${MARIADB}" != "yes"], [ PKG_CONFIG_PATH=${MARIADB}/lib/pkgconfig:$PKG_CONFIG_PATH MARIADB="yes" ] ) export PKG_CONFIG_PATH AC_MSG_RESULT($PKG_CONFIG_PATH) AC_MSG_CHECKING(for MariaDB) AS_IF([pkg-config libmariadb], [ TEMP_CFLAGS="$TEMP_CFLAGS "`pkg-config --cflags libmariadb` TEMP_LIBS="$TEMP_LIBS "`pkg-config --libs libmariadb` AC_DEFINE([HAVE_MARIADB], [1], [Define to 1 if you have MariaDB support]) ],[ MARIADB="no" ] ) # Check for the old pkg name for MariaDB AS_IF([test "${MARIADB}" = "no"], [ AS_IF([pkg-config mariadb], [ TEMP_CFLAGS="$TEMP_CFLAGS "`pkg-config --cflags mariadb` TEMP_LIBS="$TEMP_LIBS "`pkg-config --libs mariadb` MARIADB="yes" AC_DEFINE([HAVE_MARIADB], [1], [Define to 1 if you have MariaDB support]) ]) ]) AC_MSG_RESULT([$MARIADB]) PKG_CONFIG_PATH=$TEMP_PATH export PKG_CONFIG_PATH ] ) ############################################################################## ### Check for MySQL - Optional ############################################################################## AC_ARG_WITH(mysql, AS_HELP_STRING([--with-mysql[=DIR]],[Build with MySQL support]), [MYSQL="$withval"], [MYSQL="yes"] ) AS_IF([test "${MYSQL}" = "no"], [ AC_MSG_CHECKING(for MySQL) AC_MSG_RESULT(skipped) ],[ TEMP_PATH=$PKG_CONFIG_PATH AC_MSG_CHECKING(MySQL pkg-config path) AS_IF([test "${MYSQL}" != "yes"], [ PKG_CONFIG_PATH=${MYSQL}/lib/pkgconfig:$PKG_CONFIG_PATH MYSQL="yes" ] ) export PKG_CONFIG_PATH AC_MSG_RESULT($PKG_CONFIG_PATH) AC_MSG_CHECKING(for MySQL) AS_IF([pkg-config mysqlclient], [ TEMP_CFLAGS="$TEMP_CFLAGS "`pkg-config --cflags mysqlclient` TEMP_LIBS="$TEMP_LIBS "`pkg-config --libs mysqlclient` AC_DEFINE([HAVE_MYSQL], [1], [Define to 1 if you have MySQL support]) ],[ MYSQL="no" ] ) AC_MSG_RESULT([$MYSQL]) PKG_CONFIG_PATH=$TEMP_PATH export PKG_CONFIG_PATH ] ) ############################################################################## ### Check for PostgreSQL - Optional ############################################################################## AC_ARG_WITH(pgsql, AS_HELP_STRING([--with-pgsql[=DIR]],[Build with PostgreSQL support]), [PGSQL="$withval"], [PGSQL="yes"] ) AS_IF([test "${PGSQL}" = "no"], [ AC_MSG_CHECKING(for PostgreSQL) AC_MSG_RESULT(skipped) ],[ TEMP_PATH=$PKG_CONFIG_PATH AC_MSG_CHECKING(PostgreSQL pkg-config path) AS_IF([test "${PGSQL}" != "yes"], [ PKG_CONFIG_PATH=${PGSQL}/lib/pkgconfig:$PKG_CONFIG_PATH PGSQL="yes" ] ) export PKG_CONFIG_PATH AC_MSG_RESULT($PKG_CONFIG_PATH) AC_MSG_CHECKING(for PostgreSQL) AS_IF([pkg-config libpq], [ TEMP_CFLAGS="$TEMP_CFLAGS "`pkg-config --cflags libpq` TEMP_LIBS="$TEMP_LIBS "`pkg-config --libs libpq` AC_DEFINE([HAVE_PGSQL], [1], [Define to 1 if you have PostgreSQL support]) ],[ PGSQL="no" ] ) AC_MSG_RESULT([$PGSQL]) PKG_CONFIG_PATH=$TEMP_PATH export PKG_CONFIG_PATH ] ) ############################################################################## ### Check for SQLITE3 - Optional ############################################################################## AC_ARG_WITH(sqlite3, AS_HELP_STRING([--without-sqlite3],[Disable sqlite3 support.]), [SQLITE3="$withval"], [SQLITE3="yes"] ) AS_IF([test "${SQLITE3}" = "no"], [ AC_MSG_CHECKING(for sqlite3) AC_MSG_RESULT(skipping) ],[ AC_CHECK_HEADERS(sqlite3.h, [ TEMP_CFLAGS="$TEMP_CFLAGS "`pkg-config --cflags sqlite3` TEMP_LIBS="$TEMP_LIBS "`pkg-config --libs sqlite3` AC_DEFINE([HAVE_SQLITE3], [1], [Define to 1 if you have SQLITE3 support]) ],[ SQLITE3="no" ] ) ] ) ############################################################################## ### Optimize compiler ############################################################################## AC_ARG_WITH([optimizecpu], AS_HELP_STRING([--without-optimizecpu], [Exclude autodetecting platform and cpu type. This will disable the compilation of gcc optimizing code by platform and cpu.]), [OPTIMIZECPU=$withval], [OPTIMIZECPU=no] ) AS_IF([test "${OPTIMIZECPU}" = "yes"], [ AS_IF([test -e "/proc/device-tree/model"], [ # explicit test for RPI3 as /proc/cpuinfo reports armv7 even though it is armv8 RPI3=`grep "Raspberry Pi 3 Model" /proc/device-tree/model` AS_IF([test "x${RPI3}" != "x"], [ TEMP_CFLAGS="$TEMP_CFLAGS -mcpu=cortex-a53 -mfpu=neon-fp-armv8" ] ) ] ) ] ) ############################################################################## ### Developer Flags ############################################################################## AC_ARG_WITH([developer-flags], AS_HELP_STRING([--with-developer-flags], [Causes practically all of the possible gcc warning flags to be set. This may produce a large amount of warnings.]), [DEVELOPER_FLAGS=$withval], [DEVELOPER_FLAGS=no]) AS_IF([test "${DEVELOPER_FLAGS}" = "yes"], [ TEMP_CFLAGS="$TEMP_CFLAGS -W -Werror -Wall -Wextra -Wformat -Wshadow -Wpointer-arith -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wredundant-decls -Wno-long-long -ggdb -g3" ] ) ############################################################################## ### Prototype Flags ### mysql and mariadb have upstream prototype errors so remove that check ############################################################################## AC_ARG_WITH([prototype-flags], AS_HELP_STRING([--with-prototype-flags], [Causes practically all of the possible gcc warning flags to be set except missing prototypes.]), [PROTOTYPE_FLAGS=$withval], [PROTOTYPE_FLAGS=no]) AS_IF([test "${PROTOTYPE_FLAGS}" = "yes"], [ TEMP_CFLAGS="$TEMP_CFLAGS -W -Werror -Wall -Wextra -Wformat -Wshadow -Wpointer-arith -Wwrite-strings -Waggregate-return -Wnested-externs -Winline -Wredundant-decls -Wno-long-long -ggdb -g3" ] ) AC_SUBST(AM_CFLAGS, "$TEMP_CFLAGS") LIBS="$LIBS $TEMP_LIBS" AC_SUBST(AM_LDFLAGS, "$TEMP_LDFLAGS") AC_CONFIG_FILES([ Makefile src/Makefile po/Makefile.in data/camera1-dist.conf data/camera2-dist.conf data/camera3-dist.conf data/camera4-dist.conf data/motion-dist.conf data/motion.service ]) AC_ARG_VAR([KILL],[the 'kill' program to use to send signals to motion]) AC_PATH_PROG([KILL],[kill],['/bin/kill']) AC_OUTPUT ############################################################################## ### Report results to user ############################################################################## echo "" echo " **************************" echo " Configure status " echo " ${PACKAGE_NAME} ${PACKAGE_VERSION}" echo " **************************" echo echo "CFLAGS: $TEMP_CFLAGS $CFLAGS" echo echo "LIBS: $LIBS" echo echo "LDFLAGS: $TEMP_LDFLAGS $LDFLAGS" echo echo echo "OS : $host_os" echo "pthread_np : $PTHREAD_NP" echo "pthread_setname_np : $PTHREAD_SETNAME_NP" echo "pthread_getname_np : $PTHREAD_GETNAME_NP" echo "XSI error : $XSI_STRERROR" echo "webp support : $WEBP" echo "V4L2 support : $V4L2" echo "BKTR support : $BKTR" echo "MMAL support : $MMAL" echo "FFmpeg support : $FFMPEG" echo "libavformat version : $FFMPEG_VER" echo "SQLite3 support : $SQLITE3" echo "MYSQL support : $MYSQL" echo "PostgreSQL support : $PGSQL" echo "MariaDB support : $MARIADB" echo echo "Install prefix: $prefix" echo motion-release-4.6.0/data/000077500000000000000000000000001452402535500153625ustar00rootroot00000000000000motion-release-4.6.0/data/camera1-dist.conf.in000066400000000000000000000013561452402535500211150ustar00rootroot00000000000000# @prefix@/etc/motion/camera1.conf # # This config file was generated by @PACKAGE_NAME@ @PACKAGE_VERSION@ ########################################################### # Configuration options specific to camera 1 ############################################################ # User defined name for the camera. camera_name MyCam1 # Numeric identifier for the camera. camera_id 101 # The full URL of the network camera stream. netcam_url rtsp://yourcamera1ip:port/camera/specific/url # Image width in pixels. width 1280 # Image height in pixels. height 720 # Text to be overlayed in the lower left corner of images text_left CAMERA 1 # File name(without extension) for movies relative to target directory movie_filename CAM01_%t-%v-%Y%m%d%H%M%S motion-release-4.6.0/data/camera2-dist.conf.in000066400000000000000000000015111452402535500211070ustar00rootroot00000000000000# @prefix@/etc/motion/camera2.conf # # This config file was generated by @PACKAGE_NAME@ @PACKAGE_VERSION@ ########################################################### # Configuration options specific to camera 2 ############################################################ # User defined name for the camera. camera_name Patio # Numeric identifier for the camera. camera_id 102 # The full URL of the network camera stream. netcam_url http://yourcamera2ip:port/camera/specific/url # Image width in pixels. width 352 # Image height in pixels. height 288 # Text to be overlayed in the lower left corner of images text_left Camera2 # Text to be overlayed in the lower right corner of images. text_right Patio\n%Y-%m-%d\n%T-%q # File name(without extension) for movies relative to target directory movie_filename CAM02_%t-%v-%Y%m%d%H%M%S motion-release-4.6.0/data/camera3-dist.conf.in000066400000000000000000000016111452402535500211110ustar00rootroot00000000000000# @prefix@/etc/motion/camera3.conf # # This config file was generated by @PACKAGE_NAME@ @PACKAGE_VERSION@ ########################################################### # Configuration options specific to camera 3 ############################################################ # User defined name for the camera. camera_name Front Door # Numeric identifier for the camera. camera_id 103 # The full URL of the network camera stream. netcam_url rtmp://yourcamera3ip:port/camera/specific/url netcam_userpass myusername:mypassword # Image width in pixels. width 2048 # Image height in pixels. height 1536 # Text to be overlayed in the lower left corner of images text_left Camera3 # Text to be overlayed in the lower right corner of images. text_right FrontDoor\n%Y-%m-%d\n%T-%q text_scale 4 # File name(without extension) for movies relative to target directory movie_filename CAM03_%t-%v-%Y%m%d%H%M%S motion-release-4.6.0/data/camera4-dist.conf.in000066400000000000000000000014661452402535500211220ustar00rootroot00000000000000# @prefix@/etc/motion/camera4.conf # # This config file was generated by @PACKAGE_NAME@ @PACKAGE_VERSION@ ########################################################### # Configuration options specific to camera 4 ############################################################ # User defined name for the camera. camera_name Server room # Numeric identifier for the camera. camera_id 104 # Video device (e.g. /dev/video0) to be used for capturing. video_device /dev/video0 # Image width in pixels. width 640 # Image height in pixels. height 480 # Text to be overlayed in the lower left corner of images text_left # Text to be overlayed in the lower right corner of images. text_right Camera4\n%Y-%m-%d\n%T-%q # File name(without extension) for movies relative to target directory movie_filename CAM04_%t-%v-%Y%m%d%H%M%Smotion-release-4.6.0/data/motion-dist.conf.in000066400000000000000000000121121452402535500211010ustar00rootroot00000000000000# Rename this distribution example file to motion.conf # # This config file was generated by @PACKAGE_NAME@ @PACKAGE_VERSION@ # Documentation: @prefix@/share/doc/motion/motion_guide.html # # This file contains only the basic configuration options to get a # system working. There are many more options available. Please # consult the documentation for the complete list of all options. # ############################################################ # System control configuration parameters ############################################################ # Start in daemon (background) mode and release terminal. daemon off # Start in Setup-Mode, daemon disabled. setup_mode off # File to store the process ID. ; pid_file value # File to write logs messages into. If not defined stderr and syslog is used. ; log_file value # Level of log messages [1..9] (EMG, ALR, CRT, ERR, WRN, NTC, INF, DBG, ALL). log_level 6 # Target directory for pictures, snapshots and movies ; target_dir value # Video device (e.g. /dev/video0) to be used for capturing. video_device /dev/video0 # Parameters to control video device. See motion_guide.html ; video_params value # The full URL of the network camera stream. ; netcam_url value # Name of mmal camera (e.g. vc.ril.camera for pi camera). ; mmalcam_name value # Camera control parameters (see raspivid/raspistill tool documentation) ; mmalcam_params value ############################################################ # Image Processing configuration parameters ############################################################ # Image width in pixels. width 640 # Image height in pixels. height 480 # Maximum number of frames to be captured per second. framerate 15 # Text to be overlayed in the lower left corner of images text_left CAMERA1 # Text to be overlayed in the lower right corner of images. text_right %Y-%m-%d\n%T-%q ############################################################ # Motion detection configuration parameters ############################################################ # Always save pictures and movies even if there was no motion. emulate_motion off # Threshold for number of changed pixels that triggers motion. threshold 1500 # Noise threshold for the motion detection. ; noise_level 32 # Despeckle the image using (E/e)rode or (D/d)ilate or (l)abel. despeckle_filter EedDl # Number of images that must contain motion to trigger an event. minimum_motion_frames 1 # Gap in seconds of no motion detected that triggers the end of an event. event_gap 60 # The number of pre-captured (buffered) pictures from before motion. pre_capture 3 # Number of frames to capture after motion is no longer detected. post_capture 0 ############################################################ # Script execution configuration parameters ############################################################ # Command to be executed when an event starts. ; on_event_start value # Command to be executed when an event ends. ; on_event_end value # Command to be executed when a movie file is closed. ; on_movie_end value ############################################################ # Picture output configuration parameters ############################################################ # Output pictures when motion is detected picture_output off # File name(without extension) for pictures relative to target directory picture_filename %Y%m%d%H%M%S-%q ############################################################ # Movie output configuration parameters ############################################################ # Create movies of motion events. movie_output on # Maximum length of movie in seconds. movie_max_time 60 # The encoding quality of the movie. (0=use bitrate. 1=worst quality, 100=best) movie_quality 45 # Container/Codec to used for the movie. See motion_guide.html movie_codec mkv # File name(without extension) for movies relative to target directory movie_filename %t-%v-%Y%m%d%H%M%S ############################################################ # Webcontrol configuration parameters ############################################################ # Port number used for the webcontrol. webcontrol_port 8080 # Restrict webcontrol connections to the localhost. webcontrol_localhost on # Type of configuration options to allow via the webcontrol. webcontrol_parms 0 ############################################################ # Live stream configuration parameters ############################################################ # The port number for the live stream. stream_port 8081 # Restrict stream connections to the localhost. stream_localhost on ############################################################## # Camera config files - One for each camera. ############################################################## ; camera @prefix@/etc/motion/camera1.conf ; camera @prefix@/etc/motion/camera2.conf ; camera @prefix@/etc/motion/camera3.conf ; camera @prefix@/etc/motion/camera4.conf ############################################################## # Directory to read '.conf' files for cameras. ############################################################## ; camera_dir @prefix@/etc/motion/conf.d motion-release-4.6.0/data/motion.service.in000066400000000000000000000051261452402535500206620ustar00rootroot00000000000000# # This systemd unit file is part of the motion project: # # https://motion-project.github.io/ # # This program is free software: you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # 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 Lesser General Public # License along with this program. If not, see # # [Unit] Description=Motion - monitor live video, trigger responses, record video/stills. Documentation=man:motion(1) After=local-fs.target network.target [Service] User=motion EnvironmentFile=-/etc/default/motion # The the sleep on the following line is needed with systemd version # 232, otherwise the error message that we echo doesn't hit 'systemctl # status'. ExecStart=/bin/sh -c '([ -r "/etc/default/motion" ] && [ "x$start_motion_daemon" != "xyes" ]) && echo "Not starting motion because start_motion_daemon=$start_motion_daemon - check /etc/default/motion" && sleep 1 && exit 78 ; exec @BIN_PATH@/motion -n' Type=simple # Set StandardError=journal to use journald to log messages from motion. # See also the "log_file" config file option in motion(1) and # systemd.service(5). StandardError=null ExecReload=@KILL@ -HUP $MAINPID Restart=on-failure RestartSec=5 # Don't restart if unconfigured / misconfigured e.g. daemon disabled # in defaults file. See also /usr/include/sysexits.h or sysexits(3) RestartPreventExitStatus=78 # To tune restart behaviour, see systemd.unit(5) and use # "systemctl edit motion" to change the following settings: #StartLimitBurst= #StartLimitIntervalSec= #StartLimitAction= #FailureAction= # The following can be used to increase the security of the # installation, by mitigating risk from attacks on motion and the # binaries, libraries and scripts which it relies on. They are disabled # by default in case they break existing installations, e.g. those which # call site-local scripts which would inherit the same restrictions. # # See systemd.exec(5) and # http://0pointer.net/public/systemd-nluug-2014.pdf for more details # of these and other related options. # # Use "systemctl edit motion" to change these settings. #PrivateTmp=true #NoNewPrivileges=yes #PrivateNetwork=yes #ProtectHome=yes #DeviceAllow=/dev/video0 #MountFlags=slave #SystemCallFilter= [Install] WantedBy=multi-user.target motion-release-4.6.0/doc/000077500000000000000000000000001452402535500152165ustar00rootroot00000000000000motion-release-4.6.0/doc/CHANGELOG000066400000000000000000004336541452402535500164470ustar00rootroot00000000000000Summary of changes for version 4.6.0 are below * Documentation updates * Fix segfault on vaapi decoding * Add support for DRM HW decode * Remove default for allowed_media_types * Fix libweb includes * Fix autotools and translation files * Update documentation on libcamerify * Fix movie_extpipe * Fix threshold_tune * Add pragma for mmal code * Update year in copyright notice * Revise issue template * Allow for bad packets when processing file * Implement consistent time values * Implement consistent calculation for pixel difference * Fix compiler warnings * Revise ioctl for devices to use long variable * Print log message of signals Summary of changes for version 4.5.1 are below * Improve closing of v4l2 devices * Fix creation of pid_file * Add header check for mmal * Fix pause when used as command line option * Fix json pages when multiple cameras used * Fix codec for movie_codec for mpeg4 * Fix rotation for v4l2 devices Summary of changes for version 4.5.0 are below * Do not translate the ignoring IP alert message * Fix processing for native_language config option * Add additional sleep time for images to web stream * Revise log level for some messages * Update translations * Update for new MariaDB pkg-config name * Fix cleanup when v4l2 open fails * Remove unused include module. * Remove unused H264 palette code * Fix sending of stale images to stream * Revise path when checking headers * Fix double free when using extpipe. * Revise issue template * Eliminate shared handle for sqlite3 * Fix setting of controls for v4l2 devices * Fix processing for v4l2 devices when stride is not width * Replace dbeventid with eventid * Fix parsing of PGM files * Fix scale of text when in debug mode * Fix processing when camera is not initially available * Fix double free when camera is lost frequently. * Fix close on exec methods * Fix processing for preferred codec with new ffmpeg versions * Fix snapshots when using netcam high * Enhance netcam processing for single jpg pages * Update instructions on using libcamerify for pi camera * Update instructions on maximum number of cameras shown on web control page. * Expand buffer for log messages * Update japanese translations. * Fix extra event triggered upon quit Summary of changes for version 4.4.0 are below * Add limit on attempts to get image from camera * Add limit on failed authentication attempts * Adjust copyright to 2021 * Fix for urls provided without port number * Fix the workaround for the exif creation. * Add parameter to start camera paused * Fix to avoid potential deadlocks * Update permissions assigned for created directories * Update parameter in the sample configuration files * Remove restrictions on network camera protocols * Change default for http processing to ffmpeg. * Update build documents for MacOSX * Update documents on PGM requirements * Fix for latest version of FFMPEG * Fix for movie_max_time * Fix processing for gray scale network cameras * Add dbeventid for PostgreSQL * Add GPL license file. * Add json pages * Update for new MHD return codes * Simplify image ring processing * Update travis testing file. * Use high resolution for snapshots if available. * Add grey picture output option. * Fix web stream content size * Update documentation * Enhance the processing for the params * Change automake check to maintainer-check * Add new modules for dbse and util * Remove use of ATTRIBUTE_UNUSED * Adjust module headers comments * Implement mystr functions * Adjust default capture_rate * Use new params for the bktr and video * Implement consistent use of braces {} * Add support for cuda HW decoding of network cameras * Remove MD5 module since no longer used. * Implement consistent indentations * Implement MYFFVER for easier condition testing * Add netcam_params to specify items for network camera * Revise parameter names * Use MHD function for url decoding * Fix scaling text calculations * Fix end events criteria * Add param for netcam rate high * Remove old stream module. * Add vaapi decoding for network cameras * Allow lightswitch value of 1 percent * Add parameter for network capture rate * Fix the content-type header * Update copyright to 2020 * Guide update * Fix MySQL/MariaDB init/definitions * Fix CFLAGS/LDFLAGS * Fix build for gcc 10 Summary of changes for version 4.3.2 are below * Revise to use MHD function for url decode * Update travis distribution testing * Eliminate compiler warnings on unsigned comparisons * Eliminate compiler warnings on MHD return codes Summary of changes for version 4.3.1 are below * Compiler errors with GCC 10 * Overrides to CFLAGS * Add maintainer mode * Segfault when invalid camera directory specified * MariaDB initializations * Updated guide Summary of changes for version 4.3.0 are below * Implement default for non ascii characters * Removed poll requirement for MHD * Updated translations * Revise directory structure, autotools, makefile * Revised tesing for travis * Updated MMAL camera * Optional processing for OMX * Fix movie start times * Optional h264_v4l2m2m * set fps on v4l2 devices. * Option for videoio.h * JPEG code clean up * Fix substrem processing for non modulo 16 * Ignore invalid data sent from cameras. * Adjust the netcam handler wait and processing * Answer incorrect web requests. * Implement delay upon reconnect * Fix filetype specified for snapshots * Enhancements the service file. * Output to log the ext pipe command * Documentation fix for minimum_frame_time * Documentation clarification for lightswitch * Documentation fix for colon versus semi-colon * Fix vbr calculations for high frame rates Summary of changes for version 4.2.2 are below * Update version number to 4.2.2/Changelog * Resolve compile problem for OpenBSD * Resolve compiler warnings for 18.10 * Guide/Manual updates * Add the quit/end webcontrol actions to interface 0 * Set the stream index on passthrough * Revise the webcontrol stream rate * Answer webcontrol stream only after completing first loop * Save the preview images when triggering emulate * Fix startup problem when using track_type 4 * Fix hostname for webcontrol when using IPV6 Summary of changes for version 4.2.1 are below * Update version number to 4.2.1 / Changelog * Report to log options included in build * Add log messages on database actions(tosiara) * Revise log messages of port used for stream * Revise log messages when using v4l2 via netcam * Fix null terminator on EXIF of jpgs(tosiara) * Fix build with static libs for webp(Fabrice) * Guide update for initial setup. * Prevent webcontrol update of movie_passthrough * Remove confusing log message * Fix motion detection when using privacy mask * Correct thread locking for movie_passthrough * Revise guide for better mobile viewing * Revise additional stream timing * Fix stream timing(adameat) * Remove obsolete function reference * Change version number to 4.2+git Summary of Changes for version 4.2 are below * html fixes for legacy interface * Fix typo in guide * Workaround compiler warnings on system header HAVE_STDLIB_H * Update motion guide * Revise timing and multiple threads for streams * Update translations * Add debian for travis tests * Regression for configuration write * Add threshold_maximum configuration option * Add legacy webcontrol interface * Remove legacy substream option * Revert mjpg and static jpg as sources * Fix boundary string placement in the streams * Eliminate log message on invalid frame type with movies * Add event_start, event_end as webcontrol actions. * Correct message on failed camera connection retry * Allow conversion specifiers for track_generic * Add wait for netcam handler loop * Maintain history of generic tracking moves for 'center' requests * Resolve sqlite3 = NULL after Watchdog timeout * Add additional stream preview options to web interface * Regression fix for mmal camera framerate * Add static movie file processing via netcam_url * Depreciate mjpg format for netcam_url * Revise configuration option names and which are included in templates. * Fix corrupted images for ppm output formats (tosiara) * Edit and validate height/width provided from config parameters. * Whitespace revisions. * Implement libmicrohttpd to provide streams and webcontrol * Additional fix for 422p format conversion.(tosiara) * Image conversion from 422p format * Fix preferred codec selection in ffmpeg. * Check for invalid camera dimensions * Revision to handle ffmpeg version 4.0 * Revise packet locking for ffmpeg passthrough * Guide update for default on output_pictures(Perelandric) * Fix webcontrol for single camera via motion.conf (Matt Schatz) * Add error return when msgfmt fails. * Fix translation error (Perelandric) * Fix logging messages (Perelandric) * Add some french translations.(Sébastien VACHER) * Fix the regex for v4l2 via netcam. * Add config option for stream_grey * Refactor main() to call functions instead and watchdog the netcam threads * Update travis testing for 18.04 * Add native_language option and additional languages * Add close on exec for files(tosiara) * Revise status and get webcontrol for text interface. * ffmpeg 4.0 depreciation warnings. * Webcontrol edit checks on thread number (Matt Schatz) * Update german translations.(Uatschitchun) * Fix memory leak when using camera_dir(genius3000) * Report to log a warning when using high framerates with mmal * Revise the webcontrol interface fonts. * Add config options for lightswitch_frames (genius3000) * Use a #DEFINE for specifying sizes of memory of webcontrol variables * Initiate translations * Implement translations via gettext * Relocate the preview_save to the event module * Add sql_query_stop configuration option. (sander1234567890) * Corrections to webcontrol html interface (genius3000) * Corrections to the contributing templates (genius3000) * Revise watchdog and time function in netcam_rtsp.c * Additional code comments for webu.c (tosiara) * Updated lithuanian translations(tosiara) * Add swedish translations.(Jony) * Replace webhttpd module with new webcontrol interface and modules * Fix build errors with ffmpeg 4.0 (James Cowgill) * Remove checks in code for v4l1 pixel format. * Revise output_picture best for high resolution * Validate text_scale is a valid value * Depreciate macro for assigning pthread name * Regression fix for long jump in jpegutils.c (void-user) * Fix parameter criteria for autobrightness * Regression fixes for vid_control_params (genius3000) * Add config option for user to provide CORS header for streams.(jackxbritton) * Add text_scale option (jackxbritton) * Add track_generic_move for track_generic option (christophe-lohr) * Copy depreciated parameters for v4l2 devices * Revise webhttpd html header(Andrea Cioni) * Updated build instructions for MacOSX (Alistair McMillan) * Resolve segfault with netcam_highres startup. * Update guide with correct conversion specifiers. * Refactor video_v4l2/bktr and add config option vid_control_params * Remove 17.04 from travis tests * Manual update for typo (Christian G. Warden) * Update documentation for %{ver} and %{host} specifier * Revise %{host} and add %{ver} (tosiara) * Update for passthrough processing of cameras * Updated motion_guide.html * Revise webcontrol page to indicate the webcontrol_parms selection * Validate v4l2 parms when using v4l2 via netcam * Capture images at start to prevent immediate events * Initialize thread number to eliminate inaccurate log notice. * Allow URLS with underscores * Fix message when selecting UDP transport * Add passthrough recording for rtsp cameras. * Remove default SQL (which was specific to Maria) * Default webp image type to be included in builds. * Include EXIF for webp images. * Report to log when user specifies invalid URL. * Update guide that is installed locally. * Updated version script to include date and dirty vs clean. Version 4.1.1 Changes Below * Fix file name for debug movies * Fix image saving when using highres option * Add error checking of jpeg decompression. * Fix version script for old distributions. * Fix building on musl based systems. Version 4.1 Changes Below * Add flip_axis option * Add mask_privacy option * Add netcam_highres option * Add on_camera_found option * Add substream_port option * Add webcontrol_parms option * Rename ffmpeg_timelapse to timelapse_interval * Rename ffmpeg_timelapse_mode to timelapse_mode * Add timelapse_fps option * Add timelapse_codec option * Remove sdl_threadnr option * Remove v4l1 functionality * Add support for RTMP and additional v4l2 palette options * Add support for network cameras on macOSX * Add additional conversion specifiers * Add flood control for Motion log * Demote the ffmpeg log messages to INF level. * Additional reporting of configuration parms at the INF log level. * Remove debug messages at every frame * Report to log the IP of failed authentication attempts * Add option for output of images in WEBP format(via build option) * Added webcam on FreeBSD functionality/instructions. * Added functionality for v4l2 devices via the netcam modules * Refactoring of code for v4l2, netcam_rtsp, motion_loop, ffmpeg, configure.ac to assist future development. * Fix movie playback issues with timestamps. * Updated motion_guide.html, motion.1 documentation Version 4.0 Changes Below * PI Cam Support * Web Interface fixes for preview, IPV6, HTML * Allow for resize of mask file to match image * FFMPEG Revisions (3.0, reporting of messages, FPS, timelapse) * Fix image corruptions across threads * Documentation updates to guide, manual, reference images. * Add camera_name, camera_id, camera_dir options * Configuration fixes (Pi3, JPeg Turbo, SDL, Fedora, BSD, systemd) * travis build testing * remove unused files(pwc-ioctl****.h, README.Axis) * ffmpeg_variable_bitrate to values of 0-100 and ffmpeg fixes * Better messages for pkg-config * Fix timelapse crash when selecting mpeg4 Version 3.4.1 Changes Below * Added suggestion for including pkgconf as part of build requirements * Swap sequence of user ffmpeg path and PKG_CONFIG_PATH * Allow : in non standard locations of netcam_url path. * Eliminated the use of coded_frame (Was a redundant assignment) * Revise HEVC to use H264 for older ffmpeg * Add HEVC codec option for newer ffmpeg (momo-i) * Makefile changes to align with Debian package and fixes from previous changes * Revise description for netcam_url in configuration file. * Change default for ffmpeg in configure.ac (Issue 795002,82) To compile without ffmpeg now requires --without-ffmpeg option * Change prefix to use sysconfdir instead. Install threadX.conf files to threadx-dist.conf * Revise configure.ac to use pkg-config for ffmpeg(Rex Feany) * Revise PIX_FMT to be able to use older ffmpeg versions. * Revise PIX_FMT for newer ffmpeg(Rex Feany) * Add patch for ports on proxy netcams from GVautier (issue 144906) * Add patch from JonGuess(issue 151452) for treatment of partial netcam images. * Consolidate the Sqlite3 options into the code standard. * Draft revised motion_guide.html with new options. * Revise manual to have current options. * Tab/Space cleanup and validation security issue addressed. (issue 071831) * Add preview to webcontrol page(issue 172526) * Additional container fixes(requests/bugs 201900,110304,001656,050731) * Remove depreciated deinterlace option * Remove avformat_network_init call. Call was not needed and was leaking memory * Add extra container options for ffmpeg videos * Remove extra bytes before SOI marker on netcam images. * Updated handling of lastsnap to permit subdirectory specification. * Handle MJPEG streams from some Logitech webcams which send AVI1 instead of JFIF. * Fix missing header for some builds(Jim Dodgen) * Sqlite3 revisions (Jim Dodgen) * Add new config options to the motion-dist.conf * Allow text format specifiers to take a width like printf would. (David Fries) * Allow text format specifiers to take a width like printf would. (David Fries) * Add power_line_frequency configuration item to improve image quality. (David Fries) * Fix webhttpd race condition crash with SIGHUP, add it to running thread counter (David Fries) * Fix the GOP size for the created videos * Fix netcam ftp functionality * Fix Typo on the log level * Fixed the network ftp image option. * Lock thread on ffmpeg/libav init and open_codec * Revise version number generated by script to indicate Unofficial-Git-'hash' * Revised Changelog description for version 3.4 * Merge OpenBSD fixes from sthen pull request * Revised picture.c to allow for modulo 8 pictures and adjusted netcam modules accordingly as well.(closes 135313) * Changes to ffmpeg.h/ffmpeg.c to allow for compiling without ffmpeg/libav or with older versions. * Merge mymalloc, free and casting changes from Alfred Klomp * Merge bug fix for sizeof from Alfred Klomp * Rewrote timelapse so that it works(closes 180501) * Merge tosiara changes for version number * Add copyright file for features added since 3.2.12 * Cleanup ffmpeg.c and plug memory leak * Add support for latest version of ffmpeg/libav * Tidy up packaging changes * Add packaging fixes (infinity0) * Revise version.sh to put out the git commit. * Rollback revision to allow for a formal pull request. * Reimplement changes not to be included in pull request from tosiara commit 9ebee031 * Implement requirement of modulo 16 to avoid seg fault when opening stream * Add debian build files from trusty(14.04) * Revise default values for motion.conf * Revise CHANGELOG to conform with debian format * Revised debian packaging files * Implement new sequence for this file (CHANGELOG) newest to oldest. Summary of Changes that were proposed to maintainer for a version 3.4 Features * Insert Blanking frames http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2007x12x16x132522 (Dag Erlandsson) * IPV6 for http-control and webcam stream not netcam yet http://www.lavrsen.dk/twiki/bin/view/Motion/IPv6 (Jeroen Massar & Angel Carpintero) * Experimental approach for MJPEG streams (Motion JPEG) for network cameras http://www.lavrsen.dk/twiki/bin/view/Motion/LinksysWVC200SupportPatch ( ... ) * Add draw a RED box around the movement as default (Joerg Weber) * Add write/read nonblock functions in webhttpd( timeout on read/write). (Angel Carpintero) * More changes in option names from http://www.lavrsen.dk/twiki/bin/view/Motion/IntuitiveOptionNamesDiscussion (Angel Carpintero) * motion_locate new parameter names : red , center , redcross instead of only on, off. (Angel Carpintero) * External pipe to allow external video encoders http://www.lavrsen.dk/twiki/bin/view/Motion/DarkwindHackeronMotionPatching (Bill Payne, Angel Carpintero) * Split locate_motion into separate 'mode' and 'style' option to allow all possible combinations. (Joerg Weber) * Implement 'gapless' event mode to allow for recording of movies without 'holes'. (Joerg Weber) * Limit detection rate to 3fps at framerates above 5fps, to reduce CPU load. (Joerg Weber) * Fix warning for syslog() , Added support for some new bayer palettes introduced in kernel 2.6.27. http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2008x10x15x130110 Increased buffer in ffmpeg to allow encoding at 1600x1200 (Angel Carpintero) * Sqlite3 support http://www.lavrsen.dk/twiki/bin/view/Motion/SQLite3Patch (Giacomo Graziosi) * New RPM SPEC file and startup scripts compliant with Fedora 10 guidelines and above (Steven Moix) * Increase write buffer size for writing image files and ffmpegs http://www.lavrsen.dk/foswiki/bin/view/Motion/MotionWriteBuffersPatch (Craig West) * Fixed mask overlay in setup mode is now green instead of white (Joerg Weber) * Add new config option 'ipv6_enabled' to enable/disable IPV6 (Angel Carpintero) * Remove VIDIOC_S_JPEGCOMP support is deprecated. (Angel Carpintero) * Use static memory allocation in ffmpeg_deinterlace() (Peter Holik) http://www.lavrsen.dk/foswiki/bin/view/Motion/FfmpegDeinterlaceStatic * Atom optimizacion in configure.in (Peter Holik) http://www.lavrsen.dk/foswiki/bin/view/Motion/AtomOptimizations * Allow to change Standard method ( PAL / NECAM / SECAM ) (Angel Carpintero) * Add authentication methods 'Basic Authentication' and 'Digest Authentication' to the "Live Stream Server". (Michael Finsterbusch) http://www.lavrsen.dk/foswiki/bin/view/Motion/MotionStreamAuthPatch * Implemented new logging system http://www.lavrsen.dk/foswiki/bin/view/Motion/MotionLog (Angel Carpintero) * Added a macro MOTION_LOG , no need to add __FUNCTION__ anymore. (Angel Carpintero) * Added EXIF feature for jpeg images , http://www.lavrsen.dk/foswiki/bin/view/Motion/ExifTaggingPatch (Wim Lewis) * Improve detection of av_register_protocol() for ffmpeg (Angel Carpintero). * Added support for libjpeg-turbo http://www.lavrsen.dk/foswiki/bin/view/Motion/FeatureRequest2010x04x14x082244 (Angel Carpintero) * Added new log type COR , to filter messages from CORE. (Angel Carpintero) * Added a new starting option -m to disable motion detection. (Angel Carpintero) * Allow image dimension not 4:3 changing a check of modulo 16 by modulo 8. (Jeroen Massar) * Added codec Ogg/Theora as new output format for regular movies. http://www.lavrsen.dk/foswiki/bin/view/Motion/OggTimelapse (Michael Luich) * Added support for ffmpeg 0.11 new API. * Added RSTP support for netcam ( merge https://github.com/hyperbolic2346/motion ) * Merge tosiara/rtsp branch (commit 46cfcf31d, 2014/05/21) (Mr-Dave) * 3fps bugfix from SVN rev559 (tosiara, Joerg Weber) * Buffer overflow vulnerabilities (hyperbolic2346) * Redundand -- boundary prefix (torao) * Removed compiler warnings: (Mr-Dave) logger.c,jpegutils.c,netcam_ftp.c,track.c, picture.c,webhttpd.c,stream.c,ffmpeg.c * Bug fix as part of warnings in webhttpd.c fixed(Mr-Dave) * Removed compiler warning regarding ffmpeg being newer than 0.4 version(Mr-Dave) * New configure script and identification of ffmpeg version and additional libs. (Mr-Dave) * Resolve additional compiler warnings in ffmpeg (Mr-Dave) * Revised INSTALL with samples(Mr-Dave) * Revisions for RTSP and code standard.(Mr-Dave) * Plugged most memory leaks in RTSP. (Mr-Dave) * Undo changes caused by code editor and other unnecessary changes (Mr-Dave) * Moved call to netcam_shutdown_rtsp into netcam_cleanup where it belongs. (Mr-Dave) * Regession fix for memory leaks and reconnection (Mr-Dave) * Eliminated requirement to manually build FFMPEG for RTSP support. (Mr-Dave) * Revised RTSP to support version 53 of libavformat (Mr-Dave) * Revised FFMPEG.c to eliminate warnings and functions no longer supported by Libav/FFMPEG(Mr-Dave) * Revised INSTALL to have sample PI configure option.(Mr-Dave) * Revised configure.ac to generate compiler flag AVFMT_V53.(Mr-Dave) * Revised INSTALL to indicate standard APT packages for RTSP (Mr-Dave) * Revised configure.ac to recognize libavformat version 54 RTSP (Mr-Dave) * Clean up the messaging for RTSP. * Additional validations for RTSP connection and corrected free sequences * Removed seg fault on failure to open first image, comments, isolation of RTSP * Add AC_GNU_SOURCE macro to check for GNU C Library, fix compile when no FFMpeg. * Implement inits of AV functions from bcl fork * Add gray image upon disconnection * Added tcp/udp transport config option from hyperbolic2346(commit 423ef7bb3) * Revised comments to be in line with application standard. * Restructure rtsp to handle rescaling and non YUV420 format, rotate, MJPEG input format Bugfixes * Avoid segfault detecting strerror_r() version GNU or SUSv3. (Angel Carpintero) * Fix Segfault on reload or quit for vloopback (maybe other v4l1 devices too) (Peter Holik) http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2009x06x17x090603 * Allow compile with NetBSD and make LP64 compliant video_freebsd.c (Andreas Wrede) * Avoid compile vloopback in BSD (Angel Carpintero) * V4L2 fourcc GRBG not supported, updated default value for v4l2_palette 17. (Isaac Richter) http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2009x10x29x222753 * Exit when image dimension are not modulo 16. (Angel Carpintero) * Avoid logs flooding using some options of netcam_keepalive and try to discard images with weird header Content-Lenght 0. (Angel Carpintero) * Only use post capture when we setup to record videos with external pipe or ffmpeg. (Angel Carpintero) * Fix introduced bug for Content-Lenght = 0 in svn r476. (Angel Carpintero) * Avoid segfault when motion cannot create a logfile. (Angel Carpintero) * No mysql_close http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2010x11x22x033859 * No PQfinish() (Angel Carpintero) * Input for webcams has to be set to -1 http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2011x01x21x162309 * Added a conditional check for avformat_alloc_context , av_avformat_alloc_context to fix http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2011x10x05x071936 (Angel Carpintero) * Fix issue with JPEG , adding dinfo.do_fancy_upsampling = FALSE; http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2011x08x20x194659 * Made micro-lightswitch optional (see lightwitch option in motion.conf) * Fixed help text for options event_gap and area_detect * Fixed motion.conf-dist , adding text according with config options. * Fixed a bug in post_capture. It was missed under certain conditions. * Fixed configure for SDL. * Replace malloc() by calloc(). (Jeroen Massar) * Free file descriptor buffers on exit. * Avoid segfault when text_left or text_right uses non supported chars. * Fixed leak in vloopback. * Fixed a build of motion for some kernel version with not good videodev.h * Netcam Modulo 8 3.2.12 Summary of Changes Bugfixes * Fixed name space clash with libjpeg8 (Kenneth Lavrsen) http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2010x01x22x084753 * Fixed FFV1 codec encode with ffmpeg (Angel Carpintero) http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2010x04x13x032553 * Fix conv_uyvyto420p segfault ( William M Brack ) * Enhancing the palette selection ( William M Brack ) * Fix zombies on OpenBSD. (Mark Feenstra) http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2010x04x28x054348 3.2.11.1 Summary of Changes Bugfixes * Fix Segfault on reload or quit for vloopback (maybe other v4l1 devices too) (Peter Holik) http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2009x06x17x090603 * Fix fd leaks in external pipe. (Angel Carpintero) * Avoid possible stack smashing in v4l_open_vidpipe(). (Angel Carpintero) * Allow compile with OpenSuse ffmpeg package (15594svn-20081010) http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2008x10x25x070400 (Angel Carpintero) * Fix warning for syslog(). (Angel Carpintero) * Better detection of ffmpeg http://www.lavrsen.dk/foswiki/pub/Motion/ReleaseNoteMotion3x2x11/ffmpeg-detection.diff.gz (Angel Carpintero) * Fix warning for __USE_GNU redefined (Peter Holik) http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2009x06x17x122137 (Peter Holik) * Allow compile with NetBSD and make LP64 compliant video_freebsd.c (Andreas Wrede) * Fix segfault for new libjpeg v7. (Angel Carpintero) 3.2.11 Summary of Changes Features * Added support for ffmpeg-2008-04-09 port version of FreeBSD. * Remove mjpegtools dependencies and integrate only needed functions from library. (Angel Carpintero) * Allow change/setup framerate in FreeBSD using pwcbsd. (Angel Carpintero) * Get rid of ffmpeg-config in configure.in for debian. (Angel Carpintero) Bugfixes * Fix Problem Encoding 1280x1024 resolution videos http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2008x06x11x183727 (Angel Carpintero) * Add a new parameter netcam_tolerant_check, to be less strict with some buggy network cameras firmwares. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2008x06x19x123218 (Angel Carpintero) * Fix round robin in BSD switching to METEOR_CAP_SINGLE. (Angel Carpintero) * Fix rotate for v4l2 devices using JPEG / MJPEG palettes. (Angel Carpintero) * Fix v4l2_palette http://www.lavrsen.dk/twiki/bin/view/Motion/UvcvideoMjpegPatch (Gerrit Hannaert) * Fix warning for x86_64 in conf.c using pointers LP64 compliant ( Angel Carpintero ). * Fix Segfault on reload or quit for vloopback (maybe other v4l1 devices too) ( Peter Holik ) http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2009x06x17x090603 3.2.10.1 Summary of Changes Bugfixes * Fix a security issue in web control interface http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=484572 (Angel Carpintero) 3.2.10 Summary of Changes Features * Added the pre_capture buffer redesign to throttle load and enhance pre_capture feature. http://www.lavrsen.dk/twiki/bin/view/Motion/PreCaptureRedesign (Dag Erlandsson). * Added preview center feature. http://www.lavrsen.dk/twiki/bin/view/Motion/PreviewCenter (Dag Erlandsson). * Removed low_cpu feature, as it is not really compatible with pre_capture and a lot of other features rely on the pre_capture buffer behind the scenes. (Joerg Weber) * Removed night_compensate feature. This functionality is covered by noise_tune. (Joerg Weber) * Implemented a new reference frame algorithm to improve object recognition and location. (Joerg Weber) * Improved smartmask feature: real moving objects don't trigger the mask anymore. (Joerg Weber) * Added area_detect feature. New config options: area_detect, on_area_detected. (Joerg Weber) * Added help in http control http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2007x11x19x181541 (Angel Carpintero) * Added Choose V4L2 palette http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2007x11x19x032318 (Angel Carpintero) * Improved http control ( 'back' link, select box, show current values when are going to be changed ). (Angel Carpintero) * Improved thread handling, single threads can be stopped/restarted (Dag Erlandsson) * Watchdog, restart hang threads (Dag Erlandsson) * Added ON_CAMERA_LOST event (Dag Erlandsson) * Motion start if a camera isn't there at start, retries to connect if lost (Dag Erlandsson) * Netcam Keepalive and HTTP/1.1 http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2007x01x22x231542 (Simon Walls) * Added mov , Quicktime file format (Andrew Hamilton). * Added to configure.in --with-pwcbsd to allow compile motion in freebsd with webcam support instead of bktr (Angel Carpintero) Bugfixes * Fixed a problem with locate and fixed mask overlay (Dag Erlandsson). * Preview pictures get the timestamp of moment they were captured (Dag Erlandsson). * Fixed http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x10x23x093651 (Angel Carpintero) * Fix process_id_file when is passed from command line (Angel Carpintero) * Fix http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x10x27x150419 (Angel Carpintero) * Fix http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x11x25x102808 (Angel Carpintero) * Avoid random errors , initialising some structs for V4L1 http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x11x26x010755 (Jason Sharpee & Angel Carpintero) * Fix motion segfault because ffmpeg API change http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2007x12x29x175530 (Angel Carpintero) * Little fix in ffmpeg.c comparing version of LIBAVFORMAT_BUILD, since ffmpeg svn -r4486 LIBAVFORMAT_BUILD and LIBAVCODEC_BUILD uses LIBAVFORMAT_VERSION_INT ((49<<16)+(0<<8)+0) and LIBAVCODEC_VERSION_INT ((49<<16)+(0<<8)+0) (Angel Carpintero) * Fix choose v4l2 palette , http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2008x01x21x043812 (Onakra) * Get current directory to allow write motion.conf properly http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2008x02x25x013419 (John Bray) * Fix broken PostgreSQL detection for custom location, http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2008x02x25x025134 ( Angel Carpintero ) * Fixed stepper when is used track_auto on ( Angel Carpintero ). * Better debug in netcam for "Error reading image header" http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2008x02x27x092849 (Simon Walls) 3.2.9 Formal Release - Summary of Changes Features * Removed debian ( to avoid conflicts with debian package) and FreeBSD ( no needed to deploy BSD port here ) directories. ( Angel Carpintero ) * Added --chuid motion to debian init.d script. ( Angel Carpintero ) * Added Flash video format (FLV) to ffmpeg. http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2007x07x19x131921 (Timo Taskinen). * Added FFV1 ( FF video codec 1 ) codec , Lossless encoding http://www.lavrsen.dk/twiki/bin/view/Motion/LosslessEncoding (Andrew Hamilton). Bugfixes * Fix segfault in webhttpd.c on motion restart (Angel Carpintero) * Fix segfault in debian http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x09x24x175945 (Angel Carpintero) * Fix http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=391055 , change motion man page , -d requires level. (Angel Carpintero) * Handle mjpeg decoding and fix colour issue adding mjpegtools dependency http://www.lavrsen.dk/twiki/bin/view/Motion/MjpegColorIssue http://www.lavrsen.dk/twiki/bin/view/Motion/MjpegToYUV420pPatch (Marius Rieder, Angel Carpintero). * Add debug level > 5 to get logs from v4l2_select_input, v4l2_set_control and v4l2_set_input. (Angel Carpintero) 3.2.8 Formal Release - Summary of Changes Features * Added connection status for all devices available from http web interface. (Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2006x11x09x050638 * Improved deb packaging, install the init.d script. (Angel Carpintero). * Added swf codec to video creation (Bowser Pete, Andy Brown). http://www.lavrsen.dk/twiki/bin/view/Motion/FFmpegSWFcreation * Added V4L2 support (Krzysztof Blaszkowski, Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/VideoForLinuxTwoDiscussion, * Added support for V4L2_PIX_FMT_SBGGR8 ( bayer ), V4L2_PIX_FMT_SN9C10X, V4L2_PIX_FMT_MJPEG and V4L2_PIX_FMT_UYVY (Angel Carpintero). * ucvideo track pan/tilt support ( Michal Licko ,Dirk Wesenberg and Angel Carpintero ) http://www.lavrsen.dk/twiki/bin/view/Motion/LinuxUvcTrackingPatch * Added a FreeBSD directory to allow people from BSD to get a daily version and create a port. (Angel Carpintero). * Removed mysql dependency from debian package and added a note to setup motion to run as daemon to create the pid file. (Angel Carpintero). * Changed the way configure search mysql headers and libs, added 3 parameters to configure --without-mysql to disable support, --with-mysql-include directory of mysql.h and --with-mysql-lib directory of libmysqlclient.a or libmysqlclient.so (Angel Carpintero). * Added MYSQL_OPT_RECONNECT flag for mysql connection (MYSQL 5.x only) and changed default value for mysql_host (Angel Carpintero). Bugfixes * Removed a duplicate call to jpeg_destroy_decompress already is called from netcam_image_conv (Krzysztof Blaszkowski). * Fix http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x10x10x081903, reconnect to mysql if connection dropped (Angel Carpintero). * Fix memory management in ffmpeg.c (Rafis Khayrullin). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x12x19x062432 * Fix of ffmpeg_avcodec_log code (Alain Guidez). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x03x25x074612 * Fix a segfault adding correct size to be used for bayer2rgb24() (Damian Wrobel) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x03x30x175913 * Fix an error in FreeBSD, the use of capture even fields depends on height value. (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x12x03x073610 * Fixed autodetection for VIA cpu, no needed to use --without-optimizecpu. Added many others (Angel Carpintero) * Fix, don't remove pid file when motion reload config file( HUP signal ) (Angel Carpintero). * Fix compilation broken by uvc track type. (Angel Carpintero). * Fixed the thread number assignment which could goof up if netcams started very quickly before all thread were created at startup. (Kenneth Lavrsen) * Fix RoundRobin v4l2 buffers in driver when switching input, http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x07x07x182605 (Dag Erlandsson and Angel Carpintero). * Check EIO for VIDIOC_DQBUF to workaround saa7134 problem. (Dag Erlandsson and Angel Carpintero). * Change bayer2rgb24() to fix a problem with sn9c102 driver http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x06x05x012249 (Jared D and Angel Carpintero). 3.2.7 Formal Release - Summary of Changes Features * Removed the minimum_gap feature which was utterly useless (Kenneth Lavrsen) * Added new feature: minimum_frame_time which enables capturing at a lower rate than 2 frames per second (Kenneth Lavrsen and Angel Carpintero) * Made the creation of reference frame and the decay mechanism depending on how much motion was detected relative to threshold setting (Joerg Weber) http://www.lavrsen.dk/twiki/bin/view/Motion/ReferenceFramePatch * Added process_id_file feature (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2006x06x06x123003 Bugfixes * Fixed problem related to fetching images from Network camera and error handling when it fails. Motion would end in infinite loops (Bill Brack). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x03x10x000151 * Improved reporting of thread numbers during startup in setup mode. (Peter Smith and Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/SlightlyImprovedThreadCreationLogging * Ffmpeg code mutex locking fix (Peter Smith) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x04x07x164654 * Ffmpeg avicodec logging improved (Peter Smith and Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/FfmpegAvicodecLogging * Improved upon a few ambiguous log messages which may be emitted by the Event handling code with regards to Ffmpeg (Peter Smith) http://www.lavrsen.dk/twiki/bin/view/Motion/LoggingEventFix * Implemented a fix for the rare problem where some experienced that the move file names would only consist of the extension .mpg or .avi with no name in front. The root cause was the use of sprintf for appending to strings. (Mike Kenney and Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2005x09x05x133031 http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2006x06x19x174238 * Altered the risky use of sprintf to snprintf in all places related to use with config strings that can become very long (Kenneth Lavrsen) * Removed annoying debug messages (v4l_set_input really needed ?) in the FreeBSD version (Angel Carpintero) * Fixed the check for ffmpeg version. In rev 5503 of ffmpeg the FFMPEG_VERSION_INT was removed from libavcodec/avcodec.h. Instead we now use the equivalent LIBAVFORMAT_BUILD >= 4616 which is the 0.4.9pre1 version of ffmpeg. (Kenneth Lavrsen) * Fixed segfault when netcam_url has no service ( http , ftp ) (Angel Carpintero) * Fixed interlace issue with METEOR_GEO_EVEN_ONLY in FreeBSD (Angel Carpintero) * Fixed possible syntax error in configure related to MySQL (Angel Carpintero) * Avoid open file descriptor when connecting to network cameras fails (Peter Holik) http://www.lavrsen.dk/twiki/bin/view/Motion/AvoidOpenfiledescriptors * Fixed http pause feature so that pausing thread 0 now pauses all threads. (GunnarSkjold) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x07x10x111239 * Put a new global mutex around avcodec_close to avoid problems with not thread safe functions in ffmpeg (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x04x07x164654 * On FreeBSD configure defines a redundant freebsd for motion. Fixed by replacing -D__freebsd_ by BSD macro included in sys/param.h for BSD platforms. (JukkaUkkonen and Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x07x08x070417 * For BSD platforms changed to using native pthreads as default and adding linuxthreads as a optional parameter from configure. (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x07x08x071646 * Smartmask overlay feature did not set intensity correctly. (Kenneth Lavrsen) 3.2.6 Formal Bugfix Release. * Fixed bug where variables time_last_frame and time_current_frame had been extended to also be used for snapshot feature but declaration was hidden between #ifdef HAVE_FFMPEG. (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x03x09x012244 * Fixed a bug that only allowed remote control of max 9 cameras. Now Motion can present up to 99 cameras in its http remote control interface (Angel Carpintero based on idea by Chuck Sheehan) http://www.lavrsen.dk/twiki/bin/view/Motion/WebHttpManyThreads * text_changes now shows a '-' when motion detection is paused instead of just showing 0 (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2006x03x16x095713 3.2.5.1 Doc and man page correction * ffmpeg_filename has changed name to movie_filename to prepare for alternative movie encoding to the current ffmpeg based implementation and ffmpeg_filename will then be a bad name (Kenneth Lavrsen) * Man page corrected. 3.2.5 Formal Release. Summary of changes * Fixed misc problems in FreeBSD. (Angel Carpintero) * Update README.FreeBSD * Fix problems with tuner_device and frequency, now by default is not defined to allow use any input without problem. * Replace strndup() by memcpy() in netcam.c * Merged configure.in.freebsd with configure.in (configure.in.freebsd deleted) * Remove a warning when used --without-bktr * Remove cpu optimization (is broken) * Fixed memory leak in ffmpeg code. (Andrew Hamilton) * Fixed http control of pan and tilt (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x12x22x122649 * Fixed netcamera bug related to separating frames in an mjpeg stream. (Peter Holik). From mailing list 23 Dec 2005. * Fix related to connecting to the netcam (William Black) From mailing list 23 Dec 2005. * Changed CHANGELOG to same bullet format as used by TWiki to make it easier to write release notes (Kenneth Lavrsen) * Changed CREDITS to same bullet format as CHANGELOG (Kenneth Lavrsen) * Fixed sql_mask not initialised correctly (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x01x09x175603 * Fixed the management of strings from http remote control , setting to NULL when they are set to "blank" and fixes a problem with despeckle , that didn't allow to remove labeling action from http remote control. (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/FixStringsAndDisableLabeling * Fix many typos in comments ( i ran aspell against the code ). Also there's a fix to free cnt->eventtime_tm when motion exits. (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/FixTypoInComments * Fix the problem that happens in FreeBSD and Debian Sarge because version of ffmpeg is LIBAVFORMAT_BUILD < 4629. ( Pete Shipley and Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x01x12x120335 * Updated motion.spec. Changing D_FORTIFY_SOURCE=2 by D_FORTIFY_SOURCE=1 to fix problem related to building with ffmpeg. (Angel Carpintero) * Implemented fix for missed snapshots with slow network cameras (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x02x07x162149 * Added some constants in video.c function v4l_picture_controls() which can help people hack an optimal set of values for controlling auto brightness for their particular camera. For now I am do not want to add all of these to the already too large number of motion config options. Maybe based on feedback we can permanently change the constants and add an additional auto brightness option. Or maybe a combined option that sets more constant based on an algorithm. (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x02x07x212816 * Fixed a syntax error in picture.c get_pgm() which caused the program to segfault when a mask file size did not match the picture size. Now the program correctly gives an error message and continues without the mask. (Kenneth Lavrsen). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x10x08x150720 * Added Tilt support to stepper track. ( Angel Carpintero ). * CPU VIA Ezra C3 autodetection support added. (James Van Vleet) http://www.lavrsen.dk/twiki/bin/view/Motion/VIAEzraC3Patch * Fixed mysql configure auto-detection for x64 systems. ( Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2006x03x02x152208 * Added the ffmpeg_deinterlace feature (Andrew Hamilton) http://www.lavrsen.dk/twiki/bin/view/Motion/MotionffmpegDeinterlace 3.2.4 Formal Release. Summary of changes Features * New text option text_event and new conversion specifier %C. Option text_event defines the value %C which then can be used in filenames and text_right/text_left. The text_event/%C uses the time stamp for the first image detected in a new event. Default value is %Y%m%d%H%M%S. %C is an empty string when no event is in progress (gap period expired). Pre_captured and minimum_motion_frames images are time stamped before the event happens so %C in text_left/right does not have any effect on those images. * Added new option track_auto which is a boolean option (on or off) with default value off. This enables people to start Motion with auto tracking enabled. Changing the config value for track_auto and enabling the auto tracking via the httpd track/auto has the exact same effect. * Added 3 new tracking options: track_step_angle_x, track_step_angle_y, and track_move_wait. The options track_step_angle control the movement during auto tracking and are currently only active for the pwc type tracking. The idea is that they can later also be used for the generic tracking as it evolves. The track_move_wait controls the number of frames after the camera has moved (auto or manual) during which motion detection is disabled. This option should be set so low that the motion detection is re-enabled the minute the camera is standing still again. * Added new sql_query option. This in combination with convertion specifiers incl the two new %f and %n enables the user to use any database structure they please. Adding fields is now a simple matter of modifying the sql query. * Added the %t conversion specifier which is the thread (camera) number. * Added two new conversion specifiers: %f which is filename (full path) and %n which is filetype (sqltype) valid in on_picture_save, on_movie_start, on_movie_end and sql_query. This also means that filename is no longer appended at the end of the 3 on_xxxx commands. * http control had a number of small improvements. * Added the debian sub directory so that people can build the deb package. * Enhanced netcam compatibility with Lumenera and Pixord Cameras. * Netcam feature now supports both http and ftp. * Added an infinite retry scheme for netcams that are not available when Motion is started. Instead of just dying, Motion now retries every 10 seconds until the netcam is available. Until the netcam is available Motion enters a mode showing a grey image with a text information which is fed to webcam, timelapse, snapshots, vloopback etc. If the actual height and width of the netcam does not match the dimensions in the config file Motion will perform a quick restart. * Added a better error handling of a netcam that changes dimensions while Motion is running. Instead of just writing error messages Motion restarts quickly to recover from this change. * FreeBSD Code improvements including set/get hue, saturation, contrast and brightness, support large resolutions. * RPM specs file changed as suggested for use in the Livna repository. * Changed the sequence of events connected with creating files. Data is now written to the databases (if used) before an external comments is on (on_xxxx options) allowing the external program to use the new data in the database. * Motion is now also works on MaxOSX with similar feature set as FreeBSD. Bugfixes * netcam code now waits for the next frame to arrive for a limited period in order to avoid too many duplicate images. * Motion loop resets its frame timer when the image received is from a netcam. This lowers the actual framerate of Motion to the rate the netcam can actually keep up with. * Removed all warnings when running ./configure --with-developer-flags. * Fixed error message with unknown config option. * Fixed small mistake in allocating memory for cnt->imgs.common_buffer. * Implemented a speed-up patch of the draw text feature. * Introduced check for device image size being a multiple of 16. * Switchfilter feature repaired. * Fixed small bug where motion was detected when using a tracking camera and the camera moved to center position when gap period expires. * Implemented fix to configure so that LDFLAGS from the environment are used when making the Makefile. * Changed configure so that --with-jpeg-mmx is default off as a reaction to known problems seen when using the jpeg-mmx library. * The lightswitch and switchfilter features have changed to ensure that both algorithms work on raw unfiltered motion pixels which they both were designed for. * Fixed bug related to init of mutex in netcam code. * Fixed small bug where the displayed time in the grey error image shown during start with unavailable netcam could show a garbage value under rare circumstances. * Restored the function sigchild_handler so it contains the same code as before motion-3.2.1_snap9. They is done in an attempt to fix an old problem with zombie child processes that has shown up again. * Added a work-around so people in FreeBSD that uses a capture card where input 1 is not tuner can use motion if frequency is set -1 in motion.conf or thread#.conf 3.2.4 Detailed changes for 3.2.4 snap1 * Removed all warnings originating from the motion sources when running ./configure --with-developer-flags. The modifications were done by the following people: Peter Holik, Bill Brack, Angel Carpintero and Kenneth Lavrsen. We now encourage developers to ensure that new code is checked with --with-developer-flags and code made so that no new warnings shows originating from the motion sources. http://www.lavrsen.dk/twiki/bin/view/Motion/ReduceWarningsPatch * Fixed error message with unknown config option (Bill Brack) * Fixed small mistake in allocating memory for cnt->imgs.common_buffer (Angel Carpintero). * Implemented a speed-up patch of the draw text feature (Peter Holik). http://www.lavrsen.dk/twiki/bin/view/Motion/DrawTextspeedup * http control updated: (null) messages replaced by "disabled", last parameter in conf/list are displayed correctly and only in Main thread. When motion runs with only one thread, it displays "No threads". (Angel Carpintero) * Enhanced compatibility with Lumenera (Bill Brack) * http control: selectbox instead of a textfield for changing boolean configs (Peter Holik and Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/WebhttpEnhancements. * Introduced check for device image size being a multiple of 16 (Peter Holik). http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamModulo16Patch * Added the debian sub directory so that people can build the deb package (Angel Carpintero). * Sync configure.in.freebsd (adding support for jpeg-mmx, developer-flags and some cosmetic changes ) (Angel Carpintero) * Implemented --with-developer-flags fixes in FreeBSD code (Angel Carpintero). * Implemented Threadnr in TLS (thread-local storage)patch. It puts the thread number into TLS and modifies motion_log() so that we do not have to drag the cnt struct around just to be able to print the thread number in the log and on the console. (Per Jönsson with additional removal of unused cnt by Kenneth Lavrsen). http://www.lavrsen.dk/twiki/bin/view/Motion/ThreadNrTlsPatch * Moved the motion_loop initialization into a new function motion_init (Bill Brack). * Removed old unused code related to read mode (not mmap) from V4L devices (Kenneth Lavrsen). * In v4l_start change map from unsigned char * to void * to be ANSI C compliant with mmap (Angel Carpintero) * http control: Changed disabled to (not defined) when displaying option list (Angel Carpintero) * netcam code now waits for the next frame to arrive for a limited period in order to avoid too many duplicate images (Bill Brack). * Motion loop resets its frame timer when the image received is from a netcam. This lowers the actual framerate of Motion to the rate the netcam can actually keep up with. (Kenneth Lavrsen) * Last --with-developer-flags warnings eliminated simply by swapping the order of the #include statements in the sources (Bill Brack and Kenneth Lavrsen). * FreeBSD Code improvements by Angel Carpintero * Implemented set/get hue , saturation , contrast and brightness. * Better support to capture with big resolution ( 640x480 , 768x576 ). * Update Readme adding information about "how to configure a capture card and settings" , update packages dependencies . * Remove support for libjpeg-mmx , motion segfault ( future fix ). * Cosmetics changes in configure.in.freebsd ( replace --without-v4l by without-bktr ). * Cleanup code and fix warnings. snap2 * Simplified rotation code based on the fact that images must have dimensions that are a multiple of 16 (Per Jönsson) http://www.lavrsen.dk/twiki/bin/view/Motion/RotateSimplificationPatch * Switchfilter feature repaired. It was called inside motion_detected() after overlays on cnt->img.out were added which meant that the feature also detected all the overlays, smartmasks, fixed mask and text. It is now moved to the motion_loop right after the lightswitch feature and before any overlays are added (Kenneth Lavrsen). * Fixed small bug where motion was detected when using a tracking camera and the camera moved to center position when gap period expires. The fix includes gathering the updating of reference frame in one place only in the motion_loop (Kenneth Lavrsen). * Implemented the new text option text_event and new conversion specifier %C. Option text_event defines the value %C which then can be used in filenames and text_right/text_left. The text_event/%C uses the time stamp for the first image detected in a new event. Default value is %Y%m%d%H%M%S. %C is an empty string when no event is in progress (gap period expired). Pre_captured and minimum_motion_frames images are time stamped before the event happens so %C in text_left/right does not have any effect on those images (Kenneth Lavrsen). http://www.lavrsen.dk/twiki/bin/view/Motion/EventConvertionSpecifierDiscussion * Renamed some variables related to time to be better descriptive of function and type (Kenneth Lavrsen). * Added new option 'sql_user_text'. This can be defined with the same conversion specifiers as text_xxx, on_xxxx and filenames. The SQL field text_left has been removed and replaced by a field user_text which is used for storing the interpreted value of sql_user_text (Kenneth Lavrsen) * Added new SQL field event_time_stamp of the type TIMESTAMP (Kenneth Lavrsen). snap3 * Enhancement to Netcam Code for Connection to Pixord Cameras (Bill Brack). http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamFixPixordBug * Implemented fix to configure so that LDFLAGS from the environment are used when making the Makefile (Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x09x15x185558 * Changed configure so that --with-jpeg-mmx is default off as a reaction to known problems seen when using the jpeg-mmx library (Angel Carpintero). * RPM specs file changed as suggested for use in the Livna repository. (Kenneth Lavrsen) * The lightswitch and switchfilter features have been moved up before the despeckle features are run. This should ensure that both algorithms work on raw unfiltered motion pixels which they both were designed for. (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x10x05x212444 snap4 * Integrated NetcamWithFtp patch. To use ftp simply use a URL starting with ftp:// (Bill Brack). Code was additionally cleaned up by Kenneth Lavrsen. http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamWithFTP * Changed error handling in vid_start so that failing to open the video device no longer causes an exit but a return with error code -1. (Kenneth Lavrsen) * Added the %t conversion specifier to show the thread number. (Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/ThreadConversionSpecifierPatch * Added help texts in conf.c and motion-dist.conf describing the %t specifier. Added a good example of use in motion-dist.conf. (Kenneth Lavrsen). * Fixed bug related to init of mutex in netcam code (Angel Carpintero). * Improved fix for netcam mutex init (Bill Brack). http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamFixPthreadInit * Netcam_ftp code fixes (Angel Carpintero and Asbjørn Pettersen) http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamWithFtpEnhancements * Enhanced ffmpeg detection (Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/BetterFFmpegDetection * Added two new conversion specifiers: %f which is filename (full path) and %n which is filetype (sqltype) valid in on_picture_save, on_movie_start, on_movie_end and sql_query. This also means that filename is no longer appended at the end of the 3 on_xxxx commands. (Kenneth Lavrsen) * Removed the sql_user_text option that was added in snap 2 (Kenneth Lavrsen) * Added new sql_query option. This in combination with convertion specifiers incl the two new %f and %n enables the user to use any database structure they please. Added fields is now a simple matter of modifying the sql query. The default is the same as the default in snap1. (Kenneth Lavrsen). * Changed the sequence of events connected with creating files. Data is now written to the databases (if used) before an external comments is on (on_xxxx options) allowing the external program to use the new data in the database (Kenneth Lavrsen). * Added an infinite retry scheme for netcams that are not available when Motion is started. Instead of just dying, Motion now retries every 10 seconds until the netcam is available. Until the netcam is available Motion enters the normal flow with the same grey image with a text information being fed to webcam, timelapse, snapshots, vloopback etc. Motion uses the width and height from the config file for this. It is a good idea to setup width and height so it is the same as the netcam. If the dimensions are the same Motion will switch over to the netcam seemlessly. If the dimensions are different Motion will perform a quick restart so all the many internal buffers can be initialized properly (Kenneth Lavrsen). * Added a better error handling of a netcam that changes dimensions while Motion is running. Instead of just writing error messages Motion restarts quickly to recover from this change. Note the now more well defined error coding for vid_next for both netcams and V4L cams. (Kenneth Lavrsen) snap5 * Fixed small bug where the displayed time in the grey error image shown during start with unavailable netcam could show a garbage value under rare circumstances. (Kenneth Lavrsen). * Restored the function sigchild_handler so it contains the same code as before motion-3.2.1_snap9. They is done in an attempt to fix an old problem with zombie child processes that has shown up again. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x11x13x115016 (Kenneth Lavrsen). * Move the declaration of sig_handler_action and sigchild_action from the setup_signals function where they are local and will be destroyed and out in main just before setup_signals is called. Changed the function setup_signals so the two structs are passed as pointers. (Kenneth Lavrsen) Release * Added new option track_auto which is a boolean option (on or off) with default value off. This enable people to start Motion with auto tracking enabled. Changing the config value for track_auto and enabling the auto tracking via the httpd track/auto has the exact same effect. (Kenneth Lavrsen) * Added 3 new tracking options: track_step_angle_x, track_step_angle_y, and track_move_wait. The options track_step_angle control the movement during auto tracking and are currently only active for the pwc type tracking. The idea is that they can later also be used for the generic tracking as it evolves. The track_move_wait controls the number of frames after the camera has moved (auto or manual) during which motion detection is disabled. This option should be set so low that the motion detection is re-enabled the minute the camera is standing still again. Feature originally made by Moshe Van Der Sterre. Kenneth Lavrsen extended it to be more generic. http://www.lavrsen.dk/twiki/bin/view/Motion/PwcConfiguration * New Feature: Motion is now also supported on MaxOSX with similar feature set as for Free BSD. See README.MacOSX for details how to install it. (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/MacOSXPatch * Added a work-around so people in FreeBSD that uses a capture card where input 1 is not tuner can use motion if frequency is set -1 in motion.conf or thread#.conf (Angel Carpintero). 3.2.3 Detailed changes for 3.2.3 Bugfix release only. No new features. * Fixed a bug in the http control code that failed to accept a client connecting in some systems (Peter Holik). * Fixed a series of bugs where several feature were using the image buffer after text was added for noise tuning, auto_brightness, reference frame update when tracking etc. When a netcam failed to produce an image the text added to the previous image became motion detected also. The code is not changed so that the ring buffer is used for timestamped images and the image used for detection is in a buffer cnt->imgs.image_virgin. (Kenneth Lavrsen). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x08x15x140701 * Auto brightness used the first image in ring buffer instead of the latest image and it used an image with time stamping. It now uses the new cnt->imgs.image_virgin buffer. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x08x15x160208 * Cleaned out unused code from httpd control (Angel Carpintero). * Option switch_filter used print_int instead of print_bool when motion.conf was saved (Kenneth Lavrsen). 3.2.2 Formal Release. Summary of changes Features * New completely rewritten netcam code. * Proxy servers are again supported by netcam feature * New conversion specifier %o for threshold * New convertion specifier %Q for number of labels * Drawing of mask and smartmask in setup mode improved * Compilation of motion on 64 bit machines improved * RPMs can now be built by non-root user * Improved the labelling algorithm so that locate feature and tracking features includes all labelled areas above threshold * Motion now supports the mjpeg webcam stream while saving PPM images. * New improved webcam feature. When you set webcam_motion on Motion will now stream at 1 fps instead of none. When motion is detected the webcam stream increases to the limit set in the config file. This change makes the webcam_motion much more interesting. The previous function always ended up with clients timing out. * Implemented the libjpeg-mmx patch. Installing the MMX version of libjpeg can increase performance. Especially for machines with very little CPU power. It only modifies the configure script. If you do not have the libjpeg-mmx the configure script with ignore this and use the standard libjpeg. Note that RPMS will be built without this * Improved descriptions in motion.conf * Many small code speed optimizations. * Added new feature: Double size text. A new config option 'text_double' can be set 'on' and this scales the text to double size. Default is off. * Improved error handling of missing picture frames from camera. Especially network cameras will often not be able to provide a picture frame from time to time. Motion would retry before and eventually and rather quickly exit the camera thread and maybe completely exit. The improved handling now makes a copy of the previous frame for 30 seconds (longer if cpu_low is activated because the implementation is 30 X framerate frames) and then show a grey image with a message saying the connection is lost and an ISO format time stamp of first poor connection. * Added a configure option --with-developer-flags which enables many compiler warnings that can be used by developers to make code more robust. Not for normal users building Motion. * Included a CODE_STANDARD text file to help new developers make patches that are easier to integrate without too much manual editing. Bug Fixes * Fixed a bug in the autobrightness algorithm * Fixed bug reporting errors when creating symlink to last snap * Improved code so that Motion no longer uses the tmpfile() function for buffering the frames of the mjpeg stream. * Implemented a fix/work around to a bug related to building and installing RPMs on Suse. * Improved signal handler * Code commented much more. * Many bugfixes to get Motion more stable (less segfaults) * Code improved to remove all warnings when compiled with gcc 4.0 * Better FreeBSD support * Replace functions not threadsafe with threadsafe functions. * Implemented a much easier to use motion_log function which replaces the calls to printf and syslog. This code change as no impact to the user. * Fixed a bug in video.c so that VIDEO_PALETTE_GREY cameras now actually work. * Updated the ffmpeg.c code so that Motion can now be built with ffmpeg CVS release from the June/July 2005 timeframe. 3.2.2 Detailed changes for 3.2.2 snap1 * Pthread deadlock in motion 3.2.1 fixed (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x26x125712 * http lockup bugfixes and ConvertSignalToSigaction only for webhttpd (Angel Carpintero) * alg_draw_location: Use temporary variables to store the values used in for() loops instead of compute them in each loop (Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/ImproveAlgDrawLocation * Small speed boost to the function draw_textn (Andrew Hamilton and Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/DrawTextnImprovement * Added two new convertion specifiers: %o for threshold and %Q for number of labels. (Kenneth Lavrsen) * Improved the config file description for pre_capture to get people to use small values (Kenneth Lavrsen). snap2 * Avoid Cleanup Segfault. Avoid Cleanup Segfault. Allocates filepath using strdup to avoid segfault is target_dir parameter is not supplied in motion.conf. Moves out from signal handler the cleanup for pipe and mpipe. (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/AvoidCleanupSegfault * Major code cleanup concerning signedness of chars all over the code to allow compilation with gcc4.0 (like in Fedora Core 4) without any errors or warnings. This will probably require that some of the not yet included patches will have to be fixed because it it code all over the place that has been changed. (Kenneth Lavrsen) snap3 * Changed the order of drawing the red mask in setup mode so that the smartmask is drawn after the fixed mask (Joerg Weber). * Changed the configure script so that /usr/lib64 is also searched for the presence of ffmpeg (should fix the problem with 64 bit machines) (Kenneth Lavrsen). * Changed the configure script so that rpms can be made by normal non-root users (Angel Carpintero, Kenneth Lavrsen). snap4 * Fixed the ffmpeg code so that Motion also compiles against libavcodec build 4754 or later. (Per Jönsson) * Above change in configure script for 64 bit ffmpeg support also implemented in the freeBSD configure (Angel Carpintero) * Webhttp control interface fixed so it also works in FreeBSD (Angel Carpintero) * Improved the display of fixed mask. It is now shown as grey instead of red. This makes it easier to see the smart mask working when you also have a fixed mask (Joerg Weber). * Netcam First Header patch. If an error with jpeg decompression occurred at connecting to a mjpeg streaming webcam, this patch skips this jpeg and tries to decompress next jpeg up to MAX_HEADER_RETRIES (20) (Peter Holik). http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamFirstHeader snap5 * Small improvement in framerate accuracy (Peter Holik). http://www.lavrsen.dk/twiki/bin/view/Motion/FramerateAdjust * Fixed a bug in the autobrightness algorithm (Per Johnsson) * Fixed a bug in the webhttpd code related to pan/tilt. Bug was introduced in snap4 (Angel Carpintero, Kenneth Lavrsen). * Improved the labelling algorithm so that locate feature and tracking features includes all labelled areas above threshold (Joerg Weber). http://www.lavrsen.dk/twiki/bin/view/Motion/ImprovedLabellingPatch * Fixed bug reporting errors when creating symlink to last snap (Bill Maidment) * Changed all use of localtime to localtime_r which is threadsafe (Kenneth Lavrsen). * Implemented a modified version of the WebcamCompressInMemory so that Motion no longer uses the tmpfile() function for buffering the frames of the mjpeg stream (Peter Holik). http://www.lavrsen.dk/twiki/bin/view/Motion/WebcamCompressInMemory * Modified the WebcamCompressInMemory patch so that Motion now supports the mjpeg webcam stream while being setup for saving PPM images (Kenneth Lavrsen). http://www.lavrsen.dk/twiki/bin/view/Motion/WebcamCompressInMemory * Major clean-up of code in picture.c and webcam.c so that function names and variable names are less confusing. Also added many comments in picture.c. (Kenneth Lavrsen). snap6 * Webcam code commented more (Kenneth Lavrsen) * New improved webcam feature. When you set webcam_motion on Motion will now stream at 1 fps instead of none. When motion is detected the webcam stream increases to the limit set in the config file. This change makes the webcam_motion much more interesting. The previous function always ended up with clients timing out. (Kenneth Lavrsen). snap7 * Implemented WebcamShortWriteHandling patch (Bill Brack) http://www.lavrsen.dk/twiki/bin/view/Motion/WebcamShortWriteHandlingPatch * Implemented the libjpeg-mmx patch. Installing the MMX version of libjpeg can increase performance. Especially for machines with very little CPU power. It only modifies the configure script. If you do not have the libjpeg-mmx the configure script with ignore this and use the standard libjpeg. Note that RPMS will be built without this (Peter Holik and Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/LibJpegMmx snap8 * Small code cleanup in webcam.c and picture.c and .h for the webcam code (Peter Holik and Kenneth Lavrsen) * Small code cleanup in motion.c for the variable holding the number of microseconds since epoch. The old code worked fine but relied on an integer overflow every 71 minutes. (Bill Brack and Kenneth Lavrsen) * Implemented a fix/work around to a bug related to building and installing RPMs on Suse. (Paul Beltrani) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x07x14x212356 * Small speed optimization in the creation of reference frame (Peter Holik). * Complete rewrite of the Netcam code. Should fix many of the reported and still open netcam bugs. This is first release in a snapshot. Expect to find bugs. Testing is important. If you have a netcam please test this and report bugs. http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamCodeRewritePatch snap9 * Fixed bug related to disabled webcam or duplicate webcam port. Error log accept(): Socket operation on non-socket continuously written to syslog. (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x08x01x150922 * Fixed memory leak in webhttpd related to use of strdup (Angel Carpintero). * Improved the error reporting in the Netcam code and did a few minor corrections and code cleanups (Bill Brack). * Implemented a much easier to use motion_log function which replaces the calls to printf and syslog. The implementation to actually use this has been implemented in video.c and the Netcam code files. Rest will be in next snap. This code change as no impact to the user (Bill Brack). http://www.lavrsen.dk/twiki/bin/view/Motion/ErrorLoggingEnhancementPatch * Fixed a bug in video.c so that VIDEO_PALETTE_GREY cameras now actually work (Bill Brack). * Implemented the conversion of signal to sigaction which should be more thread safe. Hopefully this still keeps Motion from making Zombies. (Christophe Grenier). http://www.lavrsen.dk/twiki/bin/view/Motion/ConvertSignalToSigaction * Added new feature: Double size text. A new config option 'text_double' can be set 'on' and this scales the text to double size. Default is off. (Andrew Hamilton). http://www.lavrsen.dk/twiki/bin/view/Motion/TextScalingPatch snap10 * Error Logging Enhancement Patch v 1.3 (Angel Carpintero) including: http://www.lavrsen.dk/twiki/bin/view/Motion/ErrorLoggingEnhancementPatch * Populate the motion_log to the whole motion source code. * Fixed FreeBSD compilation. * Added the possibility to pass NULL as struct context * * Removed unused errno variables. * Fixed errno in rotate.c , set to 0. * Fixed some errno flags in webhttpd.c and motion.c * Fixed a bug when not motion.conf is found * Removed printf from all files * Fixed the conf_list[] index in motion.c * RotateBswapFix Patch v 2 (Per Jönsson) including: * cleanup in code comments * fix for __bswap_32 macro collision * fixed bug where initialization would be incomplete for invalid degrees of rotation * now uses motion_log for error reporting http://www.lavrsen.dk/twiki/bin/view/Motion/RotateBswapFix * Re-mplementation of optional Proxy Server for Network Cameras (Bill Brack). http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamProxyServerPatch * Included a CODE_STANDARD text file to help new developers make patches that are easier to integrate without too much manual editing. (Kenneth Lavrsen) * Added the missing rotate feature in the new netcam code (Bill Brack) snap11 * Updated the ffmpeg.c code so that Motion can now be built with ffmpeg CVS release from the June/July 2005 timeframe (Per Jönsson). http://www.lavrsen.dk/twiki/bin/view/Motion/FfmpegCodecPatch * Improved error handling of missing picture frames from camera. Especially network cameras will often not be able to provide a picture frame from time to time. Motion would retry before and eventually and rather quickly exit the camera thread and maybe completely exit. The improved handling now makes a copy of the previous frame for 5 seconds (longer if cpu_low is activated because the implementation is 5 X framerate frames) and then show a grey image with a message saying the connection is lost and an ISO format time stamp of first poor connection. (Kenneth Lavrsen). * Implemented version 2 of the NetcamErrorImprovementPatch which should work with the improved error handler. Changes include: * Changes handling of non-streaming camera to include a separate thread. * Changes the value returned from netcam_next to the motion main loop to indicate the status of the image returned. * Many changes to the comments, and some enhancement to the logic, to begin the implementation of points agreed on the NetcamRetryErrorDiscussion page. * Implements the triple-buffering scheme proposed by PeterHolik (but not the "Without Locking" portion of his proposal). Version 2 however does not seems to recover when an mjpeg stream resumes after a period of not being available. (Bill Brack) http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamErrorImprovementPatch * Note: Snap11 release as a developer sync release. Bug reports welcome. FreeBSD code changes not tested yet. Release * Netcam error handling improvements and cleanup from Valgrind analysis (Bill Brack). * Added a configure option --with-developer-flags which enables many compiler warnings that can be used by developers to make code more robust. Not for normal users building Motion (Bill Brack) * http-control: Fixed segfault when motion is restarted from command line ( kill -s 1 pid_motion ). Improved control code so Motion can Restart and Finish 'smoothly'. (Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/MotionHttpControl * Changed the 5 second missed camera signal timeout to 30 seconds. (Kenneth Lavrsen) * Fixed bug where an extra jpeg is saved if you have output_normal=best and you stop motion after an event has ended. (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x08x05x173526 3.2.1 Detailed changes for 3.2.1 since 3.1.19_snap3 snap1 * Major new feature. XMLRPC is replaced by a simpler http remote control interface (implemented by Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/MotionHttpControl snap2 * Fixed netcam->userpass problem (Angel Carpintero) * Added support in configure for athlon64 from http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x30x190907 (Angel Carpintero and William M Brack) * Fixed some gcc warnings (William M Brack) * Code cleanup from a valgrind analysis (William M. Brack). snap3 * Added Best Preview Patch (Joerg Weber) http://www.lavrsen.dk/twiki/bin/view/Motion/BestPreviewShot snap4 * Fix for tracking control with http control (Angel Carpintero) * Added the new feature Setup Mode (Joerg Weber). This also enables much more error messages given to the console when in non-daemon mode while still preserving the messages in syslog which are important for daemon mode debugging. The patch is still being worked on and is not finished. Changes in the FreeBSD code are not yet tested. http://www.lavrsen.dk/twiki/bin/view/Motion/SetupModePatch Remove most command line options and replace them by an option to specify location to motion.conf and a few options related to setting up motion. (Joerg Weber). This is also included in SetupModePatch. * Small improvement of the http control interface (link to setting itself on the html response when setting parameter) (Kenneth Lavrsen) snap5 * Fixed a bug in noise tune which was most visible at very low light. (Joerg Weber and Kenneth Lavrsen) * Further improvement in the setup mode. Messages are now prefixed by the thread number in [brackets]. Moved 2 functions from motion.c to picture.c. The setup mode patch is now considered finished. (Joerg Weber) snap6 * Netcam fixes and debug code by Christopher Price http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamStabilityPatch snap5_post1_video.c and snap5-post1 patches * Fixed netcam startup race condition. * Refactored image handling back to single unified function * Refactored reconnection algorithm * Jpeg only based connections should now use less cpu time * Temporarily removed support for devices that do not support content-length (in progress) * Synced syslog/printf style to new motion standard * Added developer debug trace defines/code * Defines now used for many constants snap7 * Improved console output in setup mode. Now also outputs threshold. (Joerg Weber) * Added some additional text to the motion http messages to the terminal so that you know where the messages come from. (Kenneth Lavrsen) Netcam Stability Patch version snap6-post1 (Christopher Price) * Added support for netcams without content-length header (streaming only) * Remove memmem from netcam_wget.[c|h] (no longer used) * Several miscellaneous code cosmetic changes * TODO: remove tests for memmem from configure snap8 * Added support for non-streaming (image based) netcams without content-length header. (3.2.1-snap7-post1 version of the Netcam Stability Patch by Christopher Price). * Improvement in the noise-tune algorithm (Joerg Weber) * Re-arranged many of the const char declarations so that they are always before any statements within a block { }. This is to avoid compiler errors with older but still used gcc versions such as 2.95. (Kenneth Lavrsen) * Changed the use of %zd to %llu in printf statements of size_t types. This is done to avoid compiler errors with older but still used gcc versions such as 2.95. (Kenneth Lavrsen) snap9 * Fixed even more gcc 2.95 compiler errors (declarations not at beginning of block) (Kenneth Lavrsen). * Removed a gcc 2.95 compiler warning (netcam.c:1036: warning: variable `pic' might be clobbered by `longjmp' or `vfork') (Kenneth Lavrsen) * The values for cnt->locate and cnt->new_img are now #defines in motion.h to enhance code readability (Kenneth Lavrsen). * The setting of sql_mask is now only done once per second to save CPU power (Kenneth Lavrsen) * Adding checking for conflict between control port and webcam port. Webcam port for a thread is disabled if it is set to the same value as the control port (Kenneth Lavrsen). * Fixed some file descriptor leaks in webcam.c and netcam.c (Christophe Grenier) * Added "motion-http:" prefix to error messages from the http control thread. (Kenneth Lavrsen) * Added additional error information when connection to MySQL fails (Kenneth Lavrsen) * Initiate cnt->event_nr to 1 to avoid code related to end of events and long mpeg films to be run during startup of Motion. (Kenneth Lavrsen) * Added new function in event.c close_anything_open() which is called from send_sms, send_mail and exec_command in order to prevent file descriptor and open sockets to be inherited by the shell causing freezing and instability. Code contributed by Christophe Grenier, Christopher Price and Kenneth Lavrsen. * Added new context global cnt_list.control_socket_server set by the httpd thread so that the above mentioned close_anything_open() can close open control sockets (Kenneth Lavrsen). * Renamed the top level global context structure to cnt_list so it can be reached from child threads and by above mentioned close_anything_open() (Christophe Grenier). snap10 * Fixed a problem when compiling with --without-v4l configuration. (Philip Marien) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x03x27x112843 * Threw away the file descriptor leak fix from snap 9 because it caused more trouble than it fixed. Removed the close_anything_open() and the cnt_list.control_socket_server field. Replaced it all with a simple piece of code that all server daemons call when started: setsid() followed by for (i=getdtablesize(); i>2; --i) close(i). Dirty and simple. (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x03x21x070534 * Fixed a bug where rate of fetching picture frames was disturned by the signal SIG_CHLD from exec_command programs terminating. The symptom was that the number of post_capture frames became inaccurate and motion in mpegs did not have constant time between frames. (Kenneth Lavrsen) * Fixed a bug where motion did not work with gap=1 (Kenneth Lavrsen). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x30x073616 * Added the feature gap=0 which now also works. It disables gap completely so that one single mpeg file is created. You can end the event from the remote control interface make movie feature using for example cron. This makes Motion close the mpeg and make a new with event number increased by one. (Kenneth Lavrsen) * Improved the http remote control action features so that makemovie and snapshot for thread 0 (all) works on all threads instead of being ignored (Kenneth Lavrsen). * Moved some code in the beginning of the motion_loop to a position later to improve the accuracy of time calculations for the framerate (Kenneth Lavrsen) * Updated code so Motion again runs on FreeBSD (Angel Carpintero). * Removed check for memmem from configure (Angel Carpintero). * Updated http control interface so that an additional check is done before saving config files (Angel Carpintero). * Fixed a problem with URLs http://192.168.1.3:8080/0 which did not work without a trailing space (Angel Carpintero). snap11 * Implemented new Generic onxxxx features. Function --- Old Option --- New Option Start of event (first motion) --- execute --- on_event_start End of event (no motion for gap seconds) --- New! --- on_event_end Picture saved (jpg or ppm) --- onsave --- on_picture_save Movie starts (mpeg file opened) --- onmpeg --- on_movie_start Movie ends (mpeg file closed) --- onffmpegclose --- on_movie_end Motion detected --- New! --- on_motion_detected http://www.lavrsen.dk/twiki/bin/view/Motion/OnXxxCommandsPatch and http://www.lavrsen.dk/twiki/bin/view/Motion/OnXxxxFeatureDiscussion (Joerg Weber) * More Netcam Stability Fixes (snap10-post1-6) (Christopher Price) http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamStabilityPatch * Destroy mutexes in netcam_cleanup(). * Add reconnection for netcam_start() - this may block other cameras from starting up!. * Added additional defines for reconnect retries. * Change reconnection timeouts to 60 seconds. * Reworked close(sock) in netcam_connect, to insure future changes won't forget to close the socket. * Reworked reconnection for netcam_start() - disabled by default, see source for INIT_RECONNECT_RETRIES. * Break some long lines in code. * Replaced sleep with nanosleep per suggestion by Kenneth Lavrsen. * Added additional header validation check. * Changed a couple fd references to use RBUF_FD. * Added error message if jpeglib error occurs. * Removed additional header validation check. * Limited times headers will be checked. * Removed mutex lock around netcam_start() in video.c, hopefully race conditions are fixed. * Added additional headers in http request. * Added back header validation (should fix netcam_read_header lockups). * Detect when there is no data on socket in netcam_read_ functions (should fix netcam_read_image_contentlength() and netcam_read_image_no_contentlength() lockups). * Rearranged timeout assignments for pthread_cond_timedwait() calls. * Adjusted TIMEOUT_COND_WHICH to 4 seconds. * Improvements of motion.conf help comments including improvements in new onxxxx options. (Kenneth Lavrsen) snap12 * Fixed a bug in the rgb2yuv420p function. (Daniel Ladd) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x03x30x011107 * Fixed a bug of locate feature for movement images combined with the new output_normal best feature (Joerg Weber) * More Netcam Stability Fixes (snap11-post1-4) (Christopher Price) http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamStabilityPatch * Reworked thread signal/wait conditions, should fix some race conditions. * Use gettimeofday() to determine thread timeouts, results in better accuracy. * Adjusted condition timeouts to smaller values due to usage of gettimeofday() and rework of thread signal/wait conditions. * Adjusted reconnection retries to 60 (every minute for an hour). * Fix bug where motion will not quit if requested when reconnecting. * Cruft, feature creep and redundant code removed. * Consolidated reconnection capability to unified netcam_reconnect function. * Rework netcam_start logic, minimize startup variables. * Rework netcam_stream_read and netcam_single_read logic. * Minor changes to netcam_next logic. * Fix bug in streaming camera without content-length, recent mod broke. * Fix bug in startup of single image reads without content-length. * Motion Guide refactored completely for 3.2.1 with better web navigation and auto generation of pages. Makefile updated so that the Motion TWiki topic MotionGuideOneLargeDocument is fetched when updating the guide and making releases. (Kenneth Lavrsen). snap13 * Removed the debug_parameter option which had no use. Programmers can still use it because the code is only commented out. This change required a small update in the code that rewrites motion.conf so that a remote control command to write the config files still adds a text header for the thread section at the end of motion.conf (Kenneth Lavrsen). * Changed the default values for a few options: quiet on, webcam_maxrate 1, threshold_tune off, webcam_quality 50 (Kenneth Lavrsen). * Changed some cosmetics in the way motion.conf is written (space after #) (Kenneth Lavrsen). * Updated the motion-dist.conf to use default values unless there is a reason not to (Kenneth Lavrsen). * Fix the compile issue with official ffmpeg packages from debian (Angel Carpintero). * More Netcam Stability Fixes (snap12-post1) (Christopher Price) * Newrote url parser, better syntax checking and error handling of urls. * Userpass now allowed in url (http://user:pass@example.com/). Netcam_userpass has precedence, it will override a userpass embedded in the url. http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamStabilityPatch snap14 * Added basic authentication to the http control interface introducing new config option control_authentication. (Angel Carpintero) * Fixed memory leak when restarting Motion from http control (Angel Carpintero). * Small improvement in configure script for Debian (Angel Carpintero) * Added the ability to clear an option to off (bool), 0 (int) or undefined (string) by submitting blank entry field in the http control interface. (Angel Carpintero). snap15 * Added new feature which shows the fixed mask (in addition to the smart mask) in bright red on the Motion type images (Joerg Weber). http://www.lavrsen.dk/twiki/bin/view/Motion/FixedMaskFileOnMotionImagesPatch * Added new feature. When you specify a mask file in the config file and start Motion, and the mask file does not exist, Motion will create a new clear (white) mask file for you in the right size. Then it is easy to simply open the file in your favourite paint program and add the masking in black (Joerg Weber). http://www.lavrsen.dk/twiki/bin/view/Motion/FixedMaskFileOnMotionImagesPatch * Fixed a bug in the low_cpu feature where cpu load increased instead of decreasing because the framerate calculations were completely wrong. This was an old bug introduced in 3.0.1 (Kenneth Lavrsen). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x04x24x205933 * Improved the auto-brightness algorithm. When auto-brightness is enabled the brightness option becomes a target value for the brightness level. This should also close a bug report (Kenneth Lavrsen). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x02x26x195358 * http interface small fixes (motion-3.2.1_snap14-small-fixes 1.1) incl Add 'back' link to response_client errors (Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/MotionHttpControl * Started adding tuner_number as option. This is not fully implemented. First code is added and rest will be done in next snap. (Kenneth Lavrsen) snap16 * Made the http control interface more RFC compliant (Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x02x180550 * Made the http control HTML responses nicer to look at as sources and therefore easier to debug errors (Kenneth Lavrsen). * Code style cleanup of webhttpd.c (Kenneth Lavrsen). * Fixed compatibility problem with Palantir. Fixed by making output more compatible with RFC (\r\n). Original fixes by Roberto Spadim and Angel Carpintero. However this fix made Firefox flicker even more than it normally does. Final fix which works in both Palantir client, Firefox and Cambozola was made by Kenneth Lavrsen. This closes the following bugs: http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x02x205307, http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x07x042849 snap17 * Fixed small bug when pre_capture buffer is resized during operation. (Joerg Weber). * In httpd control code: Fixed RAW syntax following API specs. (Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/MotionHttpControl * Added new conversion specifiers: %D (diffs), (noise) %K (motion center x), %L (motion center y), %i (locate width x) and %J (locate width y). These changes also required a refactoring of the alg_locate code. This change is part of the implementation of a generic tracking feature and it enables implementing external programs that can perform simple prediction features. (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/ExtendReplaceConversionSpecifiersDiscussion http://www.lavrsen.dk/twiki/bin/view/Motion/GenericTrackingPatch * Fixed a bug in switchfilter which caused motion detection to not work when the feature was enabled (Kenneth Lavrsen). Release * Change the working directory to / in daemon mode. This way you don't have to kill motion to umount the partition from where you start it. (Christophe Grenier) http://www.lavrsen.dk/twiki/bin/view/Motion/ChdirNetCamWgetPatch * In netcam-wget header_get() didn't always in add a \0 string terminator. This was fixed by Christophe Grenier http://www.lavrsen.dk/twiki/bin/view/Motion/ChdirNetCamWgetPatch * Fix for Unknown content type with lumenera cameras (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x06x174416 * MotionHttpControl Patch motion-3.2.1_snap18-pre1 v,1.0 19 May 2005. Fixed some HTTP response codes and added header copyrights. (Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/MotionHttpControl * Implemented pthread fix by Christophe Grenier. http://www.lavrsen.dk/twiki/bin/view/Motion/PthreadFixPatch * Fixed problem compiling "ffmpeg reports only YUV420 is supported" when ffmpeg is a recent CVS version. (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x22x213229 * Man page updated. It is now semi-autogenerated in the Motion TWiki (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/MotionOptionsAlphabeticalManpage * Bug fix in netcam code: Sometimes motion try to free an invalid memory area (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x21x105335 * Small configure fix related to --without-v4l (Angel Carpintero) * Fixes for http control HTML code (Angel Carpintero) * Added init script to RPM (Angel Carpintero) 3.1.19 Detailed changes for 3.1.19 snapshot releases since 3.1.18 snap1 * Fixed bug which caused Motion 3.1.18 fail to save timelapse mpegs when setting ffmpeg_timelapse = 1 (fixed by Michael Reuschling) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x31x211756 * Fixed several bugs in new netcam code introduced in 3.1.18 (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x16x030209 http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x02x01x071546 http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x02x03x035918 * Added patch that enables Motion to work with vloopback version 0.94 and kernel 2.6.10+. (patch by William M Brack). http://www.lavrsen.dk/twiki/bin/view/Motion/MotionAndVloopbackVideoDotCPatch snap2 * Following bugfixes all by Angel Carpintero * Netcam code: Change printf() to fprintf(). * Netcam code: Cleanup memory netcam (netcam.c , motion.c ). * Netcam code: Redesign of reconnection feature. * Configure: Added debug , conditional compile of xmlrpc-c * Fix a non allocated pointer to be freed. * Added fix to BugReport2005x02x11x170019 * Added fix to BugReport2005x02x11x150802 snap3 * Bugfixes by Angel Carpintero * fix motion.spec, motion.spec.in * typo in configure.in , configure.in.freebsd * fix version number 3.1.18 Formal Release - Summary of changes since 3.1.17. * Removed the Berkeley mpeg feature * New brightness, contrast, hue and saturation options. * Makefile with automatic check of dependencies and nicer user output. * Improvement of the rotate feature. * Added the new smart mask feature. * Added a new config option --without-optimizecpu which disables CPU specific compiler optimizations. * Configure help texts improved. * Added the pwc-10.0.5 version of pwc-ioctl.h. Also good for pwc 10.0.6. * Changing rotate, height and width via xmlrpc no longer affects the running program. This change is done because many internal data structures and memory allocations cannot handle change of image dimensions/size. * Enabled use of leading spaces when changing text_left and text_right via xmlrpc by using quotation marks if the value starts with a leading space. * Speed optimizations for dilate and labelling code. * Significant speed improvement in the motion detection algorithm. * Motion images are now gray scale instead of green. Smartmask is shown in red. * Implemented FreeBSD auto-detection CPU/ARCH fix. * Removed the never finished prediction feature. * Implemented a major improvement of noise_tune. * Implemented ffmpeg-0.4.9 support. * Default for option 'ffmpeg_video_codec' is now mpeg4. mpeg1 is now only supported with the old ffmpeg-0.4.8. * Option 'output_normal' value set to 'first' makes Motion only save a jpeg from the first motion detected picture frame in an event. * Implemented Streaming Netcam Without Curl which enables connecting to network cameras both with single jpeg frame mode and streaming mjpeg mode. This enables much higher framerates with Netcams. * Corrected a small error in the usage help text * Improved the help and doc texts for config option night_compensate. * Improved the signal handling of ctrl-C and kill. * Implemented a POSIX compliant SIGCHLD signal handler to avoid floods of warnings and script zombies in some RedHat versions. * Reporting of the changes of noise detection level is now only displayed in the console (daemon off) when the always_changes option is enabled. * Made the code in xmlrpc more correct and robust (handling of select()). * Fixed several bugs in the timelapse feature. Detailed changes for all 3.1.18 snapshot releases since 3.1.17 snap1 * Removed the Berkeley mpeg feature (code commented out) * Implemented a bugfixed version of http://www.lavrsen.dk/twiki/bin/view/Motion/BrightnessContrastPatch Released as snapshot for developers to merge other patches. The snap1 is not recommended for normal use. snap2 * Improved the Makefile with automatic check of dependencies and nicer output for the user. http://www.lavrsen.dk/twiki/bin/view/Motion/MakefileWithAutoDependencies * Implemented first phase of the rotate patch. Need to fix the storage method for image height and width http://www.lavrsen.dk/twiki/bin/view/Motion/RotatePatch snap3 * Implemented phase 2 of the rotate patch * Added brightness patch options to motion-dist.conf snap4 * Added the new smart mask feature. It is working but it is still under development. It currently outputs an extra smart mask timelapse movie when the normal timelapse is enabled. This will be removed in the final version. http://www.lavrsen.dk/twiki/bin/view/Motion/PatchSmartMask * Added a new config option --without-optimizecpu which disables the CPU specific compiler optimizations introduced with the rotate phase 2 patch. The purpose of the new option is to enable a packager to build an RPM or deb package which is not tied to a specific CPU type. * Man page updated with the new brightness and smart mask options. * Configure help texts improved. * Added the pwc-10.0.5 version of pwc-ioctl.h. * Changing rotate, height and width via xmlrpc no longer affects the running program. The user can change the options and write them to the config files and then restart motion. This change is done because many internal data structures and memory allocations cannot handle change of image dimensions/size. * Fixed the problem with leading spaces of text_left and text_right getting lost when saving with xmlrpc. For text_left and text_right Motion now puts the string in quotation marks if the value starts with a leading space. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2004x10x24x135840 snap5 * Implemented the November 10 update for smartmask * Started resolving some of the signed vs unsigned char problems. There is still much to do here. snap5 is released to make the developers up2date. snap6 * Merged in the DilateNineSpeedPatch http://www.lavrsen.dk/twiki/bin/view/Motion/DilateNineSpeedPatch * Changed a few image char definitions to unsigned char. Still many to fix. snap7 * Implemented the 15-Nov-2004 Smartmask patch which removed the smartmask debugging timelapse code and instead adds the smartmask info to the motion images and jpegs as red areas. Normal motion is shown in black and white (greytones). This concludes Joerg Webers smartmask feature. The patch is now in ReleasedScheduled state for 3.1.18. * Implemented Angel Carpintero's FreeBSD auto-detection CPU/ARCH fix. * Merged in Per Johnsson's DilateFiveSpeedPatch http://www.lavrsen.dk/twiki/bin/view/Motion/DilateFiveSpeedPatch * Removed the prediction feature from the code (commented out for now). * Included fix by Jan X. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2004x11x13x202132 snap8 * Implemented an improvement of Smartmask so that the mask is cleared when the smart_mask_speed is set from a non-zero to zero (by Joerg Weber) * Implemented an improvement of noise_tune with smart mask (and probably also in general) (by Joerg Weber) * Improved the picture control function so that cameras are only probed when needed to avoid USB errors. (Kenneth Lavrsen) * Implemented new ffmpeg patch (Per Jönsson) http://www.lavrsen.dk/twiki/bin/view/Motion/FfmpegPatch049 * Implemented new preview patch (Joerg Weber) http://www.lavrsen.dk/twiki/bin/view/Motion/PreviewShotsPatch * Removed commented code from obsolete Berkeley and Prediction features * Implemented labelling speed patch (Per Jönsson) http://www.lavrsen.dk/twiki/bin/view/Motion/LabelingSpeedPatch snap9 * Implemented Streaming Netcam Without Curl which enables connecting to network cameras both with single jpeg frame mode and streaming mjpeg mode. This enables much higher framerates with Netcams. (by Christopher Price and Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/StreamingNetcamWithoutCurl * Implemented a significant speed improvement in the motion detection algorithm (by Per Jönsson). http://www.lavrsen.dk/twiki/bin/view/Motion/AlgDiffStandardMmxPatch * Fixed a small bug which caused in jumpy mpeg1 videos with ffmpeg 0.4.8. snap10 * Corrected a small error in the usage help text http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x05x174139 * Improved the help text for config option night_compensate in docs, conf.c, motion man pages and config file. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x06x103939 * Improved the Netcam patch (Angel Carpintero) http://www.lavrsen.dk/twiki/pub/Motion/StreamingNetcamWithoutCurl/ (pre2 patch fixes problem with not detecting Content-length and segfaults in netcam) * Improved the signal handling of ctrl-C as suggested by Per Jonsson http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x06x181426 * Implemented a POSIX compliant SIGCHLD signal handler as replacement for the traditional signal(SIGCHLD, SIG_IGN) which can cause floods of warnings in some RedHat versions. (Angel Carpintero and Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2004x10x26x134906 * Changed the reporting of the changes of noise detection level so that it is only displayed in the console (daemon off) when the always_changes option is enabled. (Kenneth Lavrsen) * Changed the ffmpeg>0.4.8 = no mpeg1 gcc warning message so that it is clear to people that it is information and not an error message. snap11 * Changed allocation of despeckle buffer to avoid a segfault when using a netcam where the image is wider than defined in motion.conf width. * The noise tune value displayed in the upper left corner along with number of changed pixels is no longer displayed (was there for debugging). * Improved the Netcam patch (Angel Carpintero) http://www.lavrsen.dk/twiki/pub/Motion/StreamingNetcamWithoutCurl/ (pre3 reconnection feature added) * Changed the SIGCHLD handler introduced in snap10 so that it is a shorter and faster function. Disabled this handler in the xmlrpc thread as this caused unnecessary loops of cpu cycles. Additionally made the code in xmlrpc more correct and robust (handling of select()) (Kenneth Lavrsen) * Fixed a bug in the timelapse feature. Both the rollover events of the timelapse video and timelapse shots could be missed if the CPU load was very high or the time was changes by ntp. Motion will now catch up a few seconds later if this happens. Also fixed the code for monthly rollover (Kenneth Lavrsen). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x23x133554 Release * Fixed a bug in the timelapse feature. Both the rollover events of the timelapse video and timelapse shots could be missed if the CPU load was very high or the time was changes by ntp. Motion will now catch up a few seconds later if this happens. Also fixed the code for monthly rollover (Kenneth Lavrsen). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x23x133554 * Small improvement in timelapse feature so that an image is added when the new mpeg is created and not waiting till the following timelapse (Kenneth Lavrsen). * Small improvement so that the timelapse rollover happens on the hour and not one timelapse past the hour (Kenneth Lavrsen). 3.1.17 Bugfix release snap1 * Removed annoying debug syslog message (input: #) * Implemented Peter Ilin's patch for handling vloopback pipes better when Motion receives SIGTERM or SIGHUB. * Implemented fix for compiling errors when building the FreeBSD version without bktr support. (http://www.lavrsen.dk/twiki/bin/view/Motion/FreeBSDFixCompile) * Commented out many unnecessary syslog debug only messages. The commented out code was first patched by Mike Lees patch related to syslog causing instability and hanging motion processes. (http://www.lavrsen.dk/twiki/bin/view/Motion/SyslogEventPatch). * Included Kalle Andersson's patch that ensures that Motion detaches from the stdin and stout devices so that a secure shell that was used to start Motion in daemon mode does not hang when you exit the shell. (http://www.lavrsen.dk/twiki/bin/view/Motion/DaemonDetachFromSTDIO) snap2 * Implemented a new lightswitch feature so that is now triggers lightswitch detected based on the percentage of pixels set by the lightswitch option which is now an integer instead of a boolean. When lightswitch is detected motion skips 5 frames to allow camera to settle. * Fixed a bug in the autobrightness function. * Fixed a bug in netcam_start() - wrong imgs.size calculation Release * Swapped width and height parameters in some functions. This has no influence on program execution. Just a cosmetic change. 3.1.16 Bugfix release snap1 * Fixed a configure error related to xmlrpc. * Fixed a bug in the SQL code related to file type. Release * Fixed a segfault problem in alg.c related to the locate feature. * Made motion more robust to whitespace in its config files. It now accepts CR LF (DOS/Windows) and whitespace only lines no longer gives warning messages in syslog. Also cleaned up the conf.c function structure a little bit. 3.1.15 Summary of changes from 3.1.14 to 3.1.15. New features: * ffmpeg now supports mpeg4 and msmpeg4 in addition to mpeg1. Timelapse mpegs are always made with mpeg1 because this allows appending to existing mpeg when motion or timelapse is restarted. This also meant a change of the configure option --with-libavcodec to --with-ffmpeg which now needs to point to the parent directory that holds libraries. * configure has been significantly improved so that most people can simply run ./configure, make and make install with no parameters and all libraries should be detected automatically if they are installed like in most distributions. * rotation feature added which allows the camera to be mounted upside down or in portrait. * SQL (Postgres and MySQL) table format has been changed. The time related fields such as minute, hour, day, month and year has been replaced by a timestamp field called 'time_stamp'. Additionally a field called 'frame' has been added so that each file can be correctly sorted based on time_stamp and frame (picture frame number within one second). An additional field called 'text_left' stores the displayed text given by config option 'text_left'. And a field 'camera' has been added which stores the thread number. * The %v (event) prefix has been removed from the default filename for timelapse mpegs. It makes little sense to have the current event number as part of the timelapse filename as default. * A new feature called 'labeling' was added which is a great enhancement to the motion detection algorithm. It ensures that only the largest area of movement is included in the detection and it prevents noise and wind from making false detection. It should also make tracking work better. * Angel Carpintero ported motion and it's main features to freeBSD. The freeBSD is still very much beta and because of limited access to hardware we need more people to test the various features. * Motion is now also released as an RPM with both mysql, postgres, libcurl and ffmpeg support. Bugfixes: * Fixed the problem with default strings being written to thread config files when using the XMLRPC command motion.conf.write. * Implemented improvement of vid_putpipe so that Motion does not spend time writing to a vloopback device which is not there. * Introduced reporting to syslog of writing to vloopback fails. * Memory clean-up improvements when Motion exits normally. * Fixed a small bug related to the filename given for onffmpegclose. * Provided more improvements of error handling. * Added additional error reporting to console. 3.1.15 Snapshot releases snap1 * Fixed the problem with default strings being written to thread config files when using the XMLRPC command motion.conf.write. snap2 * Implemented Ryan Ayers improvement of vid_putpipe so that Motion does not spend time writing to a vloopback device which is not there. Also introduced reporting to syslog of writing to vloopback fails. * Ryan Ayers improved configure's ability to find custom installations of ffmpeg. * Ryan Ayers provided misc. cosmetic changes in the code. * Ryan Ayers rewrote the ffmpeg functions completely added support for new codecs/formats mpeg4 and msmpeg4. mpeg1 was improved also. snap3 * Implemented Ryan Ayers simplified ffmpeg patch where 10 ffmpeg functions are reduced to 5. The memory leak related to an unused filehandle has been resolved. * Kenneth Lavrsen solved the timelapse related .mpeg.mpeg filename error. * Kenneth Lavrsen removed the memory leak in ffmpeg.c related to the use of strdup without a free. snap4 * Implemented Ryan Ayers snap3 based ffmpeg patch that cleans up the code significantly, forces timelapse. The list of improvements: * Forces timelapse to mpeg1 for the time being. * Removes FILE* f declaration in ffmpeg.h since we no longer need it. * Removes all picture_buf references. This was carried over from output_example.c in ffmpeg-0.4.8. However, we don't need it. That is allocating space for picture->data, but motion already takes care of this for us with the newimg variable. * Removed some old commented code ... tmpfilename, picture_buf stuff. * Included Angel Carpintero's memory clean-up improvements when Motion exits normally. snap5 * Added Per Jönsson's rotate feature. When set to non-zero some extra CPU time is used for the rotation. * Kenneth Lavrsen changed the ffmpeg code so that mpeg1 files are created using the libavcodec method and mpeg4 and msmpeg4 are created using the new libavframe method in ffmpeg. * Kenneth Lavrsen added seconds and frame fields to the database feature. This means that users must add these two fields to the table "security" in existing databases when upgrading to 3.1.15. * Kenneth Lavrsen removed the %v (event) prefix from the default filename for timelapse mpegs. It makes little sense to have the current event number as part of the timelapse filename as default. snap6 * Kenneth Lavrsen fixed a small bug related to the filename given for onffmpegclose. * Joerg Webers added the new labeling motion detection feature. * Angel Carpintero provided more improvements of error handling. snap7 * Kenneth Lavrsen changed the configure option --with-libavcodec to * --with-ffmpeg and updated Guide and man pages and text in code and config file to match the new shared library way of using ffmpeg * Angel Carpintero ported motion and it's main features to freeBSD. The freeBSD is still very much beta and because of limited access to hardware we need more people to test the various features. * Angel Carpintero created an updated specs file that enables Kenneth to build RPMs of Motion. snap8 * Kenneth Lavrsen added the new fields to the SQL security table camera (thread number), text (text_left) and time (timestamp). * Angel Carpintero improved error handling for the webcam functions. Release * Kenneth Lavrsen simplified the sql functions (1 instead of 3) and ensured that the text field is not assigned when text_left is an empty string. This allows for the field to be auto defaulted. * Added additional error reporting to console. 3.1.14 2004 May 31 * Included Ian McConnell's fix for snapshots when using the "lastsnap" filename. * Fixed the bug in advanced filename and text feature when event numbers go higher than 99. * Included Angel Carpintero's improvement of configure reporting of missing shared libraries (Kenneth Lavrsen improved it a little further). * Included Ian McConnell's timelapse close mpeg file when set to zero patch. * Changed motion-control to make a proper output from motion.conf.list. * Renamed ffmpeg_timelaps to ffmpeg_timelapse (we change now or never) * Corrected man page (\n). * Added setting access rights to 644 (755 for configure) when doing make dist. * Small improvement on xmlrpc-api.html document. * Included Angel Carpintero's fix for building motion without ffmpeg (missing #ifdef round newly added ffmpeg timelapse code) * Fixed missing init of viddev.frequency causing VIDIOCGCHAN errors. * Included Angel Carpintero's snap2 based patch for improving configure. XML-RPC changes of threshold and noise_level are now being used as long as threshold_tune and noise_level are not enabled. * Enabled the round robin feature to also work by changing frequency on the same device and same input. * Fixed the pre_capture feature so that it also stores the jpegs properly. * Fixed the ffmpeg_timelapse feature so that the calculated time is correct and the current image is used instead of an old image from position 0 in the pre_capture ring buffer. * Fixed ffmpeg routines so that also graytone images can be pre_captured and used with ffmpeg_timelapse. * Fixed the position of the incrementing of shots in the motion_loop so that it is correct before any functions use it. * Added quite many comments to the code to make it easier to maintain (more comments will be added). * Removed some old debugging printf's that were displayed in non-quiet mode. * Changed to snapshot feature from being alarm driven to being timer driven. This means that each thread can have its own interval value. The XML-RPC motion.action.snapshot still works. The SIGALRM method has been changed so that all thread that have the snapshot_interval non zero will take a snapshot when being signaled with SIGALRM. A negative value for snapshot_interval will activate the SIGALRM trigger but not the timing interval. * Implemented ffmpeg_timelapse_mode feature by James A. Russo. * Implemented RH (sysV) and Debian type control scripts for /etc/init.d by Angel Carpintero. * Implemented enhanced SQL features by James A. Russo. This adds logging of mpeg and prediction events to MySQL/PostgreSQL. James patch also replaced the mime file types by a more refined filetype scheme that allows more refined control for SQL and other future control. * Kenneth Lavrsen changed the enhanced SQL config from single sql_mask option to 5 sql_log_ options for more user friendly control. * Implemented Daniel Sterlings minimum_motion_frames feature. * Plugged a memory leak in the pre_capture feature. * Changed the behaviour of onsave back to original mode where also snapshots causes onsave command to be run. * Fixed a bug in frequency setting of V4L device. * Renamed snapshots_interval and snapshots_filename to snapshot_interval and snapshot_filename. * Changed the webcam_port value to 0 in motion-dist.conf to avoid that people get segmentation faults when having 2 or more cameras and * webcam_port not set in the thread config files. * Implemented Daniel Sterlings improved handling of config strings. This plugs the memory leak when changing string type options via XML-RPC. * It also makes the memory handling more elegant/optimal and finally it now allows strings to be as long as allowed by the environment variable PATH_MAX. * Kenneth and Daniel added many comments to motion.c and conf.c. * Daniel Sterling made the XMLRPC able to handle errors without crashing. * Daniel Sterling and Kenneth Lavrsen added a feature that checks for two threads having the same webcam_port. If this is the case the last thread gets its webcam disabled and a warning message is written to console and syslog. * Implemented Daniel Sterling's fix for a small calculation error in alg_diff_fast(). * Small improvements in messages sent to console and syslog during startup of Motion. 3.1.13 * Included Ian McConnell's despeckle feature (including extra improvement of the original patch). * Changed the name of motion.conf to motion-dist.conf to avoid make install overwrites your perfectly OK working motion.conf file when you re-install. * Updated the motion.spec.in. Not tested yet. * Included Matthias Kilian configure patch which enables configure to find and use a dynamic library of ffmpegs libavcodec.so . * Included Steffen Haas improved on screen display patch (plus some extra characters including a real space). * Changed the parsing of the motion.conf and thread.conf files so that spaces are now allowed. This also enables using a space in the user text. For XML-RPC you put text in "" if you need spaces. * Changed the XML-RPC function motion.conf.write so that undefined config options gets written into the main motion.conf file with the help line and the option prefixed by a '#'. Example # netcam_url value. * Added Mike Lees onffmpegclose feature which enabled a command to be executed each time a file generated by ffmpeg is closed. * Added Daniel Sterlings night compensate fix. * Added Angel Carpintero's improved configure process which automatically detects presence of xmlrpc-c and ffmpeg and makes the Makefile accordingly. * Included Ian McConnell's flexible on screen display feature and flexible strftime based path names. * Changed conf.c so that xml-rpc command motion.conf.write creates a much more user friendly motion.conf file. * Modified Ian's on screen display putting back the config parameter (draw)text_changes. If enabled the number of changed pixes are shown in the upper right corner of the image. * Removed the snap_override feature and reduced the oldlayout to an Berkeley mpeg_encode feature only renaming it to berkeley_single_directory. Instead the flexible filename feature now has oldlayout as default and the "new" directory layout specified in the motion.conf file. * Motion.conf sequency re-arranged so the important things comes first. * Changed names of many options to be more user friendly. * Renamed the options for displayed text to text_right, text_left and text_changes. * Change the parsing of config files so that the argument can be in quotation marks (" or ') allowing leading spaces for the text_left and text_right options. This means that you can place the text anywhere on the picture by using spaces and new lines \n. 3.1.12 * Removed vid_keepalive * Added reentrant warning to codestyle answer in FAQ. * Rewrite of PWC tracking code. * Tracking is inactive by default. * Motion-control action.quit fix. * Netcam with mask fixed. * Added tracking options to xmlrpc interface. * Ignore SIGPIPE (crashes webcam code). * Changed fast algorithm to imgs.size/10000 steps. * Renamed prerecord to pre_capture to be more consistent with post_capture. * Redone pre_capture completely. 3.1.12 rc1 * added pre-record. with configparameter n_prerecord one can set the number of frames that should be recorded *before* the motion starts. for this feature to work, you need to set post capture to at the value given for n_prerecord! also: n_prerecord must be at least 1 3.1.11 * found 2 memory-leaks (two 'FILE *' were not closed) in the webcam-interface * started working on support for logitech sphere/orbit tracking fixed bug in tracking routines (would sometimes use garbage coordinates) * added max-number-of-frames-limit to the webcaminterface (patch by Jeroen Vreeken) 3.1.10 * added Kenneth's fixes for ffmpeg instability and the problem with the "ioctl(VIDIOCGCHAN): Invalid argument" error * small optimisation of rgb24toyuv420p (about 6% faster) so for certain video-devices things might be a little faster * optimized alg_diff_fast: about 50% faster made it compile again with 2.6.0-test9 * noise tuning is now only done when there's no motion! * noise is resetted to the median of the tuned value and the configured value as soon as no motion is detected * fixed includes for mysql/psql (thanks Felix Finch!) 3.1.9 * motion now logs to syslog instead of stderr, that way it is still possible to see what is going wrong when motion runs as a daemon process. * motion will now exit nicely when memory allocation fails instead of segfaulting * low_cpu now takes the number of frames per second to process when no motion is detected instead of on/off * "quick motion detection" is now only performed when motion is in "idle" mode. * added Kenneth's patch: motion with ffmpeg-0.4.8 now compiles again! * small optimisation: if a file is created, the path is now only recreated when it did not already exist. 3.1.8 is the last version release by Jeroen Vreeken. New maintainers are: Kenneth Lavrsen (http://www.lavrsen.dk/) and Folkert van Heusden (http://www.vanheusden.com/). 3.1.8 Froze 3.1.8 Can't use the same variable name twice in ppm code... 3.1.7 Froze 3.1.7 Added codingstyle answer to faq yuv to rgb conversion for ppm images. Webcam close and denial of service fixes. Renamed roundrobing to roundrobin. Don't try to compile in xml-rpc support when not defined. 3.1.6 Froze 3.1.6 Added output_all option for continuous file saving. Fixed picture saving on rgb files. Fixed off-by-one error in framerate calculation. 3.1.5 Froze 3.1.5 Added motion.action.quit to xml-rpc api. Changed v4l code to convert rgb to yuv420p and removed support for rgb24 from all other files. Removed read() support from v4l code. Changed netcam code to output yuv420p images. Fixed libavcodec.h include in ffmpeg.h 3.1.4 Froze 3.1.4 Fixed ffmpeg segfault. Removed motion.conf* from install section in Makefile Fixed mail option. Fixed conf list hang. 3.1.3 Froze 3.1.3 Made timelaps interval variable. Added motion.conf.write to xmlrpc API Motion can write its own config file. Changed xmlrpc API to use strings for all option types. Added comment fields for config options. Added additional settings for ffmpeg. 3.1.2 Froze 3.1.2 Use SO_REUSEADDR on http listen sockets. Added control_localhost and webcam_localhost options for binding servers to the loopback interface (default=on). xmlrpc-httpd now uses nonblocking io allowing for multiple connections to be handled at the same time. Set default for 'threshold_tune' and 'noise_tune' to yes. Added threshold_tune config option. 3.1.1 Froze 3.1.1 Sync with 3.0.4 Added xmlrpc motion-control. Changed description output to match input format. Added Server and Connection fields to the webcam code. Added threshold_tune????? for autotuning the max_changes level. Added noise_tune option for autotuning the noise level. Sync with 3.0.3 3.1.0 Froze 3.1.0 Added predict evaluation. Added predict_description config option. Started with predict functions. Forked from 3.0.2 3.0.2 Froze 3.0.2 Changed strtok() call for argument in conf.c arguments with '=' in them are now allowed. 3.0.1 Froze 3.0.1 Added 'dist' and 'updateguide' options to Makefile. Added motion_guide.html to documentation. Fixed mpeg names when using oldlayout. Updated manpage. Added check to low_cpu frame_delay calculation for a maximum of 1 second. 3.0.0 Froze 3.0.0 Added string.h to ffmpeg.c 2.9.12 Froze 2.9.12 Added ffmpeg_bps option. Fixed devpipe instead of devmpipe in motion.c 2.9.11 Froze 2.9.11 Added all config files to examples in Makefile Fixed YUV422 converter for real :) Use 2 as minimum fps for ffmpeg (less produces a floating point exception) 2.9.10 Froze 2.9.10 Fixed YUV422 to YUV420 converter. Fixed oldlayout for ffmpeg files. Added -lz for mysql. Removed TODO from makefile. 2.9.9 Froze 2.9.9 Fixed leaks in webcam.c Fixed mask image use (imgs.motionsize instead of imgs.size) Don't try to detect motion with threshold set to 0. 2.9.8 Froze 2.9.8 Always try to remove snapshot link. Cleaned up config file. Cleaned up ppm code, now loads pgm greyscale files. Fixed max_mpeg_time segfault in ffmpeg close event. Added -lm for libavcodec. Updated FAQ. Added timelaps option. Fixed SIGHUP handling. Added /usr/local/mysql/include and /usr/local/mysql/lib to configure script and fixed bogus error message. Fixed snapshot location (missing filepath) 2.9.7 Froze 2.9.7 Fixed some more #endif statements Use cnt->lastrate for ffmpeg framerate. Fixed ffmpeg code for RGB and GREY images. Added YUV422 support (converted to YUV420P) Added roundrobing on frequency. 2.9.6 Froze 2.9.6 Tweaked autobrightness mode. Added webcam_maxrate option. Reversed image and boundary in webcam code. Added framerate control. Added webcam_motion config option. New frame_limit code. Fixed include files for ffmpeg.h Code cleanup. Removed SIGHUP handler. Removed draw on motion images. Added speed and stepsize options to tracking code. Reversed the night compensation. Removed ffmpeg error in max mpegtime code. Fixed #endif statements in header files. Changed 'deamon' to 'daemon' 2.9.5 Froze 2.9.5 Added missing time.h define in webcam.c Added 'frequency' option for v4l tuners. Fixed max mpeg time with ffmpeg encoding Added path for mpeg_encode (problems with PATH variable) Fixed deamon mode. Changed overlay to white on black (more readable). 2.9.4 Froze 2.9.4 Added webcam option. Moved reference image update before draw() Added fclose() to put_picture() 2.9.3 Froze 2.9.3 Added GNU license to all file headers. New netcam code Fixed snapshot filenames Use correct image sizes (no more width*height*3) 2.9.2 Froze 2.9.2 Added ffmpeg code (from monitor) for realtime mpeg encoding. Moved image creation to event.c Moved put_picture functions to picture.c Added support for Y plane images (YUV420P and GREYSCALE) Set default jpeg quality from 50 to 75 PostgreSQL support Moved event handlers from motion.c to event.c Introduced new event() functions. Updated xml-rpc rmon code. 2.9.1 Froze 2.9.1 Fixed lastsnap symlink for new layout. switchfilter added post_capture option added Round robbing_skip added Added roundrobing_frames option. 2.9.0 Froze 2.9.0 Shuffled everything around and added 'struct context', this should make motion ready for some serious threading. Added xml-rpc remote monitoring. Higher quality settings for mpeg. Added missing w to getopt in conf.c Removed c++ style '//' comments, they're EVIL. Removed some old outcommented code. 2.6.3 froze 2.6.3 Fixed removal of directories after mpeg creation. Added new netcam code. 2.6.2 froze 2.6.2 Added support for YUV420P palette to video.c, this should fix problems with the Philips webcams. 2.6.1 froze 2.6.1 Changed system() calls into remove() and symlink(). oldlayout option now also affects snapshots. Fixed snapshot link name (ppm vs jpg). Added new snapshot_overwrite option. Changed directory permissions to 0755 instead of 0750. Made timestamp overlay better readable, it is now black or white depending on the back colour. 2.6.0 froze 2.6.0 Updated manpage. Added iomojo Smilecam support. Added uninstall option to Makefile Added config file location to the FAQ. Made timestamp overlay inverse of original pixel instead of white. Created 'struct images' to minimize the passing of arguments between functions. Move contents of various header files around to make things more sane. Made locate box inverse off original pixel instead of white. Created alg.c and alg.h, they contain all functions that have something to do with the motion detection algorithms. Renamed video.c functions to vid_xxxxx. Created video.h Improved stepper tracking code. Tracking code cleanup, multiple tracking interfaces are now possible. Added diff_hybrid, a combination of diff_fast and diff_standard Introduced some pointer magic in the locate functions. Added experimental diff_fast. Fixed SIGHUP handling and blocking. Added auto_bright option. 2.5.0 froze 2.5.0 Updated documentation, config files, man page. Freeing 'line' in decompress_jpeg, this fixes a memory leak when using Axis cameras. Implemented SIGHUP handler for reloading config files. Added realconfig option for starting multiple motion processes or loading alternative config files. Added 'jpg_cleanup' to the manpage. Made 'low_cpu' lower on cpu. Fixed mpeg creation for old layout. Moved mpeg movies into year/month/day dir. Remove empty directories when doing jpg_cleanup. 2.4.2 froze 2.4.2 Fixed low_cpu option to be actually low on the cpu. Fixed missing case for '-w' in conf.c. 2.4.1 froze 2.4.1 New version numbering: ala linux kernel Fixed includes for track.c 2.4 froze 2.4 Complete rewrite of the tracking stuff... it now uses a serial stepper motor interface (and actually works!) Fixed division by zero in adjust_rate code Added 'low_cpu' option for minimizing the cpu load while not detecting any motion. Added 'oldlayout' option for using the old style filenames. Added automatic location of vloopback inputs by using /proc/video/vloopback/vloopbacks. Fixed '-l' option Uploaded motion to the sourceforge CVS Alphabetized CREDITS file. Added 'pal-nc' norm. 2.3 froze 2.3 Started faq. Included fix for bad 'strtok' in glibc with RH 7.0 Added \t as a delimiter for config files. Made mpeg creation checks more sane. 2.2 froze 2.2 Fixed segfault bug with filebase creation. Added creation of mpegs when killed or when getting SIGUSR1 or when max_mpeg_time has been reached. 2.1 froze 2.1 Only create directories if they are going to be used. Changed SYNC ioctl argument to int in video.c Added realmotion option Default config changed: -gap is now 60 instead of 300 seconds. -locate is on by default (-l function now works reversed) -night_compensate is on by default Added mpeg framerate adjustment. Added night_compensate for dark pictures. 2.0 froze 2.0 Integrated motion tracking. Improved lightswitch detection. Added clipcount in video.c, quickcam should work good now. 1.99 froze 1.99 Fixed memory leak in mpeg creation. Created put_picture for saving images. Moved lightswitch code out of main loop. Merged exec_externcommand, exec_onsavecommand and exec_onmpegcommand into exec_command Added onmpeg command. 1.81 froze 1.81 Fixed segfault bug in 'mysql_password' option. 1.8 froze 1.8 Added video loopback for motion pictures. Location box is now only enlarged for heads, not for feet. Merged in Axis 2100 camera support. conf.c now also looks for '~/.motion/motion.conf'. Moved filebase creation to mkfilebase Minor improvements. Loopback feed during lightswitch. 1.7 froze 1.7 Little bit of code cleanup Splitted motion.c in motion.c and video.c Changed config.in to correctly detect the mysql libraries and include files. 1.6 froze 1.6 Motion now has its own mailinglist: motion@frogtown.com Added MySQL support Added creation of symbolic link to snapshots Changed file names of snapshots 1.5 froze 1.5 Added video loopback support for realtime viewing. Fixed division by zero bug. Added install option to Makefile. Fixed bug that prevented external commands, mail and sms from being called at the first event. 1.4 froze 1.4 Added lightswitch filter Updated manpage 1.3 froze 1.3 Added minimum gap option. Changed /007 to /a, not a real change but more sane. Added mask option. Added get_ppm for reading ppm files Optimized greyscale blowup code. Added 'FORCE_ENCODE_LAST_FRAME' to mpeg params file. Experimental tracking routines for mini ssc library 1.2 froze 1.2 Fixed some exit(-1) to exit(1) Updated manpage with the new options. Added adjustable noise level. Snapshots can be made in ppm format to. Fixed signal blocking code (this time right?) 1.1 froze 1.1 Motion now has it own logos!!!! Added timestamp to picture. Added ppm output format. Rewrote locate function, small things (like fish :) don't disturb the locate option anymore. Added break for -B option 1.0 froze 1.0 Went back to alarm for automated snapshots (signals should work with bttv now) Moved usage to conf.c Finished manpage Added check for existing target dir. Moved diff calculation and image_out generation out of main loop, adding other methods is easier this way. Removed sanity check for output formats since someone might want no pictures at all but only warning messages. Make snapshots separately from other pictures. New snapshot names: YYYYMMDDHHMMSS-snapshot Motion images are encoded to mpeg movies to. Made movie file names and counter sane. 0.99-2 froze 0.99-2 Added signal blocking during ioctls, bttv should now continue to work when receiving signals. Snapshots with no movement don't go to the movies ;) Also flush buffers when making snapshots. Fixed for segfault when there is no config file. (Second time, remember to fix the current version next time) 0.99 Last beta before 1.0 mpeg movies get timestamp in filename mpeg_encode is now called from within motion added chdir, filename generation is now much easier Added check for complete frames with read 0.8 froze 0.8 Added script for mpeg_encode Moved getopt stuff to conf.c Added conf.h and conf.c for config file parsing Added -f option for frame rate limit Fixed frame nr count (starts at 0 again instead of 1 in v0.7) 0.7 froze 0.7 Added event nr to the filename, settable with -g (gap). Added genhtml.sh (for creating a static version of show.cgi) New show.cgi Option for saving both motion and normal images. Moved image_ref update into diff for loop. *a option does not use alarm anymore, bttv card users can use it to (they just miss the SIGALRM option...) Added picture size settings for read. Moved read back in, after mmap failure motion we fall back to normal reads. Greyscale camera fix Added check for capture failure 0.6 froze 0.6 Fixed stupid typo for execute option (forgot the shift) Added -l option for locating and marking movement Added buffer flush to keep log files up to date 0.5 froze 0.5 Added contrib dir with infra red script Option to always output changes between images Output of motion images configure script 0.4 froze 0.4 Gave the help text a new look. Overall cleanup (moving defines to motion.h) Added -E option for executing external commands 0.3 froze 0.3 New homepage: http://motion.technolust.cx Fixed -t option (target path) Changed from read to mmap for bttv cards Added input and norm selection Added alarm signal handler and snapshot (-a) option (does not work with bttv....) 0.2 froze 0.2 Updated README and TODO Added SMS and mail alert messages Changed file name format to YYYYMMDDHHMMSS-fn.jpg (fn=framenumber) Added deamonize option Cleaned up includes Decaying reference picture added Renamed image1 and image2 to image_ref and image_new 0.1 Initial release motion-release-4.6.0/doc/CODE_STANDARD000066400000000000000000000160331452402535500171360ustar00rootroot00000000000000Formatting rules for Motion code. Note: To understand them you must view this document with spaces and tabs visible. -------------------- RULE 1 Code is generally indented using 4 spaces Example /* allocate some memory and check if that succeeded or not. If it failed * do some error logging and bail out */ void * mymalloc(size_t nbytes) { void *dummy = malloc(nbytes); if (!dummy) { printf("Could not allocate %llu bytes of memory!\n", (unsigned long long) nbytes); syslog(EMERG, TYPE_ALL, "%s: Could not allocate %llu bytes of memory!", __FUNCTION__, (unsigned long long) nbytes); exit(1); } return dummy; } RULE 1A Preprocessor statements such as #IF, #DEFINE, etc are to be indented similar to normal code. These statements shall not be forced to start in column 1. RULE 1B When entire functions are enclosed in a #IF block, the functions should continue to start in column 1. -------------------- RULE 2 If a line or statement is broken into two lines you will normally want the text in the 2nd line to align with text in the first line if it enhances the readability of the statement. The alignment is done using spaces making the code on the following lines appear in a natural way below the corresponding code above. Use common sense to enhance readability. Example /* allocate some memory and check if that succeeded or not. If it failed * do some error logging and bail out */ void * mymalloc(size_t nbytes) { void *dummy = malloc(nbytes); if (!dummy) { printf("Could not allocate %llu bytes of memory!\n", (unsigned long long) nbytes); syslog(EMERG, TYPE_ALL,"Could not allocate %llu bytes of memory!", __FUNCTION__, (unsigned long long) nbytes); exit(1); } return dummy; } Example cnt->sql_mask = cnt->conf.sql_log_image * (FTYPE_IMAGE + FTYPE_IMAGE_MOTION) + cnt->conf.sql_log_snapshot * FTYPE_IMAGE_SNAPSHOT + cnt->conf.sql_log_mpeg * (FTYPE_MPEG + FTYPE_MPEG_MOTION) + cnt->conf.sql_log_timelapse * FTYPE_MPEG_TIMELAPSE; Example char msg[] = "This is a very long message which we would like to break" "into two lines or more because otherwise the line gets" "too long to read. We align them below each other for readability" -------------------- RULE 3 Never use TABS to align anything. A tab may be 4 positions in one editor and 8 in another. A space is always a space. -------------------- RULE 4 Functions should be written with this syntax. GOOD EXAMPLE /* Comment block * A comment block should be at least one line saying what the function does. * It is better to make several lines explaining what it does, what it takes * for arguments and what it returns. It is a bad idea to try to use tabs to * align text in the comment block */ type function_name(parameters) { declarations declarations statements statements } For function declarations that span more than one line, a triple indent is generally used for the second and subsequent lines to avoid excessive lines. Do not stuff everything on a single line. Keep the line length to less than 100 characters. All variable names should be seen without having to scroll. Do not put the '{' after the function declaration. Put it on an empty line right after. Note that this rule is only for functions. -------------------- RULE 5 Blocks follow K&R. GOOD EXAMPLE if ((picture=fopen(cnt->conf.mask_file, "r"))) { cnt->imgs.mask=get_pgm(cnt, picture, cnt->imgs.width, cnt->imgs.height); } else { printf("Hello world\n"); } BAD EXAMPLE if ((picture=fopen(cnt->conf.mask_file, "r"))) { cnt->imgs.mask=get_pgm(cnt, picture, cnt->imgs.width, cnt->imgs.height); fclose(picture); } else { put_fixed_mask(cnt, cnt->conf.mask_file); printf("Hello world\n"); } GOOD EXAMPLE switch (expr) { case ABC: case DEF: statement; break; case UVW: statement; break; default: /* default case */ statement; } BAD EXAMPLE switch (expr) { case ABC: case DEF: statement; break; case UVW: statement; break; default: /* default case */ statement; } RULE 5A if, while and for statements shall always use braces. -------------------- RULE 6 Whitespace. To ensure that Motion code looks homogeneous and to enhance readability: 1. Do not use a space before a comma 2. Always leave at least one space after a comma 3. Use one space between a block start statement and a '{' 4. Do not use a space between a function name and the '(' 5. Use spaces to enhance readability (a non objective rule but at least think about it) 6. The '*' for pointers should be just before the variable name with no space. GOOD EXAMPLES int function_name(int *par1, int par2, int par3) { if (var1==2 || var2==3) { BAD EXAMPLES int function_name (int * par1 , int par2,int par3){ if (var1==2||var2==3){ -------------------- RULE 7 Comment your code but do not be verbose. Do not literally describe what the code does unless it would not be obvious to someone who knows C. BAD EXAMPLES while (1) { /* 'Do forever' */ /* * Now we increment the index */ indx++; Use /* This style of comment for permament comments */ or /* * This style of comment for comments which * require more that one line */ Use // this style comments for something you add temporarily while testing and FIXME type comments. It is much easier to spot the temporary comments this way. -------------------- RULE 8 Use variable names that say what the variable is used for. Avoid x,t,vt type variable names. Use names like image, image_buffer, image_height, output_buffer Short names like i and j for loop index variable are a known good practice. Variable and function names are in lower case. Use '_' to separate words. MACROS are in uppercase. camelCase (mix of upper and lower case) is not allowed RULE 9 Break code into many smaller functions rather than one extremely long one. It is easier to follow the flow when functions are simple and concise. -------------------- BEST PRACTICES Not rules, but these suggestions make code easier to read. Use white space and empty lines to group code. For example, large if statements are easier to read when there is an empty line before and after them. Use an empty line before a comment which describes the code lines below. Always use spaces in statements like thisvar->thismember>thisvar->thisothermember (bad) thisvar->thismember > thisvar->thisothermember (good) if (cnt->event_nr==cnt->prev_event||cnt->makemovie) (bad) if (cnt->event_nr == cnt->prev_event || cnt->makemovie) (good) frame_delay=(1000000L/cnt->conf.low_cpu)-frame_delay-elapsedtime; (bad) frame_delay = (1000000L / cnt->conf.low_cpu) - frame_delay - elapsedtime; (good) -------------------- This document can probably be enhanced more as time goes by. Hope it helps developers to understand the ideas. Please help the developers by at least trying to follow the spirit of this document. We all have our coding preferences, but motion-release-4.6.0/doc/CREDITS000066400000000000000000002431341452402535500162450ustar00rootroot00000000000000Thanks go to: Jeroen Vreeken *** Original writer of this great program! *** From 3.1.12 these contributions: * Rewrite of PWC tracking code. * Motion-control action.quit fix. * Added tracking options to xmlrpc interface. * Ignore SIGPIPE (crashes webcam code). * Changed fast algorithm to imgs.size/10000 steps. * Renamed prerecord to pre_capture to be more consistent with post_capture. * Redone pre_capture completely. Kalle Andersson * Created a patch that ensures that Motion detaches from the stdin and stout devices so that a secure shell that was used to start Motion in daemon mode does not hang when you exit the shell. Ryan Ayers * Implemented improvement of vid_putpipe so that Motion does not spend time writing to a vloopback device which is not there. Also introduced reporting to syslog of writing to vloopback fails. * Improved configure's ability to find custom installations of ffmpeg. * Misc. cosmetic changes in the code. * Rewrote the ffmpeg functions completely added support for new codecs/formats mpeg4 and msmpeg4. mpeg1 was improved also. * Misc. improvement of the mpeg4 feature and new ffmpeg code. Paul Beltrani * Implemented a fix/work around to a bug related to building and installing RPMs on Suse. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x07x14x212356 Michael Newlyn Blake * For setting up the motion mailinglist and the onsave command. Krzysztof Blaszkowski * Removed a duplicate call to jpeg_destroy_decompress already is called from netcam_image_conv. * Added V4L2 support http://www.lavrsen.dk/twiki/bin/view/Motion/VideoForLinuxTwoDiscussion, (Krzysztof Blaszkowski, Angel Carpintero). Mathias Bogaert * Lots of good ideas and the motion logos William M Brack * Added patch that enables Motion to work with vloopback version 0.94 and kernel 2.6.10+. http://www.lavrsen.dk/twiki/bin/view/Motion/MotionAndVloopbackVideoDotCPatch * Added support in configure for athlon64 from http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x30x190907 (Angel Carpintero and William M Brack) * Fixed some gcc warnings * Code cleanup from a valgrind analysis. * Implemented WebcamShortWriteHandling patch http://www.lavrsen.dk/twiki/bin/view/Motion/WebcamShortWriteHandlingPatch * Small code cleanup in motion.c for the variable holding the number of microseconds since epoch. The old code worked fine but relied on an integer overflow every 71 minutes. (Bill Brack and Kenneth Lavrsen) * Complete rewrite of the Netcam code. Should fix many of the reported and still open netcam bugs. http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamCodeRewritePatch * Improved the error reporting in the Netcam code and did a few minor corrections and code cleanups. * Implemented a much easier to use motion_log function which replaces the calls to printf and syslog. The implementation to actually use this has been implemented in video.c and the Netcam code files. Rest will be in next snap. This code change as no impact to the user. http://www.lavrsen.dk/twiki/bin/view/Motion/ErrorLoggingEnhancementPatch * Fixed a buf in video.c so that VIDEO_PALETTE_GREY cameras now actually work. * Re-mplementation of optional Proxy Server for Network Cameras. http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamProxyServerPatch * Added the missing rotate feature in the new netcam code (Billl Brack) * Netcam error handling improvements and cleanup from Valgrind analysis. * Added a configure option --with-developer-flags which enables many compiler warnings that can be used by developers to make code more robust. Not for normal users building Motion. * Removed all warnings originating from the motion sources when running ./configure --with-developer-flags. The modifications were done by the following people: Peter Holik, Bill Brack, Angel Carpintero and Kenneth Lavrsen. http://www.lavrsen.dk/twiki/bin/view/Motion/ReduceWarningsPatch * Fixed error message with unknown config option. * Enhanced compatibility with Lumenera. * Moved the motion_loop initialization into a new function motion_init. * netcam code now waits for the next frame to arrive for a limited period in order to avoid too many duplicate images. * Last --with-developer-flags warnings eliminated simply by swapping the order of the #include statements in the sources (Bill Brack and Kenneth Lavrsen). * Enhancement to Netcam Code for Connection to Pixord Cameras. http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamFixPixordBug * Fix related to connecting to the netcam. From mailing list 23 Dec 2005. * Fixed problem related to fetching images from Network camera and error handling when it fails. Motion would end in infinite loops. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x03x10x000151 * Fix conv_uyvyto420p segfault. * Enhancing the palette selection. John Bray * Get current directory to allow write motion.conf properly http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2008x02x25x013419 Andy Brown * Add swf codec to video creation (on behalf of Bowser Pete). Ashley Cambrell * PostgreSQL support, put_jpeg_grey(), webcam bugfixes. Angel Carpintero * Improved configure process which automatically detects presence of xmlrpc-c and ffmpeg and makes the Makefile accordingly. * Improvement of configure reporting of missing shared libraries. * Fix for building motion without ffmpeg (missing #ifdef round newly added ffmpeg timelapse code) * Implemented RH (sysV) and Debian type control scripts for /etc/init.d * Memory clean-up improvements when Motion exits normally. * Provided several improvements of error handling. * Ported Motion to FreeBSD. * Created the spec file so that Kenneth can build RPMS when releasing Motion. * Improved error handling for the netcam functions. * Implemented fix for compiling errors when building the FreeBSD version without bktr support. * Added a new config option --without-optimizecpu which disables the CPU specific compiler optimizations introduced with the rotate phase 2 patch. * Implemented Streaming Netcam Without Curl which enables connecting to network cameras both with single jpeg frame mode and streaming mjpeg mode. This enables much higher framerates with Netcams. (with Christopher Price). * Improved the Netcam patch (Angel Carpintero) http://www.lavrsen.dk/twiki/pub/Motion/StreamingNetcamWithoutCurl/ (pre2 patch fixes problem with not detecting Content-length and segfaults in netcam) * Implemented a POSIX compliant SIGCHLD signal handler as replacement for the traditional signal(SIGCHLD, SIG_IGN) which can cause floods of warnings in some RedHat versions. (with Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2004x10x26x134906 * Improved the Netcam patch (Angel Carpintero) http://www.lavrsen.dk/twiki/pub/Motion/StreamingNetcamWithoutCurl/ (pre3 reconnection feature added) * Fixed several bugs in new netcam code introduced in 3.1.18 (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x16x030209 http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x02x01x071546 http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x02x03x035918 * Netcam code: Change printf() to fprintf(). * Netcam code: Cleanup memory netcam (netcam.c , motion.c ). * Netcam code: Redesign of reconnection feature. * Configure: Added debug , conditional compile of xmlrpc-c * Fix a non allocated pointer to be freed. * Added fix to BugReport2005x02x11x170019 * Added fix to BugReport2005x02x11x150802 * Major new feature. XMLRPC is replaced by a simpler http remote control interface. http://www.lavrsen.dk/twiki/bin/view/Motion/MotionHttpControl * Fixed netcam->userpass problem * Added support in configure for athlon64 from http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x30x190907 (Angel Carpintero and William M Brack) * Updated code so Motion again runs on FreeBSD. * Removed check for memmem from configure. * Updated http control interface so that an additional check is done before saving config files. * Fixed a problem with URLs http://192.168.1.3:8080/0 which did not work without a trailing space. * Fix the compile issue with official ffmpeg packages from debian. * Added basic authentication to the http control interface introducing new config option control_authentication. * Fixed memory leak when restarting Motion from http control. * Small improvement in configure script for Debian. * Added the ability to clear an option to off (bool), 0 (int) or undefined (string) by submitting blank entry field in the http control interface. * http interface small fixes (motion-3.2.1_snap14-small-fixes 1.1) incl Add 'back' link to response_client errors. http://www.lavrsen.dk/twiki/bin/view/Motion/MotionHttpControl * Made the http control interface more RFC compliant. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x02x180550 * Fixed compatibility problem with Palantir. Fixed by making output more compatible with RFC (\r\n). Original fixes by Roberto Spadim and Angel Carpintero. However this fix made Firefox flicker even more than it normally does. Final fix which works in both Palantir client, Firefox and Cambozola was made by Kenneth Lavrsen. This closes the following bugs: http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x02x205307, http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x07x042849 * In httpd control code: Fixed RAW syntax following API specs. http://www.lavrsen.dk/twiki/bin/view/Motion/MotionHttpControl * MotionHttpControl Patch motion-3.2.1_snap18-pre1 v,1.0 19 May 2005. Fixed some HTTP response codes and added header copyrights. http://www.lavrsen.dk/twiki/bin/view/Motion/MotionHttpControl * Fixed problem compiling "ffmpeg reports only YUV420 is supported" when ffmpeg is a recent CVS version. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x22x213229 * Bug fix in netcam code: Sometimes motion try to free an invalid memory area http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x21x105335 * Small configure fix related to --without-v4l. * Fixes for http control HTML code. * Added init script to RPM. * Pthread deadlock in motion 3.2.1 fixed. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x26x125712 * http lockup bugfixes and ConvertSignalToSigaction only for webhttpd * alg_draw_location: Use temporary variables to store the values used in for() loops instead of compute them in each loop http://www.lavrsen.dk/twiki/bin/view/Motion/ImproveAlgDrawLocation. * Small speed boost to the function draw_textn (Andrew Hamilton and Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/DrawTextnImprovement * Avoid Cleanup Segfault. Avoid Cleanup Segfault. Allocates filepath using strdup to avoid segfault is target_dir parameter is not supplied in motion.conf. Moves out from signal handler the cleanup for pipe and mpipe. http://www.lavrsen.dk/twiki/bin/view/Motion/AvoidCleanupSegfault * Changed the configure script so that rpms can be made by normal non-root users. * Above change in configure script for 64 bit ffmpeg support also implemented in the freeBSD configure. * Webhttp control interface fixed so it also works in FreeBSD. * Fixed a bug in the webhttpd code related to pan/tilt. Bug was introduced in snap4 (Angel Carpintero, Kenneth Lavrsen). * Implemented the libjpeg-mmx patch. Installing the MMX version of libjpeg can increase performance. Especially for machines with very little CPU power. It only modifies the configure script. If you do not have the libjpeg-mmx the configure script with ignore this and use the standard libjpeg. Note that RPMS will be built without this (Peter Holik and Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/LibJpegMmx * Fixed memory leak in webhttpd related to use of strdup. * Error Logging Enhancement Patch v 1.3 including: * Populate the motion_log to the whole motion source code. * Fixed FreeBSD compilation. * Added the possibility to pass NULL as struct context * * Removed unused errno variables. * Fixed errno in rotate.c , set to 0. * Fixed some errno flags in webhttpd.c and motion.c * Fixed a bug when not motion.conf is found * Removed printf from all files * Fixed the conf_list[] index in motion.c * http://www.lavrsen.dk/twiki/bin/view/Motion/ErrorLoggingEnhancementPatch * http-control: Fixed segfault when motion is restarted from command line ( kill -s 1 pid_motion ). Improved control code so Motion can Restart and Finish 'smoothly'. http://www.lavrsen.dk/twiki/bin/view/Motion/MotionHttpControl. * Fixed a bug in the http control code that failed to accept a client connecting in some systems * Removed all warnings originating from the motion sources when running ./configure --with-developer-flags. The modifications were done by the following people: Peter Holik, Bill Brack, Angel Carpintero and Kenneth Lavrsen. http://www.lavrsen.dk/twiki/bin/view/Motion/ReduceWarningsPatch * Fixed small mistake in allocating memory for cnt->imgs.common_buffer. * http control updated: (null) messages replaced by "disabled", last parameter in conf/list are displayed correctly and only in Main thread. When motion runs with only one thread, it displays "No threads". * http control: selectbox instead of a textfield for changing boolean configs (Peter Holik and Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/WebhttpEnhancements. * Added the debian sub directory so that people can build the deb package. * Sync configure.in.freebsd (adding support for jpeg-mmx, developer-flags and some cosmetic changes ). * Implemented --with-developer-flags fixes in FreeBSD code. * In v4l_start change map from unsigned char * to void * to be ANSI C compliant with mmap * http control: Changed disabled to (not defined) when displaying option list. * FreeBSD Code improvements by Angel Carpintero * Implemented set/get hue , saturation , contrast and brightness. * Better support to capture with big resolution ( 640x480 , 768x576 ). * Update Readme adding information about "how to configure a capture card and settings" , update packages dependencies . * Remove support for libjpeg-mmx , motion segfault ( future fix ). * Cosmetics changes in configure.in.freebsd ( replace --without-v4l by without-bktr ). * Cleanup code and fix warnings. * Implemented fix to configure so that LDFLAGS from the environment are used when making the Makefile. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x09x15x185558 * Changed configure so that --with-jpeg-mmx is default off as a reaction to known problems seen when using the jpeg-mmx library. * Added the %t conversion specifier to show the thread number. http://www.lavrsen.dk/twiki/bin/view/Motion/ThreadConversionSpecifierPatch * Fixed bug related to init of mutex in netcam code. * Netcam_ftp code fixes (Angel Carpintero and Asbjørn Pettersen) http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamWithFtpEnhancements * Enhanced ffmpeg detection. http://www.lavrsen.dk/twiki/bin/view/Motion/BetterFFmpegDetection * New Feature: Motion is now also supported on MaxOSX with similar feature set as for Free BSD. See README.MacOSX for details how to install it. (Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/MacOSXPatch * Added a work-around so people in FreeBSD that uses a capture card where input 1 is not tuner can use motion if frequency is set -1 in motion.conf or thread#.conf. * Fixed misc problems in FreeBSD. * Update README.FreeBSD * Fix problems with tuner_device and frequency, now by default is not defined to allow use any input without problem. * Replace strndup() by memcpy() in netcam.c * Merged configure.in.freebsd with configure.in (configure.in.freebsd deleted) * Remove a warning when used --without-bktr * Remove cpu optimization (is broken) * Fixed http control of pan and tilt. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x12x22x122649 * Fixed sql_mask not initialised correctly http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x01x09x175603 * Fixed the management of strings from http remote control , setting to NULL when they are set to "blank" and fixes a problem with despeckle , that didn't allow to remove labeling action from http remote control. http://www.lavrsen.dk/twiki/bin/view/Motion/FixStringsAndDisableLabeling * Fix many typos in comments ( i ran aspell against the code ). Also there's a fix to free cnt->eventtime_tm when motion exits. http://www.lavrsen.dk/twiki/bin/view/Motion/FixTypoInComments * Fix the problem that happens in FreeBSD and Debian Sarge because version of ffmpeg is LIBAVFORMAT_BUILD < 4629. ( Pete Shipley and Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x01x12x120335 * Updated motion.spec. Changing D_FORTIFY_SOURCE=2 by D_FORTIFY_SOURCE=1 to fix problem related to building with ffmpeg. (Angel Carpintero) * Added Tilt support to stepper track. * Fixed mysql configure auto-detection for x64 systems. http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2006x03x02x152208 * Fixed a bug that only allowed remote control of max 9 cameras. Now Motion can present up to 99 cameras in its http remote control interface (Angel Carpintero based on idea by Chuck Sheehan) http://www.lavrsen.dk/twiki/bin/view/Motion/WebHttpManyThreads * Removed annoying debug messages (v4l_set_input really needed ?) in the FreeBSD version. * Added new feature: minimum_frame_time which enables capturing at a lower rate than 2 frames per second (Kenneth Lavrsen and Angel Carpintero) * Fix segfault when netcam_url has no service ( http , ftp ) * Fixed interlace issue with METEOR_GEO_EVEN_ONLY in FreeBSD * Fixed possible syntax error in configure related to MySQL * Put a new global mutex around avcodec_close to avoid problems with not thread safe functions in ffmpeg * Put a new global mutex around avcodec_close to avoid problems with not thread safe functions in ffmpeg. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x04x07x164654 * On FreeBSD configure defines a redundant freebsd for motion. Fixed by replacing -D__freebsd_ by BSD macro included in sys/param.h for BSD platforms. (JukkaUkkonen and Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x07x08x070417 * For BSD platforms changed to using native pthreads as default and adding linuxthreads as a optional parameter from configure. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x07x08x071646 * Added process_id_file feature http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2006x06x06x123003 * Add connection status for all devices available from http web interface. http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2006x11x09x050638 * Improved deb packaging , install the init.d script. * Reconnect to mysql if connection dropped. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x10x10x081903 * Track pan/tilt support for uvcvideo ( Michal Licko ,Dirk Wesenberg and Angel Carpintero ) http://www.lavrsen.dk/twiki/bin/view/Motion/LinuxUvcTrackingPatch * Added V4L2 support http://www.lavrsen.dk/twiki/bin/view/Motion/VideoForLinuxTwoDiscussion, (Krzysztof Blaszkowski, Angel Carpintero). * Added support for V4L2_PIX_FMT_SBGGR8 ( bayer ), V4L2_PIX_FMT_SN9C10X, V4L2_PIX_FMT_MJPEG and V4L2_PIX_FMT_UYVY. * Added a FreeBSD directory to allow people from BSD to get a daily version and create a port. * Removed mysql dependency from debian package and added a note to setup motion to run as daemon to create the pid file. * Changed the way configure search mysql headers and libs, added 3 parameters to configure --without-mysql to disable support, --with-mysql-include directory of mysql.h and --with-mysql-lib directory of libmysqlclient.a or libmysqlclient.so * Fix an error in FreeBSD , the use of capture even fields depends on height value. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x12x03x073610 * Fixed autodetection for VIA cpu , no needed to use --without-optimizecpu. Added many others. * Fix , don't remove pid file when motion reload config file( HUP signal ). * Fix compilation broken by uvc track type. * Fix RoundRobin v4l2 buffers in driver when switching input, http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x07x07x182605 (Dag Erlandsson and Angel Carpintero). * Check EIO for VIDIOC_DQBUF to workaround saa7134 problem. (Dag Erlandsson and Angel Carpintero). * Change bayer2rgb24() to fix a problem with sn9c102 driver http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x06x05x012249 (Jared D and Angel Carpintero). * Added MYSQL_OPT_RECONNECT flag for mysql connection (MYSQL 5.x only) and changed default value for mysql_host. * Fix http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=391055 , change motion man page , -d requires level. * Handle mjpeg decoding and fix colour issue adding mjpegtools dependency http://www.lavrsen.dk/twiki/bin/view/Motion/MjpegColorIssue http://www.lavrsen.dk/twiki/bin/view/Motion/MjpegToYUV420pPatch (Marius Rieder, Angel Carpintero). * Fix segfault in webhttpd.c on motion restart. * Fix segfault in debian http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x09x24x175945 * Add debug level > 5 to get logs from v4l2_select_input, v4l2_set_control and v4l2_set_input. * Removed debian ( to avoid conflicts with debian package) and FreeBSD ( no needed to deploy BSD port here ) directories. * Improve debian package, create user/group motion and added --chuid motion to init script. * Added help in http control http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2007x11x19x181541 * Fixed http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x10x23x093651 * Fix process_id_file when is passed from command line * Fix http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x10x27x150419 * Added Choose V4L2 palette http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2007x11x19x032318 * Improved in http control ( 'back' link, select box, show current values when are going to be changed ). * Fix http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x11x25x102808 * Avoid random errors , initialising some structs for V4L1 http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x11x26x010755 (Jason Sharpee & Angel Carpintero) * Fix motion segfault because ffmpeg API change http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2007x12x29x17553 * Little fix in ffmpeg.c comparing version of LIBAVFORMAT_BUILD, since ffmpeg svn -r4486 LIBAVFORMAT_BUILD and LIBAVCODEC_BUILD uses LIBAVFORMAT_VERSION_INT ((49<<16)+(0<<8)+0) and LIBAVCODEC_VERSION_INT ((49<<16)+(0<<8)+0) * Fix broken PostgreSQL detection for custom location, http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2008x02x25x025134 * Fixed stepper when is used track_auto on. * Added to configure.in --with-pwcbsd to allow compile motion in freebsd with webcam support instead of bktr. * IPV6 for http-control and webcam stream not netcam yet http://www.lavrsen.dk/twiki/bin/view/Motion/IPv6 (Jeroen Massar & Angel Carpintero) * Fix a security issue in web control interface http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=484572 * Fix Problem Encoding 1280x1024 resolution videos http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2008x06x11x183727 * Add write/read nonblock functions in webhttpd( timeout on read/write). * Add a new parameter netcam_tolerant_check, to be less strict with some buggy network cameras firmwares. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2008x06x19x123218 * Remove mjpegtools dependencies and integrate only needed functions from library. * Fix rotate for v4l2 devices using JPEG / MJPEG palettes. * External pipe to allow external video encoders http://www.lavrsen.dk/twiki/bin/view/Motion/DarkwindHackeronMotionPatching (Bill Payne, Angel Carpintero) * Allow change/setup framerate in FreeBSD using pwcbsd * Get rid of ffmpeg-config in configure.in for debian. * Fix warning for x86_64 in conf.c using pointers LP64 compliant. * Fix warning for syslog() , Added support for some new bayer palettes introduced in kernel 2.6.27. http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2008x10x15x130110 Increased buffer in ffmpeg to allow encoding at 1600x1200 * Avoid possible stack smashing in v4l_open_vidpipe(). * Allow compile with OpenSuse ffmpeg package (15594svn-20081010) http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2008x10x25x070400 * Avoid segfault detecting strerror_r() version GNU or SUSv3. * Fix fd leaks in external pipe. * Fix segfault for new libjpeg v7. * Allow to change Standard method ( PAL / NECAM / SECAM ). * Exit when image dimension are not modulo 16. * Avoid logs flooding using some options of netcam_keepalive and try to discard images with weird header Content-Lenght 0. * Only use post capture when we setup to record videos with external pipe or ffmpeg. * Fixed FFV1 codec encode with ffmpeg. http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2010x04x13x032553 * No PQfinish(). * Added a conditional check for avformat_alloc_context , av_avformat_alloc_context to fix http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2011x10x05x071936 * Added a new starting option -m to disable motion detection. Jared D * Change bayer2rgb24() to fix a problem with sn9c102 driver http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x06x05x012249 (Jared D and Angel Carpintero). John Edwards * Added the 'pal-nc' norm. Dag Erlandsson * Fix RoundRobin v4l2 buffers in driver when switching input, http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x07x07x182605 (Dag Erlandsson and Angel Carpintero). * Check EIO for VIDIOC_DQBUF to workaround saa7134 problem. (Dag Erlandsson and Angel Carpintero). * Added the pre_capture buffer redesign to throttle load and enhance pre_capture feature. http://www.lavrsen.dk/twiki/bin/view/Motion/PreCaptureRedesign * Fixed a problem with locate and fixed mask overlay * Added preview center feature. http://www.lavrsen.dk/twiki/bin/view/Motion/PreviewCenter * Fixed timestamp for preview pictures. * Insert Blanking frames http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2007x12x16x132522 Stephen Farrugia * Fixing the division by zero problem. This makes motion a lot more stable. Michael Finsterbusch * Add authentication methods 'Basic Authentication' and 'Digest Authentication' to the "Live Stream Server". http://www.lavrsen.dk/foswiki/bin/view/Motion/MotionStreamAuthPatch Mark Feenstra * Fix zombies on OpenBSD. http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2010x04x28x054348 Miguel Freitas * Came up with the round robing idea. David Fries * Fix webhttpd race condition crash with SIGHUP, add it to running thread counter * Allow text format specifiers to take a width like printf would. * Add power_line_frequency configuration item to improve image quality. Aaron Gage * Pointed me to the vid_mmap/int problem when calling SYNC in video.c Giacomo Graziosi * Sqlite3 support http://www.lavrsen.dk/twiki/bin/view/Motion/SQLite3Patch Christophe Grenier * Fixed some file descriptor leaks in webcam.c and netcam.c. * Renamed the top level global context structure to cnt_list so it can be reached from child threads and by above mentioned close_anything_open() * Contributed with most of the code for new function in event.c close_anything_open() which is called from send_sms, send_mail and exec_command in order to prevent file descriptor and open sockets to be inherited by the shell causing freezing and instability. Code contributed by Christophe Grenier, Christopher Price and Kenneth Lavrsen. * Change the working directory to / in daemon mode. This way you don't have to kill motion to umount the partition from where you start it. http://www.lavrsen.dk/twiki/bin/view/Motion/ChdirNetCamWgetPatch * In netcam-wget header_get() didn't always in add a \0 string terminator. This was fixed. http://www.lavrsen.dk/twiki/bin/view/Motion/ChdirNetCamWgetPatch * Made a pthread fix. http://www.lavrsen.dk/twiki/bin/view/Motion/PthreadFixPatch * Implemented the conversion of signal to sigaction which should be more thread safe. Hopefully this still keeps Motion from making Zombies. http://www.lavrsen.dk/twiki/bin/view/Motion/ConvertSignalToSigaction Mihnea-Costin Grigore * Fixed the oldlayout behaviour of snapshots. * Fixed snapshot link extension. * Added the snapshot_overwrite option. * Fix for correct mpeg names when using mpeg_encode. Alain Guidez * Fix of ffmpeg_avcodec_log code. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x03x25x074612 Jan Gyselinck * Original time/date-stamp code. * ppm support * Good ideas Colling H * New frame_limit. Steffen Haas * Improved on screen display by adding more symbols and lower case letters. Andrew Hamilton * Small speed boost to the function draw_textn (Andrew Hamilton and Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/DrawTextnImprovement * Added new feature: Double size text. A new config option 'text_double' can be set 'on' and this scales the text to double size. Default is off. http://www.lavrsen.dk/twiki/bin/view/Motion/TextScalingPatch * Fixed memory leak in ffmpeg code. * Added the ffmpeg_deinterlace feature http://www.lavrsen.dk/twiki/bin/view/Motion/MotionffmpegDeinterlace * Added FFV1 ( FF video codec 1 ) codec , Lossless encoding http://www.lavrsen.dk/twiki/bin/view/Motion/LosslessEncoding * Added mov , Quicktime file format (Andrew Hamilton). Gerrit Hannaert * Fix v4l2_palette http://www.lavrsen.dk/twiki/bin/view/Motion/UvcvideoMjpegPatch Peter Holik * Netcam First Header patch. If an error with jpeg decompression occurred at connecting to a mjpeg streaming webcam, this patch skips this jpeg and tries to decompress next jpeg up to MAX_HEADER_RETRIES (20). http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamFirstHeader * Small improvement in framerate accuracy. http://www.lavrsen.dk/twiki/bin/view/Motion/FramerateAdjust * Implemented a modified version of the WebcamCompressInMemory so that Motion no longer uses the tmpfile() function for buffering the frames of the mjpeg stream. http://www.lavrsen.dk/twiki/bin/view/Motion/WebcamCompressInMemory * Implemented the libjpeg-mmx patch. Installing the MMX version of libjpeg can increase performance. Especially for machines with very little CPU power. It only modifies the configure script. If you do not have the libjpeg-mmx the configure script with ignore this and use the standard libjpeg. Note that RPMS will be built without this (Peter Holik and Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/LibJpegMmx * Small code cleanup in webcam.c and picture.c and .h for the webcam code (Peter Holik and Kenneth Lavrsen). * Small speed optimization in the creation of reference frame. * Removed all warnings originating from the motion sources when running ./configure --with-developer-flags. The modifications were done by the following people: Peter Holik, Bill Brack, Angel Carpintero and Kenneth Lavrsen. http://www.lavrsen.dk/twiki/bin/view/Motion/ReduceWarningsPatch * Implemented a speed-up patch of the draw text feature. http://www.lavrsen.dk/twiki/bin/view/Motion/DrawTextspeedup * http control: selectbox instead of a textfield for changing boolean configs (Peter Holik and Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/WebhttpEnhancements. * Introduced check for device image size being a multiple of 16. http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamModulo16Patch * Fixed netcamera bug related to separating frames in an mjpeg stream. From mailing list 23 Dec 2005. * Avoid open file descriptor when connecting to network cameras fails http://www.lavrsen.dk/twiki/bin/view/Motion/AvoidOpenfiledescriptors * Fix Segfault on reload or quit for vloopback (maybe other v4l1 devices too) http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2009x06x17x090603 * Fix warning for __USE_GNU redefined http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2009x06x17x122137 * Use static memory allocation in ffmpeg_deinterlace() http://www.lavrsen.dk/foswiki/bin/view/Motion/FfmpegDeinterlaceStatic * Atom optimizacion in configure.in http://www.lavrsen.dk/foswiki/bin/view/Motion/AtomOptimizations Wesley Hosking * For pointing me to the absence of a frame length check using read for capturing Peter Ilin * Patch for handling vloopback pipes better when Motion receives SIGTERM or SIGHUB Per Jönsson * Added the rotate feature. * Improved the Makefile with automatic check of dependencies and nicer output for the user. http://www.lavrsen.dk/twiki/bin/view/Motion/MakefileWithAutoDependencies * Improved rotate feature (speed) http://www.lavrsen.dk/twiki/bin/view/Motion/RotatePatch * Implemented new ffmpeg patch http://www.lavrsen.dk/twiki/bin/view/Motion/FfmpegPatch049 * Implemented labelling speed patch http://www.lavrsen.dk/twiki/bin/view/Motion/LabelingSpeedPatch * Improved the signal handling of ctrl-C http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x06x181426 * Fixed the ffmpeg code so that Motion also compiles against libavcodec build 4754 or later. * Fixed a bug in the autobrightness algorithm. * RotateBswapFix Patch v 2 including: * cleanup in code comments * fix for __bswap_32 macro collision * fixed bug where initialization would be incomplete for invalid degrees of rotation * now uses motion_log for error reporting http://www.lavrsen.dk/twiki/bin/view/Motion/RotateBswapFix * Implemented Threadnr in TLS (thread-local storage)patch. It puts the thread number into TLS and modifies motion_log() so that we do not have to drag the cnt struct around just to be able to print the thread number in the log and on the console. (Per Jönsson with additional removal of unused cnt by Kenneth Lavrsen). http://www.lavrsen.dk/twiki/bin/view/Motion/ThreadNrTlsPatch * Simplified rotation code based on the fact that images must have dimensions that are a multiple of 16. http://www.lavrsen.dk/twiki/bin/view/Motion/RotateSimplificationPatch Mike Kenney * Implemented a fix for the rare problem where some experienced that the move file names would only consist of the extension .mpg or .avi with no name in front. The root cause was the use of sprintf for appending to strings. (Mike Kenney and Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2005x09x05x133031 http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2006x06x19x174238 Rafis Khayrullin * Fix memory management in ffmpeg.c http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x12x19x062432 Matthias Kilian * Configure patch which enables configure to find and use a dynamic library of ffmpegs libavcodec.so Daniel Ladd * Fixed a bug in the rgb2yuv420p function. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x03x30x011107 Kenneth Lavrsen (Currently project managing Motion) * Wrote the excellent Motion Guide. (Jeroen wrote this :-) ) * Fixed low_cpu to check for a 1sec. maximum wait. * Updated manpage for 3.0.0 * New usertext additions to draw.c * Fixed ffmpeg compatibility for ffmpeg 0.4.8 * Fixed ffmpeg instability problem * Fixed "ioctl(VIDIOCGCHAN): Invalid argument" error * Changed motion.conf to motion-dist.conf. * Changed the parsing of the motion.conf and thread.conf files so that spaces are now allowed. * Changed the parsing of the user defined on screen display text so that you can enclose a string in "" both in config file and using the XML-RPC interface. Ie. you can use spaces in the text. * Changed conf.c so that xml-rpc command motion.conf.write creates a much more user friendly motion.conf file. * Modified Ian's on screen display putting back the config parameter drawtext_changes. If enabled the number of changed pixes are shown in the upper right corner of the image. * Removed the snap_override feature and reduced the oldlayout to an Berkeley mpeg_encode feature only renaming it to berkeley_single_directory. Instead the flexible filename feature now has oldlayout as default and the "new" directory layout specified in the motion.conf file. * Motion.conf sequency re-arranged so the important things comes first. * Changed names of many options to be more user friendly. * Renamed the options for displayed text to text_right, text_left and text_changes. * Change the parsing of config files so that the argument can be in quotation marks (" or ') allowing leading spaces for the text_left and text_right options. This means that you can place the text anywhere on the picture by using spaces and new lines \n. * Fixed problem with strftime based names with event number %v when event numbers were higher than 99. * Changed motion-control to make a proper output from motion.conf.list. * Renamed ffmpeg_timelaps to ffmpeg_timelapse (we change now or never) * Corrected man page (\n) (thanks Daniel). * Added setting access rights to 644 (755 for configure) when doing make dist. * Small improvement on xmlrpc-api.html document. * Fixed missing init of viddev.frequency causing VIDIOCGCHAN errors. XML-RPC changes of threshold and noise_level are now being used as long as threshold_tune and noise_level are not enabled. * Enabled the round robin feature to also work by changing frequency on the same device and same input. * Fixed the pre_capture feature so that it also stores the jpegs properly. * Fixed the ffmpeg_timelapse feature so that the calculated time is correct and the current image is used instead of an old image from position 0 in the pre_capture ring buffer. * Fixed ffmpeg routines so that also graytone images can be pre_captured and used with ffmpeg_timelapse. * Fixed the position of the incrementing of shots in the motion_loop so that it is correct before any functions use it. * Added quite many comments to the code to make it easier to maintain (more comments will be added). * Removed some old debugging printf's that were displayed in non-quiet mode. * Changed to snapshot feature from being alarm driven to being timer driven. This means that each thread can have its own interval value. The XML-RPC motion.action.snapshot still works. The SIGALRM method has been changed so that all thread that have the snapshot_interval non zero will take a snapshot when being signaled with SIGALRM. A negative value for snapshot_interval will activate the SIGALRM trigger but not the timing interval. * Kenneth Lavrsen changed the enhanced SQL config from single sql_mask option to 5 sel_log_ options for more user friendly control. * Changed the behaviour of onsave back to original mode where also snapshots causes onsave command to be run. * Fixed a bug in frequency setting of V4L device. * A few lines of code for Dan's improved handling of config strings. * Daniel Sterling and Kenneth Lavrsen added a feature that checks for two threads having the same webcam_port. If this is the case the last thread gets its webcam disabled and a warning message is written to console and syslog. * Small improvements in messages sent to console and syslog during startup of Motion. * Fixed the problem with default strings being written to thread config files when using the XMLRPC command motion.conf.write. * Fixed memory leaks in new ffmpeg code. * Changed the ffmpeg code so that mpeg1 files are created using the libavcodec method and mpeg4 and msmpeg4 are created using the new libavframe method in ffmpeg. * Added seconds and frame fields to the database feature. * Fixed a small bug related to the filename given for onffmpegclose. changed the configure option --with-libavcodec to --with-ffmpeg and updated Guide and man pages and text in code and config file to match the new shared library way of using ffmpeg. * Added the new fields to the SQL security table camera (thread number), text (text_left) and time (timestamp). * Simplified the sql functions (1 instead of 3) and ensured that the text field is not assigned when text_left is an empty string. This allows for the field to be auto defaulted. * Added additional error reporting to console. * Implemented a new lightswitch feature so that is now triggers lightswitch detected based on the percentage of pixels set by the lightswitch option which is now an integer instead of a boolean. When lightswitch is detected motion skips 5 frames to allow camera to settle. * Fixed a bug in the autobrightness function. * Fixed a bug in netcam_start() - wrong imgs.size calculation. * Removed the obsolete Berkeley mpeg feature. * Corrected a small error in the usage help text http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x05x174139 * Improved the help text for config option night_compensate in docs, conf.c, motion man pages and config file. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x06x103939 * Implemented a POSIX compliant SIGCHLD signal handler as replacement for the traditional signal(SIGCHLD, SIG_IGN) which can cause floods of warnings in some RedHat versions. (with Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2004x10x26x134906 * Changed the reporting of the changes of noise detection level so that it is only displayed in the console (daemon off) when the always_changes option is enabled. (Kenneth Lavrsen) * Changed the ffmpeg>0.4.8 = no mpeg1 gcc warning message so that it is clear to people that it is information and not an error message. * Changed allocation of despeckle buffer to avoid a segfault when using a netcam where the image is wider than defined in motion.conf width. * The noise tune value displayed in the upper left corner along with number of changed pixels is no longer displayed (was there for debugging). * Changed the SIGCHLD handler introduced in snap10 so that it is a shorter and faster function. Disabled this handler in the xmlrpc thread as this caused unnecessary loops of cpu cycles. Additionally made the code in xmlrpc more correct and robust (handling of select()) (Kenneth Lavrsen) * Fixed a bug in the timelapse feature. Both the rollover events of the timelapse video and timelapse shots could be missed if the CPU load was very high or the time was changes by ntp. Motion will now catch up a few seconds later if this happens. Also fixed the code for monthly rollover. (Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x23x133554 * Small improvement in timelapse feature so that an image is added when the new mpeg is created and not waiting till the following timelapse (Kenneth Lavrsen). * Small improvement so that the rollover happens on the hour and not one timelapse past the hour (Kenneth Lavrsen). * Fixed a bug in noise tune which was most visible at very low light. * Re-arranged many of the const char declarations so that they are always before any statements within a block { }. This is to avoid compiler errors with older but still used gcc versions such as 2.9.5. * Changed the use of %zd to %llu in printf statements of size_t types. This is done to avoid compiler errors with older but still used gcc versions such as 2.95. * Fixed even more gcc 2.95 compiler errors (declarations not at beginning of block). * Removed a gcc 2.95 compiler warning (netcam.c:1036: warning: variable `pic' might be clobbered by `longjmp' or `vfork'). * The values for cnt->locate and cnt->new_img are now #defines in motion.h to enhance code readability. * The setting of sql_mask is now only done once per second to save CPU power. * Adding checking for conflict between control port and webcam port. Webcam port for a thread is disabled if it is set to the same value as the control port. * Added "motion-http:" prefix to error messages from the http control thread. (Kenneth Lavrsen) * Added additional error information when connection to MySQL fails. * Initiate cnt->event_nr to 1 to avoid code related to end of events and long mpeg films to be run during startup of Motion. * Added new function in event.c close_anything_open() which is called from send_sms, send_mail and exec_command in order to prevent file descriptor and open sockets to be inherited by the shell causing freezing and instability. Code contributed by Christophe Grenier, Christopher Price and Kenneth Lavrsen. * Added new context global cnt_list.control_socket_server set by the httpd thread so that the above mentioned close_anything_open() can close open control sockets. * Threw away the file descriptor leak fix from snap 9 because it caused more trouble than it fixed. Removed the close_anything_open() and the cnt_list.control_socket_server field. Replaced it all with a simple piece of code that all server daemons call when started: setsid() followed by for (i=getdtablesize(); i>2; --i) close(i). Dirty and simple. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x03x21x070534 * Fixed a bug where rate of fetching picture frames was disturned by the signal SIG_CHLD from exec_command programs terminating. The symptom was that the number of post_capture frames became inaccurate and motion in mpegs did not have constant time between frames. * Fixed a bug where motion did not work with gap=1. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x30x073616 * Added the feature gap=0 which now also works. It disables gap completely so that one single mpeg file is created. You can end the event from the remote control interface make movie feature using for example cron. This makes Motion close the mpeg and make a new with event number increased by one. * Improved the http remote control action features so that makemovie and snapshot for thread 0 (all) works on all threads instead of being ignored. * Moved some code in the beginning of the motion_loop to a position later to improve the accuracy of time calculations for the framerate. * Improvements of motion.conf help comments including improvements in new onxxxx options. * Motion Guide refactored completely for 3.2.1 with better web navigation and auto generation of pages. Makefile updated so that the Motion TWiki topic MotionGuideOneLargeDocument is fetched when updating the guide and making releases. * Removed the debug_parameter option which had no use. Programmers can still use it because the code is only commented out. This change required a small update in the code that rewrites motion.conf so that a remote control command to write the config files still adds a text header for the thread section at the end of motion.conf. * Changed the default values for a few options: quiet on, webcam_maxrate 1, threshold_tune off, webcam_quality 50. * Changed some cosmetics in the way motion.conf is written (space after #). * Updated the motion-dist.conf to use default values unless there is a reason not to. * Fixed a bug in the low_cpu feature where cpu load increased instead of decreasing because the framerate calculations were completely wrong. This was an old bug introduced in 3.0.1. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x04x24x205933 * Improved the auto-brightness algorithm. When auto-brightness is enabled the brightness option becomes a target value for the brightness level. This should also close a bug report. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x02x26x195358. * Made the http control HTML responses nicer to look at as sources and therefore easier to debug errors. * Code style cleanup of webhttpd.c. * Fixed compatibility problem with Palantir. Fixed by making output more compatible with RFC (\r\n). Original fixes by Roberto Spadim and Angel Carpintero. However this fix made Firefox flicker even more than it normally does. Final fix which works in both Palantir client, Firefox and Cambozola was made by Kenneth Lavrsen. This closes the following bugs: http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x02x205307, http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x07x042849 * Added new conversion specifiers: %D (diffs), (noise) %K (motion center x), %L (motion center y), %i (locate width x) and %J (locate width y). These changes also required a refactoring of the alg_locate code. This change is part of the implementation of a generic tracking feature and it enables implementing external programs that can perform simple prediction features. http://www.lavrsen.dk/twiki/bin/view/Motion/ExtendReplaceConversionSpecifiersDiscussion http://www.lavrsen.dk/twiki/bin/view/Motion/GenericTrackingPatch * Fixed a bug in switchfilter which caused motion detection to not work when the feature was enabled. * Fix for Unknown content type with lumenera cameras http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x06x174416 * Man page updated. It is now semi-autogenerated in the Motion TWiki http://www.lavrsen.dk/twiki/bin/view/Motion/MotionOptionsAlphabeticalManpage * Added two new convertion specifiers: %o for threshold and %Q for number of labels. * Improved the config file description for pre_capture to get people to use small values. * Major code cleanup concerning signedness of chars all over the code to allow compilation with gcc4.0 (like in Fedora Core 4) without any errors or warnings. This will probably require that some of the not yet included patches will have to be fixed because it it code all over the place that has been changed. * Changed the configure script so that /usr/lib64 is also searched for the presence of ffmpeg (should fix the problem with 64 bit machines). * Changed the configure script so that rpms can be made by normal non-root users. * Fixed a bug in the webhttpd code related to pan/tilt. Bug was introduced in snap4 (Angel Carpintero, Kenneth Lavrsen). * Changed all use of localtime to localtime_r which is threadsafe. * Modified the WebcamCompressInMemory patch so that Motion now supports the mjpeg webcam stream while being setup for saving PPM images. http://www.lavrsen.dk/twiki/bin/view/Motion/WebcamCompressInMemory * Major clean-up of code in picture.c and webcam.c so that function names and variable names are less confusing. Also added many comments in picture.c. * Webcam code commented more. * New improved webcam feature. When you set webcam_motion on Motion will now stream at 1 fps instead of none. When motion is detected the webcam stream increases to the limit set in the config file. This change makes the webcam_motion much more interesting. The previous function always ended up with clients timing out. * Small code cleanup in webcam.c and picture.c and .h for the webcam code (Peter Holik and Kenneth Lavrsen) * Small code cleanup in motion.c for the variable holding the number of microseconds since epoch. The old code worked fine but relied on an integer overflow every 71 minutes. (Bill Brack and Kenneth Lavrsen) * Fixed bug related to disabled webcam or duplicate webcam port. Error log accept(): Socket operation on non-socket continuously written to syslog. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x08x01x150922 * Included a CODE_STANDARD text file to help new developers make patches that are easier to integrate without too much manual editing. * Changed the 5 second missed camera signal timeout to 30 seconds. * Fixed bug where an extra jpeg is saved if you have output_normal=best and you stop motion after an event has ended. (Kenneth Lavrsen). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x08x05x173526 * Option switch filter used print_int instead of print_bool when motion.conf was saved. * Removed all warnings originating from the motion sources when running ./configure --with-developer-flags. The modifications were done by the following people: Peter Holik, Bill Brack, Angel Carpintero and Kenneth Lavrsen. http://www.lavrsen.dk/twiki/bin/view/Motion/ReduceWarningsPatch * Implemented Threadnr in TLS (thread-local storage)patch. It puts the thread number into TLS and modifies motion_log() so that we do not have to drag the cnt struct around just to be able to print the thread number in the log and on the console. (Per Jönsson with additional removal of unused cnt by Kenneth Lavrsen). http://www.lavrsen.dk/twiki/bin/view/Motion/ThreadNrTlsPatch * Removed old unused code related to read mode (not mmap) from V4L devices. * Motion loop resets its frame timer when the image received is from a netcam. This lowers the actual framerate of Motion to the rate the netcam can actually keep up with. * Last --with-developer-flags warnings eliminated simply by swapping the order of the #include statements in the sources (Bill Brack and Kenneth Lavrsen). * Switchfilter feature repaired. It was called inside motion_detected() after overlays on cnt->img.out were added which meant that the feature also detected all the overlays, smartmasks, fixed mask and text. It is now moved to the motion_loop right after the lightswitch feature and before any overlays are added. * Fixed small bug where motion was detected when using a tracking camera and the camera moved to center position when gap period expires. The fix includes gathering the updating of reference frame in one place only in the motion_loop. * Implemented the new text option text_event and new conversion specifier %C. Option text_event defines the value %C which then can be used in filenames and text_right/text_left. The text_event/%C uses the time stamp for the first image detected in a new event. Default value is %Y%m%d%H%M%S. %C is an empty string when no event is in progress (gap period expired). Pre_captured and minimum_motion_frames images are time stamped before the event happens so %C in text_left/right does not have any effect on those images. http://www.lavrsen.dk/twiki/bin/view/Motion/EventConvertionSpecifierDiscussion * Renamed some variables related to time to be better descriptive of function and type. * Added new option 'sql_user_text'. This can be defined with the same conversion specifiers as text_xxx, on_xxxx and filenames. The SQL field text_left has been removed and replaced by a field user_text which is used for storing the interpreted value of sql_user_text. * Added new SQL field event_time_stamp of the type TIMESTAMP. * RPM specs file changed as suggested for use in the Livna repository. * The lightswitch and switchfilter features have been moved up before the despeckle features are run. This should ensure that both algorithms work on raw unfiltered motion pixels which they both were designed for. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x10x05x212444 * Added help texts in conf.c and motion-dist.conf describing the %t specifier. Added a good example of use in motion-dist.conf. * Added two new conversion specifiers: %f which is filename (full path) and %n which is filetype (sqltype) valid in on_picture_save, on_movie_start, on_movie_end and sql_query. This also means that filename is no longer appended at the end of the 3 on_xxxx commands. * Removed the sql_user_text option that was added in snap 2 * Added new sql_query option. This in combination with convertion specifiers incl the two new %f and %n enables the user to use any database structure they please. Added fields is now a simple matter of modifying the sql query. The default is the same as the default in snap1. * Change the sequence of events connected with creating files. Data is now written to the databases (if used) before an external comments is on (on_xxxx options) allowing the external program to use the new data in the database * Added an infinite retry scheme for netcams that are not available when Motion is started. Instead of just dying, Motion now retries every 10 seconds until the netcam is available. Until the netcam is available Motion enters the normal flow with the same grey image with a text information being fed to webcam, timelapse, snapshots, vloopback etc. Motion uses the width and height from the config file for this. It is a good idea to setup width and height so it is the same as the netcam. If the dimensions are the same Motion will switch over to the netcam seemlessly. If the dimensions are different Motion will perform a quick restart so all the many internal buffers can be initialized properly. * Added a better error handling of a netcam that changes dimensions while Motion is running. Instead of just writing error messages Motion restarts quickly to recover from this change. Note the now more well defined error coding for vid_next for both netcams and V4L cams. * Fixed small bug where the displayed time in the grey error image shown during start with unavailable netcam could show a garbage value under rare circumstances. * Restored the function sigchild_handler so it contains the same code as before motion-3.2.1_snap9. They is done in an attempt to fix an old problem with zombie child processes that has shown up again. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x11x13x115016 * Move the declaration of sig_handler_action and sigchild_action from the setup_signals function where they are local and will be destroyed and out in main just before setup_signals is called. Changed the function setup_signals so the two structs are passed as pointers. * Added new option track_auto which is a boolean option (on or off) with default value off. This enable people to start Motion with auto tracking enabled. Changing the config value for track_auto and enabling the auto tracking via the httpd track/auto has the exact same effect. * Added 3 new tracking options: track_step_angle_x, track_step_angle_y, and track_move_wait. The options track_step_angle control the movement during auto tracking and are currently only active for the pwc type tracking. The idea is that they can later also be used for the generic tracking as it evolves. The track_move_wait controls the number of frames after the camera has moved (auto or manual) during which motion detection is disabled. This option should be set so low that the motion detection is re-enabled the minute the camera is standing still again. Feature originally made by Moshe Van Der Sterre. Kenneth Lavrsen extended it to be more generic. http://www.lavrsen.dk/twiki/bin/view/Motion/PwcConfiguration * Implemented fix for missed snapshots with slow network cameras http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x02x07x162149 * Added some constants in video.c function v4l_picture_controls() which can help people hack an optimal set of values for controlling auto brightness for their particular camera. For now I am do not want to add all of these to the already too large number of motion config options. Maybe based on feedback we can permanently change the constants and add an additional auto brightness option. Or maybe a combined option that sets more constant based on an algorithm. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x02x07x212816 * Fixed a syntax error in picture.c get_pgm() which caused the program to segfault when a mask file size did not match the picture size. Now the program correctly gives an error message and continues without the mask. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x10x08x150720 * ffmpeg_filename has changed name to movie_filename to prepare for alternative movie encoding to the current ffmpeg based implementation and ffmpeg_filename will then be a bad name. * Fixed bug where variables time_last_frame and time_current_frame had been extended to also be used for snapshot feature but declaration was hidden between #ifdef HAVE_FFMPEG. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x03x09x012244 * text_changes now shows a '-' when motion detection is paused instead of just showing 0 http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2006x03x16x095713 * Improved reporting of thread numbers during startup in setup mode. (Peter Smith and Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/SlightlyImprovedThreadCreationLogging * Implemented a fix for the rare problem where some experienced that the move file names would only consist of the extension .mpg or .avi with no name in front. The root cause was the use of sprintf for appending to strings. (Mike Kenney and Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2005x09x05x133031 http://www.lavrsen.dk/twiki/bin/view/Motion/SupportQuestion2006x06x19x174238 * Altered the risky use of sprintf to snprintf in all places related to use with config strings that can become very long. * Removed the minimum_gap feature which was utterly useless * Added new feature: minimum_frame_time which enables capturing at a lower rate than 2 frames per second (Kenneth Lavrsen and Angel Carpintero) * Fixed the check for ffmpeg version. In rev 5503 of ffmpeg the FFMPEG_VERSION_INT was removed from libavcodec/avcodec.h. Instead we now use the equivalent LIBAVFORMAT_BUILD >= 4616 which is the 0.4.9pre1 version of ffmpeg. * Smartmask overlay feature did not set intensity correctly. * Fixed the thread number assignment which could goof up if netcams started very quickly before all thread were created at startup. * Fixed name space clash with libjpeg8 http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2010x01x22x084753 Mike Lees * Added the onffmpegclose feature. * Fixed a serious stability issue related to syslog not being a fully re-entrant function. * Implemented the new brightness, contrast, hue, saturation features http://www.lavrsen.dk/twiki/bin/view/Motion/BrightnessContrastPatch Wim Lewis * Added EXIF feature for jpeg images , http://www.lavrsen.dk/foswiki/bin/view/Motion/ExifTaggingPatch Michal Licko * Track pan/tilt support for uvcvideo ( Michal Licko ,Dirk Wesenberg and Angel Carpintero ) http://www.lavrsen.dk/twiki/bin/view/Motion/LinuxUvcTrackingPatch Michael Luich * Added codec Ogg/Theora as new output format for regular movies. http://www.lavrsen.dk/foswiki/bin/view/Motion/OggTimelapse Bill Maidment * Fixed bug reporting errors when creating symlink to last snap. Philip Marien * Fixed a problem when compiling with --without-v4l configuration. Jeroen Massar * IPV6 for http-control and webcam stream not netcam yet http://www.lavrsen.dk/twiki/bin/view/Motion/IPv6 (Jeroen Massar & Angel Carpintero) Lionnel Maugis * ffmpeg code Andrew McCarthy * Added the netcam functionality to the original axis code. Ian McConnell * Fixed the problem with Netcams and mask files. * New despeckle feature. * Flexible on screen display feature based on strftime. * Flexible strftime based path names. * Fixed problem with snapshot names when name is lastsnap. * Fix for snapshots when using the "lastsnap" filename. * Provided "timelapse closes mpeg file when set to zero" feature. Randy McEoin * For adding the onmpeg command. Marcel J.E. Mol * new show.cgi and genhtml.sh, -a without alarm, both motion and normal images, various improvements and ideas Sean Murphy * Executing external commands nemosoft * For his differential view in the camstream program. It inspired me (Jeroen) to make this. And for a great program to test my video loopback support. (www.smcc.demon.nl/camstream/) nullset? * For the ir script to turn motion and lights on and of Onakra * Fix choose v4l2 palette , http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2008x01x21x043812 Mikko Paananen * Changed netcam open to use pipes and fixed authentication. Bill Payne, * External pipe to allow external video encoders http://www.lavrsen.dk/twiki/bin/view/Motion/DarkwindHackeronMotionPatching (Angel Carpintero, Bill Payne) Bowser Pete * Add swf codec to video creation. Asbjørn Pettersen * Netcam_ftp code fixes (Angel Carpintero and Asbjørn Pettersen) http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamWithFtpEnhancements Pawel Pierscionek * Signal blocking during ioctls. * Greyscale blowup optimization Philippe Possemiers * For fixing the bug that prevented external commands, mail and sms from being called at the first event. * And for writing the send_jpg.py script. Alan Post * Pointed me to the exit(-1) instead of exit(1) calls. Christopher Price * Implemented Streaming Netcam Without Curl which enables connecting to network cameras both with single jpeg frame mode and streaming mjpeg mode. This enables much higher framerates with Netcams. (with Angel Carpintero). http://www.lavrsen.dk/twiki/bin/view/Motion/StreamingNetcamWithoutCurl * Netcam fixes and debug code by Christopher Price http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamStabilityPatch * snap5_post1_video.c and snap5-post1 patches * Fixed netcam startup race condition. * Refactored image handling back to single unified function * Refactored reconnection algorithm * Jpeg only based connections should now use less cpu time * Temporarily removed support for devices that do not support content-length (in progress) * Synced syslog/printf style to new motion standard * Added developer debug trace defines/code * Defines now used for many constants * Netcam Stability Patch version snap6-post1 * Added support for netcams without content-length header (streaming only) * Remove memmem from netcam_wget.[c|h] (no longer used) * Several miscellaneous code cosmetic changes * Netcam Stability Patch version 3.2.1-snap7-post1 * Added support for non-streaming (image based) netcams without content-lengthheader. * Contributed code for new function in event.c close_anything_open() which is called from send_sms, send_mail and exec_command in order to prevent file descriptor and open sockets to be inherited by the shell causing freezing and instability. Code contributed by Christophe Grenier, Christopher Price and Kenneth Lavrsen. * More Netcam Stability Fixes (snap10-post1-6) http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamStabilityPatch * Destroy mutexes in netcam_cleanup(). * Add reconnection for netcam_start() - this may block other cameras from starting up!. * Added additional defines for reconnect retries. * Change reconnection timeouts to 60 seconds. * Reworked close(sock) in netcam_connect, to insure future changes won't forget to close the socket. * Reworked reconnection for netcam_start() - disabled by default, see source for INIT_RECONNECT_RETRIES. * Break some long lines in code. * Replaced sleep with nanosleep per suggestion by Kenneth Lavrsen. * Added additional header validation check. * Changed a couple fd references to use RBUF_FD. * Added error message if jpeglib error occurs. * Removed additional header validation check. * Limited times headers will be checked. * Removed mutex lock around netcam_start() in video.c, hopefully race conditions are fixed. * Added additional headers in http request. * Added back header validation (should fix netcam_read_header lockups). * Detect when there is no data on socket in netcam_read_ functions (should fix netcam_read_image_contentlength() and * netcam_read_image_no_contentlength() lockups). * Rearranged timeout assignments for pthread_cond_timedwait() calls. * Adjusted TIMEOUT_COND_WHICH to 4 seconds. * More Netcam Stability Fixes (snap11-post1-4) (Christopher Price) http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamStabilityPatch * Reworked thread signal/wait conditions, should fix some race conditions. * Use gettimeofday() to determine thread timeouts, results in better accuracy. * Adjusted condition timeouts to smaller values due to usage of gettimeofday() and rework of thread signal/wait conditions. * Adjusted reconnection retries to 60 (every minute for an hour). * Fix bug where motion will not quit if requested when reconnecting. * Cruft, feature creep and redundant code removed. * Consolidated reconnection capability to unified netcam_reconnect function. * Rework netcam_start logic, minimize startup variables. * Rework netcam_stream_read and netcam_single_read logic. * Minor changes to netcam_next logic. * Fix bug in streaming camera without content-length, recent mod broke. * Fix bug in startup of single image reads without content-length. * More Netcam Stability Fixes (snap12-post1) (Christopher Price) http://www.lavrsen.dk/twiki/bin/view/Motion/NetcamStabilityPatch * Newrote url parser, better syntax checking and error handling of urls. * Userpass now allowed in url (http://user:pass@example.com/). Netcam_userpass has precedence, it will override a userpass embedded in the url. Dietz Proepper * Always output diff count and output image type selection rasca * A lot of the code in motion.c comes from his vidcat program which is part of the w3cam package. (jpeg creation and parts of the image capture function) (www.hdk-berlin.de/~rasca/w3cam/) Michael Reuschling * Fixed bug which caused Motion 3.1.18 fail to save timelapse mpegs when setting ffmpeg_timelapse = 1 (fixed by Michael Reuschling) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x01x31x211756 Petter Reinholdtsen * Adding the install option to the makefile. Isaac Richte * V4L2 fourcc GRBG not supported, updated default value for v4l2_palette 17. http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2009x10x29x222753 Marius Rieder * Handle mjpeg decoding and fix colour issue adding mjpegtools dependency http://www.lavrsen.dk/twiki/bin/view/Motion/MjpegColorIssue http://www.lavrsen.dk/twiki/bin/view/Motion/MjpegToYUV420pPatch (Marius Rieder, Angel Carpintero). James A. Russo. * Implemented ffmpeg_timelapse_mode feature. * Implemented enhanced SQL features. This adds logging of mpeg and prediction events to the MySQL/PostgreSQL feature. * Replaced the mime file types by a more refined filetype scheme that allows more refined control for SQL and other future control. Jason Sharpee * Avoid random errors , initialising some structs for V4L1 http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x11x26x010755 (Jason Sharpee & Angel Carpintero) Pete Shipley * Fix the problem that happens in FreeBSD and Debian Sarge because version of ffmpeg is LIBAVFORMAT_BUILD < 4629. ( Angel Carpintero and Pete Shipley) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x01x12x120335 Gunnar Skjold * Fixed http pause feature so that pausing thread 0 now pauses all threads. http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x07x10x111239 Peter Smith * Improved reporting of thread numbers during startup in setup mode. (Peter Smith and Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/SlightlyImprovedThreadCreationLogging * Ffmpeg code mutex locking fix http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x04x07x164654 * Ffmpeg avicodec logging improved (Peter Smith and Kenneth Lavrsen) http://www.lavrsen.dk/twiki/bin/view/Motion/FfmpegAvicodecLogging * Improved upon a few ambiguous log messages which may be emitted by the Event handling code with regards to Ffmpeg (Peter Smith) http://www.lavrsen.dk/twiki/bin/view/Motion/LoggingEventFix Roberto Spadim * Fixed compatibility problem with Palantir. Fixed by making output more compatible with RFC (\r\n). Original fixes by Roberto Spadim and Angel Carpintero. However this fix made Firefox flicker even more than it normally does. Final fix which works in both Palantir client, Firefox and Cambozola was made by Kenneth Lavrsen. This closes the following bugs: http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x02x205307, http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2005x05x07x042849 Daniel Sterling * Studies of the performance of Motion. * Night compensation fix. * Changed the webcam_port value to 0 in motion-dist.conf to avoid that people get segmentation faults when having 2 or more cameras and webcam_port not set in the thread config files. * Implemented improved handling of config strings. This plugs the memory leak when changing string type options via XML-RPC. It also makes the memory handling more elegant/optimal and finally it now allows strings to be as long as allowed by the environment variable PATH_MAX. * Kenneth and Daniel added more comments to motion.c and conf.c. * Made the XMLRPC able to handle errors without crashing. * Daniel Sterling and Kenneth Lavrsen added a feature that checks for two threads having the same webcam_port. If this is the case the last thread gets its webcam disabled and a warning message is written to console and syslog. * Fixed a calculation error in alg_diff_fast(). Tommy Svensson * Wrote the original patch for supporting pan/tilt with Logitech Quickcam Sphere/Orbit Timo Taskinen * Added Flash video format (FLV) to ffmpeg. http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2007x07x19x131921 technolust.cx * For hosting motion.technolust.cx Mark Thomas * Created the original thread patch for motion enabling motion to watch multiple cameras. Dirk Traenapp * Added the mpeg creation on exit and SIGUSR1, also made the start for max_mpeg_time. * Found the 'strtok' call that caused motion to crash under RH7.0 Jukka Ukkonen * On FreeBSD configure defines a redundant freebsd for motion. Fixed by replacing -D__freebsd_ by BSD macro included in sys/param.h for BSD platforms. (JukkaUkkonen and Angel Carpintero) http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2006x07x08x070417 Moshe Van Der Sterre * Added 3 new tracking options: track_step_angle_x, track_step_angle_y, and track_move_wait. The options track_step_angle control the movement during auto tracking and are currently only active for the pwc type tracking. The idea is that they can later also be used for the generic tracking as it evolves. The track_move_wait controls the number of frames after the camera has moved (auto or manual) during which motion detection is disabled. This option should be set so low that the motion detection is re-enabled the minute the camera is standing still again. Feature originally made by Moshe Van Der Sterre. Kenneth Lavrsen extended it to be more generic. http://www.lavrsen.dk/twiki/bin/view/Motion/PwcConfiguration Folkert Van Heusden * Maintained the code from version 3.1.9 till 3.1.12-rc1 Including features like.. * Error reporting to syslog. * Better memory allocation. low_cpu feature extension to configurable frame rate. * First work on Logitech Sphere/Orbit tracking. * Implemented original pre-record feature. Misc code optimisations * Closed 2 memory-leaks (two 'FILE *' were not closed) in the webcam-interface. James Van Vleet * CPU VIA Ezra C3 autodetection support added. http://www.lavrsen.dk/twiki/bin/view/Motion/VIAEzraC3Patch Simon Walls * Netcam Keepalive and HTTP/1.1 http://www.lavrsen.dk/twiki/bin/view/Motion/FeatureRequest2007x01x22x231542 * Better debug in netcam for "Error reading image header" http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2008x02x27x092849 (Simon Walls) Sean Watkins * Created a centralized logging function that became event() Joerg Weber * Added the new labeling motion detection feature. * Added the new Smartmask feature. * Implemented new preview patch (Joerg Weber) http://www.lavrsen.dk/twiki/bin/view/Motion/PreviewShotsPatch * Implemented an improvement of Smartmask so that the mask is cleared when the smart_mask_speed is set from a non-zero to zero * Implemented an improvement of noise_tune with smart mask (and probably also in general) * Added Best Preview Patch http://www.lavrsen.dk/twiki/bin/view/Motion/BestPreviewShot * Added the new feature Setup Mode (Joerg Weber). This also enables much more error messages given to the console when in non-daemon mode while still preserving the messages in syslog which are important for daemon mode debugging. http://www.lavrsen.dk/twiki/bin/view/Motion/SetupModePatch * Fixed a bug in noise tune which was most visible at very low light. * Improved console output in setup mode. Now also outputs threshold. * Improvement in the noise-tune algorithm. * Implemented new Generic onxxxx features. Function --- Old Option --- New Option Start of event (first motion) --- execute --- on_event_start End of event (no motion for gap seconds) --- New! --- on_event_end Picture saved (jpg or ppm) --- onsave --- on_picture_save Movie starts (mpeg file opened) --- onmpeg --- on_movie_start Movie ends (mpeg file closed) --- onffmpegclose --- on_movie_end Motion detected --- New! --- on_motion_detected http://www.lavrsen.dk/twiki/bin/view/Motion/OnXxxCommandsPatch and http://www.lavrsen.dk/twiki/bin/view/Motion/OnXxxxFeatureDiscussion * Fixed small bug when pre_capture buffer is resized during operation. * Changed the order of drawing the red mask in setup mode so that the smartmask is drawn after the fixed mask. * Improved the display of fixed mask. It is now shown as grey instead of red. This makes it easier to see the smart mask working when you also have a fixed mask. * Improved the labelling algorithm so that locate feature and tracking features includes all labelled areas above threshold. http://www.lavrsen.dk/twiki/bin/view/Motion/ImprovedLabellingPatch * Make the creation of reference frame and the decay mechanism depending on how much motion was detected relative to threshold setting. http://www.lavrsen.dk/twiki/bin/view/Motion/ReferenceFramePatch * Removed low_cpu feature. * Removed night_compensate feature * Implemented a new reference frame algorithm to improve object recognition and location. * Improved smartmask feature: real moving objects don't trigger the mask anymore. * Added area_detect feature. * Add draw a RED box around the movement as default. * Split locate_motion into separate 'mode' and 'style' option to allow all possible combinations. * Gapless_event mode. * Limit detection rate to 3fps at framerates above 5fps, to reduce CPU load. * Fixed mask overlay in setup mode is now green instead of white. Dirk Wesenberg * Track pan/tilt support for uvcvideo ( Michal Licko ,Dirk Wesenberg and Angel Carpintero ) http://www.lavrsen.dk/twiki/bin/view/Motion/LinuxUvcTrackingPatch Tristan Willy * Wrote Axis 2100 support and added the check for ~/.motion/motion.conf Robert Eugene Wood * Inverse pixels for locate box. Andreas Wrede * Allow compile with NetBSD and make LP64 compliant video_freebsd.c Damian Wrobel * Fix a segfault adding correct size to be used for bayer2rgb24(). http://www.lavrsen.dk/twiki/bin/view/Motion/BugReport2007x03x30x175913 Yieldtech * These guys are making a complete linux based security system with motion as one of its components. * They did the mysql support, new fileformat and the symbolic link to the snapshots. You can find them at yieldtech.cz Christian W. Zuckschwerdt * Modified the Makefile and configure files to be more flexible. Everybody who has contributed ideas, bugreport and remarks to this project motion-release-4.6.0/doc/INSTALL000066400000000000000000000021431452402535500162470ustar00rootroot00000000000000The following is a brief overview of the building and installing instructions for debian / ubuntu. For full instructions on how to build and install Motion, see the motion_guide.html that is distributed with this source code. The guide also includes instructions for building Motion on distributions other than debian/ubuntu such as BSD, Mac and Centos. The packages and library names change frequently and vary across base operating systems. Adjust the following lines as required by the base operating system. Install basic build packages: sudo apt-get install autoconf automake autopoint pkgconf libtool libjpeg8-dev build-essential libzip-dev gettext libmicrohttpd-dev Install FFMPEG packages sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev libswscale-dev libavdevice-dev Once required packages are installed, execute: autoreconf -fiv ./configure make make install Sample custom configuration options: --prefix : Specify the install location for the motion package --with-ffmpeg=[dir] : Specify the location in which ffmpeg/libav is installed. motion-release-4.6.0/doc/copyright000066400000000000000000000012341452402535500171510ustar00rootroot00000000000000Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: motion Source: https://motion-project.github.io/ License: GPL-2+ Files: * Copyright: 1999-2021 motion authors; see CREDITS for details License: GPL-2+ Files: netcam_wget.* Copyright: 1995-2002 Free Software Foundation, Inc. License: GPL-2+ Files: mmx.h Copyright: 1997-2001 H. Dietz and R. Fisher License: GPL-2+ Files: debian/* Copyright: 2000-2014 motion Debian packagers; see debian/changelog for details License: GPL-2+ License: GPL-2+ On Debian systems, the complete text of the GNU General Public License can be found in the file /usr/share/common-licenses/GPL-2'. motion-release-4.6.0/doc/mask1.png000066400000000000000000000015261452402535500167440ustar00rootroot00000000000000‰PNG  IHDR@ðTFâ·tIMEÒ0PP/ pHYs  ÒÝ~ügAMA± üaåIDATxÚíÚ1nA@Ñ]ÒBEÃHO Â% KAË1¸‡áœŠ[@lKAloœhÞ¯\­fŸffÇ«§ÅZ¯.–»ú}él¹KÿöôÝ©ooùz=€1€1€1€1€1€1€1€1€1€1€1€1€±%Gx8ÍË]zõiuê»»ƒ–|þe¿—ð‹!ü–|õñÔ·v7-¸ú<Æ\f|ùa:ÄoÀËÃË0zÓñW#éMÇ\œã;"à`+÷ª#·r¯:àÿÚn쀣.Þmpl½©ùÔý»7¯ú†Ç[wà¸ÏÜëí ¸}ÉŒïwûÿÀ¸©éÝÜ.€gïßX¶·õ_ÀË™÷øí“Sóþö/@g•º Ð!yÇ®nv Motion

Installing with apt

    Motion is part of the Debian, Ubuntu and Raspberry Pi OS repositories and can be installed with the apt tool. The version included with apt will be the version that was available when the distribution version was initially deployed and therefore may not represent the latest release.

    To install via apt, open up a terminal window and type: sudo apt-get install motion

Installing with a release deb package

    Motion can also be installed from the release deb files which may provide a more recent version than what is available via apt.

    Determine the deb file name that is appropriate for the distribution and platform from the Releases page and open up a terminal window and type:

      wget https://github.com/Motion-Project/motion/releases/{deb package name}

    Next, install the retrieved deb package. Below is a sample method to install that uses the gdebi tool. The author prefers this tool since it will automatically retrieve any dependency packages and yet still can be run without graphical interface.

      sudo apt-get install gdebi-core

      sudo gdebi {deb package name}

Building a deb package

    Users can also build their own deb package from source. It is often preferable to build and install a deb package rather than using the build from source options below since it is much easier to upgrade from and un-install Motion. The script that builds the deb packages released can be used to do this. Open a terminal window and type: wget https://raw.githubusercontent.com/Motion-Project/motion-packaging/master/builddeb.sh Since this is a script file, once it is downloaded open the file with a text viewer and review the script to see what it does. Never ever run a script without reviewing what it does!.

    Within the script, you will see that it takes a few parameters which are optional. Username, EmailAddress, branch, install, arch If the parameters are not provided, the script will create defaults.

    The general flow of the script is as follows:
    • Validate input parameters and set defaults as needed.
    • Validate the required packages are installed and notify which ones are missing.
    • Create temporary directories in /tmp
    • Clone the Motion source code and packaging code to the temporary directories
    • Switch to the branch specified in the parameter (or master if not specified)
    • Build the debian package
    • Clean up temporary directories
    Once you have reviewed the script and determined that it is OK to run, close out of the editor and then run the command chmod +x ./builddeb.sh to make the script executable.

    Run the script ./builddeb.sh myname myemail master n any

    The script will validate the dependencies and report any additional dependencies which must be installed or if all the dependencies are installed, it will create a deb package. Note that this may take a bit of time on slower computers.

    Once the deb file is created, install it via the gdebi tool as described above.

Abbreviated Building Guide

    If you are familiar with the building of applications, then the following is a basic build / install script. If errors occur during the process or you wish to customize the build, please review the extended building instructions further below.

    Debian / Ubuntu / Raspberry Pi OS Packages
      sudo apt-get install autoconf automake autopoint build-essential pkgconf libtool libzip-dev libjpeg-dev git libavformat-dev libavcodec-dev libavutil-dev libswscale-dev libavdevice-dev libwebp-dev gettext libmicrohttpd-dev libcamera-tools libcamera-dev

      cd ~
      git clone https://github.com/Motion-Project/motion.git
      cd motion
      autoreconf -fiv
      ./configure
      make
      make install

    FreeBSD
      sudo pkg install autoconf pkgconf automake git ffmpeg gettext libmicrohttpd

      cd ~
      git clone https://github.com/Motion-Project/motion.git
      cd motion
      autoreconf -fiv
      ./configure
      make
      sudo make install

    Mac OS X
      brew install ffmpeg pkg-config libjpeg libmicrohttpd automake

      export PATH="/usr/local/opt/gettext/bin:/usr/local/bin:$PATH"

      cd ~
      git clone https://github.com/Motion-Project/motion.git
      cd motion
      autoreconf -fiv
      ./configure
      make
      make install

Preparation For Building

    In order to build Motion from source many shared libraries must be installed. The particular libraries needed will vary depending upon the features desired.

    When you install software using pre-compiled binaries (Redhat type RPMs, Debian debs etc) you normally only get what is needed to run the programs themselves. In order to compile programs from source that use these libraries you also need to install the development packages. These are normally called the same name as the package suffixed by -devel or -dev. These development packages contain the header files (xxx.h) that Motion needs to build. If you build a library from sources you already have these header files. It is recommended to simply install the pre-compiled binary packages and their development brothers.

    Open a terminal and run the following commands to install the packages.

    Debian/Ubuntu/Raspberry Pi OS

    • Required
      • sudo apt-get install autoconf automake autopoint build-essential pkgconf libtool libzip-dev libjpeg-dev git gettext libmicrohttpd-dev

    • Optional Packages
      • FFMpeg Functionality(Required for creating movies, using network cameras, etc.)
        • sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev libswscale-dev libavdevice-dev

      • MySQL database functionality
        • sudo apt-get install libmysqlclient-dev

          or (depends upon your distribution and version)

          sudo apt-get install default-libmysqlclient-dev

      • MariaDB database functionality
        • sudo apt-get install libmariadb-dev

      • PostgreSQL database functionality
        • sudo apt-get install libpq-dev

      • SQLite3 database functionality
        • sudo apt-get install libsqlite3-dev

      • libcamera
        • sudo apt-get install libcamera-tools libcamera-dev

      • Webp Image Support
        • sudo apt-get install libwebp-dev

    openSUSE

    • Required
      • sudo zypper install autoconf automake autopoint libtool git

        sudo zypper install --type pattern devel_basis

        sudo zypper install libjpeg8-devel gettext libmicrohttpd

        sudo zypper install -t pattern devel_C_C++

    • Optional Packages
      • FFMpeg Functionality(Required for creating movies, using network cameras, etc. SEE NOTE BELOW!)
        • sudo zypper ar -f -n packman-essentials http://packman.inode.at/suse/openSUSE_13.1/Essentials/ packman-essentials

          sudo zypper ar -f -n packman-multimedia http://packman.inode.at/suse/openSUSE_13.1/Multimedia/ packman-multimedia

          sudo zypper install libffmpeg-devel

      • MySQL database functionality
        • Not known by author

      • MariaDB database functionality
        • Not known by author

      • PostgreSQL database functionality
        • Not known by author

      • SQLite3 database functionality
        • Not known by author

      • Webp Image Support
        • sudo zypper install libwebp-devel

      Important ffmpeg note: The ffmpeg libraries indicated above are provided by a external repository. This may change in the future. Validate that the repository is still valid when doing the install on openSUSE systems. The default for the configure is to require that ffmpeg is installed. Use the configure option to compile without the ffmpeg functionality.

    FreeBSD

    • Required packages
      • sudo pkg install autoconf pkgconf automake git gettext libmicrohttpd

    • Optional packages
      • FFMpeg Functionality(Required for creating movies, using network cameras, etc.)
        • sudo pkg install ffmpeg

      • MySQL database functionality
        • sudo pkg install mysql57-client openssl

      • MariaDB database functionality
        • Not known by author

      • PostgreSQL database functionality
        • sudo pkg install postgresql95-contrib

      • SQLite3 database functionality
        • sudo pkg install sqlite3

      • Webcam Support
        • sudo pkg install v4l_compat webcamd

        • Add cuse_load="YES" in /boot/loader.conf
        • Add webcamd_enable="YES" in the /etc/rc.conf
        • chmod 666 /dev/video0
      • Webp Image Support
        • sudo pkg install libwebp

      • Temorary bktr Support
        • sudo kldload bktr_mem.ko

          sudo kldload bktr.ko

          sudo sysctl hw.bt848.card=1 ( Miro pctv )

          sudo sysctl hw.bt848.tuner=10 ( PHILIPS_FR1216_PAL )

          sudo sysctl hw.bt848.format=0 ( PAL )

      • Persistent bktr Support
        • Add bktr_mem_load="YES" in /boot/loader.conf
        • Add bktr_load="YES" in /boot/loader.conf
        • Add hw.bt848.card=1 in /etc/sysctl.conf
        • Add hw.bt848.tuner=10 in /etc/sysctl.conf
        • Add hw.bt848.format=0 in /etc/sysctl.conf

    CentOS 8

    • Required
      • sudo yum install dnf-plugins-core yum config-manager --set-enabled PowerTools sudo yum groupinstall 'Development Tools'

        sudo yum install libjpeg-turbo libjpeg-turbo-devel gettext libmicrohttpd-devel

        sudo yum install libzip-devel

    • Optional Packages
      • FFMpeg Functionality(Required for creating movies, using network cameras, etc. SEE NOTE BELOW!)
        • sudo yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-8.noarch.rpm

          sudo yum install ffmpeg ffmpeg-devel

      • MySQL database functionality
        • Not known by author

      • MariaDB database functionality
        • sudo yum install mariadb-devel

      • PostgreSQL database functionality
        • sudo yum install postgresql-devel

      • SQLite3 database functionality
        • sudo yum install sqlite-devel

      • Webp Image Support
        • sudo yum install libwebp-devel

      Important ffmpeg note: The ffmpeg libraries indicated above are provided by a external repository. This may change in the future. Validate that the repository is still valid when doing the install on CentOS systems. The default for the configure is to require that ffmpeg is installed. Use the configure option to compile without the ffmpeg functionality.

    MacOSX

    • Required
      • Install brew as described on https://brew.sh
      • brew upgrade ffmpeg pkg-config jpeg libmicrohttpd-dev

        brew install ffmpeg pkg-config libjpeg libmicrohttpd

        export PATH="/usr/local/opt/gettext/bin:/usr/local/bin:$PATH"

    • Optional Packages
      • PostgreSQL database functionality
        • brew upgrade postgresql brew install postgresql

Configure Script

    Motion uses a set tools called the "autotools" in order to generate the required scripts in order to compile and install Motion. The next step after installing all of the required and desired libraries is to have the autotools create a configure script. To do this open a terminal and change to the directory with the source code and type

    autoreconf

    If the 'configure' file exists and contains a valid script, the tool will return immediately since no additional work needs to be completed. If the script needs updating, then it will take a moment to return. Once it has been executed, a file called 'configure' will exist in the directory. Note that if the command is run as

    autoreconf -f

    The -f parameter instructs it to force a new configure file to be created. This can be preferable in certain situations so that the configure script gets updated with the correct version number. Once the 'configure' file is created, we can execute it. What the script does is interrogate the system and look for all the needed items in order to compile Motion. In this process it looks to determine which optional components have been installed on the system and if found sets flags to indicate for them to be included. If a particular library is required by Motion and is not found, the configure script will issue an error. The error means that the library was not found because it was either not installed or that it was installed into a location that the script could not find. With the Motion configure script, once it has ended it also lists out all of the optional components that were located. Note that if you KNOW that a particular component is installed yet the configure script reports it as not installed, then it may be necessary to use one or more of the configure options described below to tell the script where to find the particular component.

    To run the configure your current directory must be the motion directory. You type

    ./configure

    You can add the parameter ./configure --help to get help on the different switches.

    When the configure script finishes you should validate that the options desired were correctly identified by the configure. In particular, the ffmpeg option is occasionally not found even if it is actually installed. Various users have indicated this to be a particular problem with the PI. If using a PI and have this issue, you can use the following option

    ./configure --with-ffmpeg=/usr/lib/arm-linux-gnueabihf

    For a long term option, you can edit the file $HOME/.bashrc and within it place the following two lines at the end PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf:$PKG_CONFIG_PATH export PKG_CONFIG_PATH This option will however only become effective the next time you open the terminal shell.

    The following options can be specified with the configure script to customize how Motion is built.
    Options Description
    Defaults for the options are specified in brackets [ ]
    Editors comment
    -h, --help display this help and exit
    --help=short display options specific to this package This command shows the options special to Motion.
    --help=recursive display the short help of all the included packages
    -V, --version display version information and exit Provides the version number of the source code and autotools
    -q, --quiet, --silent do not print `checking...' messages Illustrates only the results of the script.
    --cache-file=FILE cache test results in FILE. [disabled] No function
    -C, --config-cach alias for `--cache-file=config.cache' No function
    -n, --no-create do not create output files Used for testing if other switches produce error - without writing anything to the disk
    --srcdir=DIR find the sources in DIR. [configure dir or `..'] DIR is a directory path.
    Installation directories:
    --prefix=PREFIX install architecture-independent files in PREFIX
    [/usr/local]
    The default /usr/local means that

    The executable binary "motion" is installed in /usr/local/bin
    The manual page in /usr/local/man/man1
    The document files in /usr/local/docs/motion
    The configuration file in /usr/local/etc/motion
    The example config files in /usr/local/motion/examples

    If you are experimenting with many parallel versions it may be desirable to set the PREFIX to e.g. /usr/local/motion and then add /usr/local/motion/bin to your search path (or simply cd /usr/local/motion/bin before execution).

    This way you can change version just by changing the symbolic link in /usr/local/motion.

    If you are installing the software on a machine where you do not have access to the /usr/local but have write access to a home directory, then you should change this to point to a directory within your home tree.

    Example: --prefix=$HOME
    --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
    [PREFIX]
    This defines an alternative installation directory for the executable binary.
    Note: The executable binary will be placed in a directory "bin" below the directory specified by this option
    Author recommends leaving this as default (i.e. not setting it).
    --bindir=DIR user executables [EPREFIX/bin] With this option you can control exactly which directory the executable binary is installed. The previous option automatically adds the bin directory. Here you are in full control of the directory.
    --sbindir=DIR System admin executables [EPREFIX/sbin] Not used by Motion.
    --libexecdir=DIR program executables [EPREFIX/libexec] Not used by Motion.
    --datadir=DIR read-only architecture-independent data [PREFIX/share] Not used by Motion.
    --sysconfdir=DIR read-only single-machine data [PREFIX/etc] This is where Motion both installs the default configuration file and also where it will later search for it.
    Motion searches for the configuration file "motion.conf" in the following order:

      1. Current directory from where Motion was invoked
      2. $HOME/.motion
      3. The motion subdirectory inside the sysconfig directory set by this switch. If not defined the default is /usr/local/etc/

    Editor recommends leaving this at default. Be careful if you run "make install" again. This will overwrite the motion-dist.conf file that you may have edited.
    --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] Not used by Motion.
    --localstatedir=DIR modifiable single-machine data [PREFIX/var] Not used by Motion.
    --libdir=DIR object code libraries [EPREFIX/lib] Not used by Motion.
    --includedir=DIR C header files [PREFIX/include] Not used by Motion.
    --oldincludedir=DIR C header files for non-gcc [/usr/include] Not used by Motion.
    --infodir=DIR info documentation [PREFIX/info] Not used by Motion.
    --mandir=DIR man documentation [PREFIX/man] Editor recommends the default.
    Optional Packages:
    --without-bktr Exclude bktr video subsystem devices ONLY used in *BSD
    --without-v4l2 Exclude using v4l2 (video4linux2) subsystem. Makes Motion so it only supports network cameras. Can be used if you do not need support or lack some of the libraries for it.
    --without-webp Compile without webp image support
    --with-ffmpeg=DIR Specify the path for the directory prefix in which the library and headers are installed.
    If not specified configure will search in /usr/ and /usr/local/
    DIR is the directory PREFIX in which the ffmpeg shared libraries and their headers are installed.
    If you install ffmpeg from sources and use the default directories or if ffmpeg is installed as a binary package (RPM or deb) you may not need to specify the directory prefix. Configure should find the libraries automatically.
    If you installed ffmpeg from sources and specified a different --prefix when building f fmpeg you must use the same value for the DIR ( --with-ffmpeg=DIR) or export that location to be included in the PKG_CONFIG_PATH
    The option of --with-ffmpeg is the default for Motion. If the required libraries are not located, the configure script will stop at the ffmpeg section and report which libraries need to be installed. Once the required libraries are installed, run the script again. As noted previously, make sure to install the -dev versions.
    For more information on FFmpeg see the documentation for the FFmpeg project.
    --without-ffmpeg Do not compile with ffmpeg Use this if you do not want to compile with ffmpeg. If ffmpeg is not installed you must specify this option for Motion to build without ffmpeg.
    --without-mysql Do not compile with MySQL support Use this if you do not want to include MySQL support in the package.
    This can also be useful if you get compilation errors related to MySQL and you actually do not need the feature anyway.
    --without-mariadb Do not compile with MariaDB support Use this if you do not want to include MariaDB support in the package.
    This can also be useful if you get compilation errors related to MariaDB and you actually do not need the feature anyway.
    --without-pgsql Do not compile with PostgreSQL support Use this if you do not want to include PostgreSQL support in the package.
    This can also be useful if you get compilation errors related to PostgreSQL and you actually do not need the feature anyway.
    --without-sqlite3 Disable sqlite3 support in motion. Use this if you do not want to include SQLite3 support in the package.
    This can also be useful if you get compilation errors related to SQLite3 and you actually do not need the feature anyway.
    --without-optimizecpu Exclude autodetecting platform and cpu type. This will disable the compilation of gcc optimizing code by platform and cpu. Use this if the optimization causes problems. Not typically needed.
    --with-developer-flags Add additional warning flags for the compiler. This option is for developers only. It applies many compiler flags and errors on all warnings.
    --with-prototype-flags Add additional warning flags for the compiler. This option is similar to --with-developer-flags but does not include flags for prototypes.

Make

    Once the configure script has successfully finished and indicates all options desired, a 'makefile' is created. The makefile builds the Motion program and links in all of the required libraries. To run the makefile on most distributions, type: make

    The makefile will go through each of the files and compile them. Depending upon the source code obtained, there may be warnings or usually none.

    If the notifications indicate undefined references, then it is most likely that an additional library needs to be added in via the configure switches. Many of these additional missing libraries issues may be related to the version of ffmpeg and how it was built or installed. The following is a sample of some of the extra ffmpeg libraries that may need to be added to pkg-config .pc files that are located in the ffmpeg /lib/pkgconfig directory.

    -lavformat -lswscale -lavcodec -lavutil -lfdk-aac -lswresample -lm -lopus -lz -lva -lvpx -lx264 -lmp3lame -lbz2 -ldl -lvorbisenc -lvorbis -ltheoraenc -ltheoradec

    Once the makefile has completed correctly, it will report 'build complete'.

    If you have run make before, you should run a make clean before running make again. This cleans out all the object files that were generated the previous time you ran make. If you do not run make clean first before you rebuild Motion you may not get the additional feature included. For example: If you built Motion without ffmpeg support and then add it later and rebuild Motion without running make clean first the ffmpeg feature does not get compiled into the Motion binary.

    The first time you build Motion run ./configure, make, make install. If you need to build it again (to run with different configure options) run ./configure, make clean, make, make install.

Make Install

    Type make install to install the files.

    These commands create the required directories and copy the files into the following locations. (default directories):
    • /usr/local/bin
    • /usr/local/etc/motion
    • /usr/local/share/man/man1
    • /usr/local/share/doc/motion
    • /usr/local/share/locale

    The contents of what gets copied into each directory is as follows: (assuming the default PREFIX /usr/local was used when running configure. Otherwise adjust to the actual directory specified during the configure step.)
    • Executable binary "motion" to /usr/local/bin
    • Manual page "motion.1" to /usr/local/share/man/man1
    • Document files to /usr/local/share/doc/motion
    • Example configuration files "*.conf" to /usr/local/etc/motion
    • Translation files to /usr/local/share/locale/*/LC_MESSAGES
    Note that any existing files are overwritten. The default configuration file motion-dist.conf is named like this so that you do not get your working motion.conf file overwritten when you upgrade Motion.

Un-install

    From the Motion base installation directory run make uninstall

    And delete the base installation directory in /usr/local and any link pointing to it. If you have forgotten where you installed it or someone else did it for you, simply search for the files and directories starting with Motion. If the filenames and the directories match the names described in the "Make Install" section of this document, you can safely delete them.

Additional Make Options

    The make command can be run with several options. make, make install and make uninstall has already been described above.

    make clean
    deletes all the binary files (object files) and the motion binary generated by make. It also deletes temporary files and any jpg files that motion has saved in the motion source directory. It is very important to always run make clean before you run make if you change the configuration (like adding features such as ffmpeg) and rebuild motion.

    make distclean
    deletes the files: config.status, config.log, config.cache, Makefile, and motion.spec.

    make cleanall
    Removes files created by autoreconf and runs a make clean. Resets to only files provided from source

    maintainer-check
    Executes multiple configure and make using the developer flags for various combinations of the configure flags

Upgrading From Older Version

    If you are upgrading from an older version of Motion many options have been renamed, added or removed. The author recommends that you start by copying the configuration files from the older version to a safe location for reference only. Then start with a clean copy of the new motion-dist.conf installed and make changes to it.

Native Language Support(Translations)

    Motion now supports limited translations of message printed to the log or displayed on the web control page using the gettext application.

    Translations should appear automatically based upon the LANG environment variable set on the machine running Motion. To see the LANG code for your machine, open a terminal and type locale. If the log and web control still display in English, then this means that translations have not been completed for that language. The Motion developers rely on the community to provide these translations to the project. Even those that do not how to program can assist in this process by editing the files in the po directory.

motion-release-4.6.0/doc/motion_config.html000066400000000000000000010450121452402535500207410ustar00rootroot00000000000000 Motion

Basic Setup

    Motion is able to process images from many different types of cameras. The following is brief overview of the process to set up the Motion software.
    • Determine the type of camera
    • Specify the camera in the configuration files.
    • Start Motion from a terminal via the command line
    • Review the messages to ensure camera was found and press cntrl-c to exit
    • Specify a target_dir in the configuration file.
    • Enable the web stream in the configuration file
      • Specify a stream_port
      • Optionally turn off stream_localhost if you want to view the stream from a different computer
      • Optionally adjust the number of persistent connections of your browser. By default many browsers limit the number of simultaneous connections (usually to something like 5). Since Motion uses connections for each camera, it is possible that only the first 5 cameras are displayed on the all cameras home pages. To get around this, some browsers allow the user to specify a different(higher) number of simultaneous streams. For some browsers, this is specified via the network.http.max-persistent-connections-per-server option. For other browsers, users are not permitted to customize the settings. For these browsers, users will need to specify a different port for each camera stream. The connection limit is based upon the server:port combination therefore specifying a different port for each camera avoids the limitation.
    • Enable the web control in the configuration file
    The above should allow users to get Motion running and being able to view images via the stream. The next steps refine and finish a basic setup. The most difficult step in the above process will be the motion detection settings and specifying them to minimize the false positives. To assist this process, Motion provides the stream_preview_method option 3 which allows users to see side by side images of where the motion is occurring next to the regular image. Motion also includes a setup_mode which provides more values reported on the motion images and in the log to assist the setup.

    The following are some additional topics which may be of interest during the initial setup.

    Video4linux devices must be installed per the requirements of the camera. It is out of the scope of this document to tell you how to do this and it depends on which type of camera. Once the camera is installed it will have the device name(s) of /dev/video0, /dev/video1, /dev/video2...

    FreeBSD has a different naming scheme for pci devices that use the bktr subsystem. The bktr subsystem will report devices using a naming scheme of /dev/bktr0, /dev/bktr1, etc. These device may also need to use the other special device for the tuner. The tuner will need to be specified with the tunerdevice option as /dev/tuner0.

    USB cameras take a lot of bandwidth. A USB camera connected to a USB2 port or hub consumes virtually all the bandwidth that the port can handle. Even with a small framesize and low framerate you should not expect to have more than one camera per USB controller. If you need more than one USB camera it is possible to add extra USB PCI cards to your computer. It is also possible that your computer has more than one controller for different USB slots. For example, if the computer has six USB ports, the three on the left may be on controller A versus the three on the right may be on controller B. In this situation, connecting two cameras to ports only on the left would not work due to excessive bandwidth. However connecting one camera to port on the right and the other to the port on the left may work since they are on different controllers.

    Motion permits the use of video cards that have discreet input channels. Since USB cameras do not have input channels, the option input must be set to the value -1 for USB cameras.

    Network cameras are set up via the netcam_url parameter. The latest versions of Motion support rtsp format which many cameras now stream. Some users have requested a list of the network cameras that will work with Motion. Since Motion can now process RTSP streams, almost all cameras are supported. Simply review the specifications of the camera and validate that RTSP or RTMP is listed. The cameras that will not work are those specifically sold to be integrated into proprietary software monitoring systems. When determining cameras, consider carefully before selecting a wireless camera. Cameras require a solid consistent signal and use a lot of bandwidth. Inconsistencies in the wireless signal can result in a poor user experience so the use of a hardwired camera is recommended.

    The URL connection string to enter is specific to the camera and is usually provided by the manufacturer. The connection string is the same as what would be used by other video playing software such as VLC. If the camera does not stream via RTSP and instead uses a MJPEG, then Motion can also view that format. See the option netcam_url for additional options.

    The raspberry Pi camera is set up via an application called libcamera. libcamera provides access to the camera as a v4l2 device but this interface is only available when using a special application. Users must run Motion using the command libcamerify motion and then specify the /dev/videoX device in the Motion configuration file.

    With just one camera connected to the Pi, the device name should normally be /dev/video0. With multiple cameras connected, e.g. a regular USB web and the Pi camera, you will need to determine the device associated with the Pi camera and the USB camera. The list of devices can be seen using the command (v4l2-ctl --list-devices).

    Composite video cards are normally made with a chip called BT878 (older cards have a BT848). They all use the Linux driver called 'bttv'.

    There are cards with more then one video input but still only one BT878 chip. They have a video multiplexer which input is selected with the config option input. Input channel numbers start at 0 (which is why the value -1 and not 0 disables input selection). There are video capture cards available with 4 or 8 inputs but only one chip. They present themselves as one single video device and you select input using the 'input' option. If you define e.g. 4 camera config files with the same video device name but different input numbers Motion automatically goes into round robin mode.

    Many TV tuner cards have the input channels: TV Tuner = 0, Standard composite video = 1, S-VHS = 3. Others have TV=0, composite video 1= 1, composite video = 2, S-VHS = 3. For video capture cards input 1 is normally the composite video input.

    Some capture cards are specially made for surveillance with for example 4 inputs. Others have a TV tuner, a composite input and perhaps also a S-Video input. For all these cards the inputs are numbered. The numbering varies from card to card so the easiest is to experiment with a program such as VLC that can show the video stream.

    If you use the TV tuner input you also need to set the frequency of the TV channel using the option frequency. Otherwise set frequency to 0.

    Finally you need to set the TV norm. Values: 0 (PAL), 1 (NTSC), 2 (SECAM), 3 (PAL NC no colour). Default is 0 (PAL). If your camera is a PAL black and white you may get a better result with norm=3 (PAL no colour).

    Static files can also be processed by Motion in one of two ways. The first method is by using the netcam_url option and using a prefix of file:\\. With this method, Motion will process the file at the speed specified by framerate. This allows the user to either speed up or slow down the video processing to suit the particular need.

    The second option for processing a static file requires a bit of additional setup and uses a v4l2loopback device. To set this up, first install the loopback software as described in the Output - Pipe Options section of this guide to create a /dev/videoX device and then use software such as ffmpeg to stream the static file into the v4l2 device. e.g. ffmpeg -re -i mymovie.mp4 -f v4l2 /dev/video0 Then in a separate terminal, start Motion with it set to use the /dev/video0 device as input. This method can can also be used to reformat the content to a different format. The following outputs the original movie into a gray pixel format. ffmpeg -re -i mymovie.mp4 -f v4l2 -pix_fmt gray /dev/video0 This can be helpful as a interim process where ffmpeg supports a particular input but that format is not yet supported by Motion.

    Run as Service

    The following instructions are only applicable to Debian and Ubuntu based systems. For other distributions, users should consult their distribution documentation and provide pull requests to the Motion developers so that this section can be updated with their distribution.

    Motion can be set up to run as a service which means that it will start automatically whenever the computer is started. When setting up Motion to run as a service, it should be done only after all the other configuration has been completed. It is much easier to edit and revise the parameters when Motion is just running in a terminal rather than as a service. Motion now uses the systemctl and when running as a service, the option daemon must be set as off

    The following commands control the Motion service.
    • Start the Motion servicesudo systemctl start motion
    • Stop the Motion servicesudo systemctl stop motion

    When running as a service, Motion runs as the user motion and this user is automatically added to the user group of video. By only be included in this user group, when Motion is run, it will only have limited permissions. It is NOT recommended that this user get added to the sudo group. Instead, only add this user to groups that are specifically required.

Command Line Options

    SYNOPSIS motion [ -hbnsm ] [ -c config file path ] [ -d level ] [ -k level ] [ -p pid_file ] [ -l log_file ]

    • -c : Full path and filename of config file.
    • -h : Show help screen
    • -b : Run in daemon mode
    • -n : Run in non-daemon mode
    • -s : Run in setup mode. Also forces non-daemon mode.
    • -d : Run with message log level 1 - 9
    • -k : Run with message log type 1 - 9
    • -l : Full path and file name for log file
    • -p : Full path and file name for the process id file
    • -m : Start in pause mode

The Configuration Files

    If Motion was invoked with command line option -c pathname Motion will expect the config file to be as specified. When you specify the config file on the command line with -c you can call it anything.

    If you do not specify -c or the filename you give Motion does not exist, Motion will search for the configuration file called 'motion.conf' in the following order:

    1. Current directory from where motion was invoked
    2. Then in a directory called '.motion' in the current users home directory (shell environment variable $HOME). E.g. /home/goofy/.motion/motion.conf
    3. The directory defined by the --sysconfdir=DIR when running .configure during installation of Motion
      (If this option was not defined the default is /etc/motion)
    If you have write access to /usr/local/etc/motion then the editor recommends having only one motion.conf file in the default /usr/local/etc/motion directory.

    Motion has a configuration file in the distribution package called motion-dist.conf. When you run 'make install' this file gets copied to the /usr/local/etc/motion directory.

    The configuration file needs to be renamed from motion-dist.conf to motion.conf. The original file is called motion-dist.conf so that your working motion.conf file does not accidentally get overwritten when you re-install or upgrade to a newer version of Motion.

    If you have more than one camera you should not try and invoke Motion more times. Motion is made to work with more than one camera at the same time. The motion.conf file establishes global parameters that apply to all cameras and separate camera.conf files that specify the parameters that apply to each specific camera. The camera.conf files are specified at the bottom of the motion.conf file. If you only have one camera you only need the motion.conf file but if you have more than one camera, then you will need to have one camera config file per camera plus the motion.conf file.

    If you have for example two cameras you need motion.conf and two camera config files. So a total of three config files.

    An option that is common to all cameras can be placed in motion.conf. (You can also put all parameters in the camera files but that makes a lot of editing when you change a common thing).

    An option that is unique to a camera must be specified in each camera file.

    The first camera is defined in the first camera file called from motion.conf. The 2nd camera is defined in the 2nd camera file called from motion.conf etc.

    Any option defined in motion.conf will be used for all cameras except for the cameras in which the same option is defined in a camera config file.

    To make it clear, the camera files format and syntax is the same as motion.conf. An example of what you might want in a camera file as follows: assume you have two cameras, attached to one system. Create files camera0.conf and camera1.conf. At the end of motion.conf, uncomment out the lines that refer to them. The full contents of the camera files can be as simple as

    camera0.conf:
    video_device /dev/video0

    camera1.conf:
    video_device /dev/video1

    Motion reads its configuration parameters in the following sequence. If the same parameter exists more than one place the last one read wins
    1. Motion reads the configuration file motion.conf from the beginning of the file going down line by line.
    2. If the option "camera" is defined in motion.conf, the camera configuration file(s) is/(are) read.
    3. Motion continues reading the rest of the motion.conf file. Any options from here will overrule the same option previously defines in a camera config file.
    4. Motion reads the command line option again overruling any previously defined options.
    So always call the camera config files in the end of the motion.conf file. If you define options in motion.conf AFTER the camera file calls, the same options in the camera files will never be used. So always put the camera file call at the end of motion.conf.

    Nearly all config options can be unique for a specific camera and placed in a camera config file. There are a few options that must be in motion.conf and cannot be in a camera config file: webcontrol_* , daemon, and camera.

    If motion is built without specific features such as ffmpeg, mysql etc it will ignore the options that belong to those features.

    Deprecated Parameters

    Over the years, Motion has added many new configuration parameters and changed the name of a few of them so that there is some consistency to the parameter names. Since version 3.4.1, when a configuration parameter has a new name or additional functionality, Motion will try to interpret the value specified for the old parameter and translate it to the new parameter. These translations will be reported in the log as Motion is started. To eliminate these warnings, ensure that a webcontrol_port is specified and that the webcontrol_interface is specified as 0 (or not listed). Then start motion, open a browser and navigate to the webcontrol port. When on that page, select write configuration. This will re-write the configuration files with all the current parameters to Motion. Note that depending upon where the configuration files are located, Motion may need to be started using sudo.

    Parameters in distributed configuration files

    As of this writing, Motion includes over 150 parameters. With this volume of parameters, navigating the configuration file with every possible has become onerous. Starting with version 4.2, the distributed configuration files only include a limited subset of the configuration parameters. Users can add to the files as needed the parameters that are applicable to their set up. Users that wish to have every parameter listed and included in the configuration file can follow the process described immediately above in the Remove deprecated section. i.e. Use the webcontrol interface to write out the configuration file.

    Extended descriptions / documentation are not included in the configuration file. This guide should be consulted for documentation of the configuration parameters.

Signals (sent with e.g. kill command)

    A signal can be sent from the command line by typing e.g. kill -s SIGHUP pid, where the last parameter is the process ID which you get by typing ps -ef ¦ grep motion. The PID is the first on the list which is the parent process for the threads. Motion responds to the following signals:

    Signal Description Editors comment
    SIGHUP The config file will be reread. This is a very useful signal when you experiment with settings in the config file.
    SIGTERM If needed motion will create an movie file of the last event and exit
    SIGUSR1 Motion will create an movie file of the current event.

Configuration Options-Listed Alphabetically

Configuration Options-Listed by Topic

Configuration Options-Detail Descriptions

    The following section provides detailed descriptions of each of the configuration options.

    Conversion Specifiers

      %Y year %m month %d day
      %H hour %M minute %S second
      %T HH:MM:SS %v event %q frame number
      %t camera id number %D changed pixels %N noise level
      %w width of the image %h height of the image %i width of motion area
      %J height of motion area %K X coordinates of motion center %L Y coordinates of motion center
      %C value defined by text_event %f filename with full path %n number indicating filetype
      %o threshold %Q Number of labels from despeckle %{eventid} Unique identifier for event (cam id + date/time)
      %$ camera name %{fps} current frames per second %{host} name of computer running Motion
      %{ver} The version of Motion

      The use of quotation marks around string is permitted. In addition to the above, the conversion specifiers include the same options as for the C function strftime (3).

    System Processing

      daemon

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      When Motion is started, immediately go to daemon mode and release the terminal. Set the option to off when running Motion as a service.

      setup_mode

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      When this option is turned on, Motion starts in setup mode so that the parameters can be set more easily. In setup mode two things happen: With 'motion -s' Motion runs in console mode instead of daemon. It outputs a lot of useful information for each frame from the camera. Each message is prefixed by [number] where number is the camera id number. When you look at the webcam stream you see a black image with numbers. What you see is the number of changed pixels, number of labeled areas and noise setting. When something moves you see the pixels detected as Motion in black and white. The largest labeled area (assuming despeckle is enabled and with the 'l' at the end) is blue. It is only the blue areas which is counted as Motion. If smartmask is enabled you see this as red areas. Here is a suggestion how to initially setup Motion. (There are other ways to accomplish this.)

      • Disable despeckle (comment it out in motion.conf).
      • Disable smartmask
      • Enable both the webcontrol and streams make sure to specify the webcontrol_parms. The below assumes that the webcontrol is specified as port 8080 and the stream as 8081
      • Start Motion in setup mode
      • Open a browser and connect to the webcontrol interface. http://localhost:8080/ . You can now control and change almost anything while Motion is running. To disable a feature enter a space.
      • Start by experimenting with noise level. Do this both during daylight and during darkness. You will be surprised to see how much noise a camera makes during night. Try using the automatic noise feature. It should work for most.
      • Now try the despeckle feature. Enable it using the recommended default EedDl. If this is not enough experiment. Remember that the l must be the last letter.
      • Set the threshold to what you want to trigger Motion.
      In normal mode you can use the same setting with two browser tabs and experiment with settings of the camera if needed. From the web interface you can ask Motion to write all your changes back to the config files (motion.conf and camera config files).

      pid_file

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      Specify the full path and file name in order to store the pid for processing.

      log_file

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      Use this option to specify the full path and filename to use for logging of the messages generated from Motion. If this option is not defined, the stderr and syslog is used. Note that Motion can generate a LOT of messages and as a result, this option should be considered if the log_level is at any of the higher levels.

      log_level

      • Type: Integer
      • Range / Valid values: 1 - 9
      • Default: 6

      This option specifies the level of verbosity of the messages sent from Motion. At a level of 8(DBG), there are a LOT of messages. At a level of 1(EMR) virtually no messages will be output.

      The various levels are [1..9] (EMR, ALR, CRT, ERR, WRN, NTC, INF, DBG, ALL).

      When reporting any issues or errors associated with the Motion application, use the INF level.

      log_type

      • Type: Discreet Strings
      • Range / Valid values: See Below
      • Default: ALL

      The different components of Motion use different log types. This option allows the user to only show the messages from particular components. The choices for this option are: COR, STR, ENC, NET, DBL, EVT, TRK, VID, ALL

      quiet

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: on

      Be quiet, don't output beeps when detecting motion. Only works in non-daemon mode.

      native_language

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: on

      Enable native language for Motion webcontrol and log messages.

      Motion will use the locale variable LANGUAGE for determining the webcontrol and log messages. If messages or the webcontrol still display in English, then the messages / words have not yet been translated.

      Please consider helping the developers by submitting pull requests to add new translations and correcting any inaccurate translations.

      When this option is specified as 'off', the webcontrol and log messages will be provided in English.

      camera_name

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      This option specifies a camera name to be used in the format specifiers as well as on the web interface.

      camera_id

      • Type: Integer
      • Range / Valid values: 1 - 32000
      • Default: The sequence that the camera file is read

      This option is useful for situations where there are multiple cameras being used by Motion. This option allows for the assignment of a numeric id number that can be used in database queries, format specifiers as well as for the web interface and streams.

      If this option is not specified, the thread number as determined by Motion is used. The number assigned to each camera must be unique.

      When using multiple cameras, the default for the main thread is 0 (zero) but this can be overridden as needed by specifying a camera_id in the motion.conf file even though there are not any cameras running on this thread.

      camera

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The full path and file name for the camera file. Motion allows for this line to be listed in the motion.conf file multiple times. These specifications should be the LAST lines in the motion.conf file. See the Configuration Files section within this guide for a complete discussion of what to put into the camera0.conf, camera1.conf, cameraX.conf files that would be specified in this option.

      camera_dir

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      This option specifies a directory to contain the individual camera configuration files. Any files ending in '.conf' in this directory will be read as a camera config file.
      Users can disable a camera (config file) by renaming it so it does not end with '.conf'.

      target_dir

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined = current directory

      The full path for the target directory for picture and movie files to be saved. The default is the current directory. This is the target directory for all snapshots, picture files and movie files. You will normally always want to specify this parameter as an absolute path.

      Note that the file name options are all saved relative to this target_dir This means in principle that you can specify target_dir as '/' and be 100% flexible. But this is NOT recommended. It is recommended that this directory be specified as deep as possible.

      watchdog_tmo

      • Type: int
      • Range / Valid values: Integer
      • Default: 30

      The number of seconds a camera can be non-responsive before Motion attempts to stop the camera gracefully.

      watchdog_kill

      • Type: int
      • Range / Valid values: Integer
      • Default: 30

      The number of seconds after the timeout has expired until Motion forcefully kills the camera that is unresponsive.

    Video4Linux Device

      Please refer to the Basic Setup section of this guide for an additional discussion of Video4Linux devices and how to test and specify them correctly for Motion.

      video_device

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: /dev/video0

      The video device to be used for capturing. Default is /dev/video0. See the Basic Setup section of this guide for an additional discussion of this option.

      This option is the usual method to specify the video4linux device name. If the camera does not work when specifying it with this option, it is also possible to specify the device in the netcam_url with the v4l2 prefix option. The netcam_url option uses an alternative method to open and operate the device which may work with this option fails. If the netcam_url is used for either this alternative method or for a normal network camera, the video_device option is ignored.

      Since the exact device number is set by the kernel upon boot, when there is more than one video device it is possible that the particular cameras that were assigned to /dev/video0 and /dev/video1 may switch. In order to set up Motion so that a particular camera is always assigned the same way, users can set up a symbolic link using udev rules. To do this a unique attribute must be identified for each camera. The camera attributes can be viewed by using the command udevadm info -a -p $(udevadm info -q path -n /dev/video0) while the camera is attached. Usually a serial number can be used. ("Usually" because some cameras have been observed to have the same serial number for different cameras)

      Once a unique attribute has been identified for each camera, edit or create the file /etc/udev/rules.d/99-local.rules.

      Assuming that the unique attribute for the camera was name and was ATTR{name}=="Philips SPC 900NC webcam" you would add the following line to the 99-local.rules file: KERNEL=="video[0-9]*", ATTR{name}=="Philips\ SPC\ 900NC*", SYMLINK+="video-webcam0"

      Once the change has been made and saved, reboot the computer and there should now be a "sticky" device called /dev/video-webcam0

      video_params

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      For most devices the configuration options are automatically assigned but devices also usually allow the user to change certain settings to suit their needs. The options that the camera manufacturer permits the user to change are called "controls". The video_params option allows users to specify values for these controls when Motion runs.

      The video_params option also allows users to specify some Motion specific parameters that are used to open the camera. In previous versions of Motion, these options were the frequency, input, norm and v4l2_palette options. These options have now been embedded into the video_params option to provide consistency.

      The following is the list of previous Motion options that have now been replaced by the video_params option.
      • brightness
      • contrast
      • hue
      • power_line_frequency
      • saturation
      • frequency
      • input
      • norm
      • v4l2_palette

      While it always recommended that users remove older configuration options and only use the new options, if users have within the configuration file any of the deprecated options list above, Motion will continue to read those values and upgrade them into the new video_params option. The resulting pictures from the device may however may not be comparable due to different interpretations of the values.

      It is therefore highly recommended that users remove the old configuration values and calibrate their devices only using this new configuration option.

      To use this parameter, users will need to first identify the name or ID description of the particular control. Next, simply specify the control/id followed by an equal sign and then the desired value. The specification of multiple controls can be specified by separating them with a comma.

      Since the name of some controls can include a comma or spaces, names can also be specified by enclosing them in double quotes. To help users know which controls are available for their device, the Motion log will report the available controls, associated IDs and minimum/maximum values permitted when the log_level is specified as INF or higher.

      e.g. Change the log_level to INF, start up Motion with the device attached and specified, let it report items to the log and then shut Motion down. Within the Motion log, it will list which controls the device has that can be adjusted.

      The following is a sample output from the log and examples of how to specify the parameters

      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ---------Controls---------
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: V4L2 ID Name and Range
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID09963776 Brightness, 0 to 127
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID09963777 Contrast, 0 to 63
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID09963778 Saturation, -100 to 100
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID09963788 White Balance, Automatic, 0 to 4
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: menu item: Value 0 Indoor (Incandescant Lighting)
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: menu item: Value 1 Outdoor (Sunlight) Mode
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: menu item: Value 2 Indoor (Fluorescent Lighting) M
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: menu item: Value 3 Manual Mode
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: menu item: Value 4 Auto Mode
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID09963790 Red Balance, 0 to 255
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID09963791 Blue Balance, 0 to 255
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID09963792 Gamma, 0 to 31
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID09963793 Exposure, 0 to 255
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID09963794 Gain, Automatic, 0 to 1
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID09963795 Gain, 0 to 63
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID09963804 Backlight Compensation, 0 to 1
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID09963807 Color Effects, 0 to 1
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: menu item: Value 0 None
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: menu item: Value 1 Black & White
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID09963809 Band-Stop Filter, 0 to 1
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID10025216 Auto contour, 0 to 1
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID10025217 Contour, 0 to 63
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID10025218 Dynamic Noise Reduction, 0 to 3
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID10025219 Auto White Balance Speed, 1 to 32
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID10025220 Auto White Balance Delay, 0 to 63
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID10025221 Save User Settings, 0 to 0
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID10025222 Restore User Settings, 0 to 0
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: ID10025223 Restore Factory Settings, 0 to 0
      • [1:ml1:c1] [INF] [VID] v4l2_ctrls_list: --------------------------

      Example 1: Set the gain to manual, then the gain to 50 and the brightness to 30

      video_params "Gain, Automatic"=1,ID09963795=50, brightness=30

      a equally valid alternative method for specifying this example would be

      video_params ID09963794=1,ID09963795=50, ID09963776=30

      or another way of specifying it could be

      video_params ID09963794=1,"Gain"=50, "brightness"=30

      Example 2: Set the saturation to 50 and the contrast to 100

      video_params saturation=50,contrast=100

      As can be seen in these examples, the specification can use either the control ID or the name of the control. If the control name has embedded blanks or commas, then it must be enclosed in quotes. Special care should be taken when using the name. As shown above, there is a comma that separates the name of the control versus the valid range of values. That comma is NOT part of the control name and only delimits the end of the name for the Motion log.

      palette

      • Type: Integer
      • Range / Valid values: 0 - 20
      • Default: 17

      The palette option is specified in the video_params option and allows the user to specify the preferred palette for Motion to use. If the video device does not support this preferred format, Motion will loop through the available palettes to try to find one that is supported by both Motion and the device.

      Motion will report the supported palettes of the device when Motion starts when the log_level is specified as NTC or higher.

      The default of 17 is highly preferred over all other formats since this the native format that Motion uses internally.

      The following are each of the palette options. For the Motion configuration, specify the numeric value as the Motion option.

      V4l2 Option FOURCC v4l2_palette option
      V4L2_PIX_FMT_SN9C10X S910 0
      V4L2_PIX_FMT_SBGGR16 BYR2 1
      V4L2_PIX_FMT_SBGGR8 BA81 2
      V4L2_PIX_FMT_SPCA561 S561 3
      V4L2_PIX_FMT_SGBRG8 GBRG 4
      V4L2_PIX_FMT_SGRBG8 GRBG 5
      V4L2_PIX_FMT_PAC207 P207 6
      V4L2_PIX_FMT_PJPG PJPG 7
      V4L2_PIX_FMT_MJPEG MJPG 8
      V4L2_PIX_FMT_JPEG JPEG 9
      V4L2_PIX_FMT_RGB24 RGB3 10
      V4L2_PIX_FMT_SPCA501 S501 11
      V4L2_PIX_FMT_SPCA505 S505 12
      V4L2_PIX_FMT_SPCA508 S508 13
      V4L2_PIX_FMT_UYVY UYVY 14
      V4L2_PIX_FMT_YUYV YUYV 15
      V4L2_PIX_FMT_YUV422P 422P 16
      V4L2_PIX_FMT_YUV420 YU12 17
      V4L2_PIX_FMT_Y10 Y10 18
      V4L2_PIX_FMT_Y12 Y12 19
      V4L2_PIX_FMT_GREY GREY 20

      It is possible that after looping through all of the palette options for the camera, Motion will not find a palette that is acceptable for processing. In this situation, it may be possible to be the camera to work using the netcam_url option with the v4l2 prefix.

      input

      • Type: Integer
      • Range / Valid values: -1, 0 - ?
      • Default: -1

      The input option is specified in the video_params option and allows the user to specify the input channel to use for the device.

      For USB cameras, the input option should specify -1.

      For other devices such as capture cards, the input option is device dependent but usually starts with zero. Using an external application such as VLC can allow for easier specification of the input associated with the camera.

      norm

      • Type: Integer
      • Range / Valid values: 0 (PAL), 1 (NTSC), 2 (SECAM), 3 (PAL NC no colour)
      • Default: 0 (PAL)

      The norm option is specified in the video_params option and allows the user to specify the television norm to use for the device.

      frequency

      • Type: Integer
      • Range / Valid values: 0 - 999999
      • Default: 0 (Not set)

      The frequency option is specified in the video_params option and allows the user to specify the frequency to use for the device.

      The default is 0 meaning it is not set. This option is only relevant if the device is a TV tuner card where the frequency can be set.

      auto_brightness

      • Type: Integer
      • Range / Valid values: 0 - 3
      • Default: 0

      Let motion regulate the brightness of a video device. Only recommended for cameras without auto brightness Motion will try to adjust the brightness of the video device if the images captured are too dark or too light. This option will be most useful for video devices which sometimes don't have such an option in hardware. The auto_brightness feature will adjust the brightness of the device up or down until the value is close to a target value.

      By default, the target value is the midpoint between the minimum and maximum value permitted for the control being adjusted. (See methods available below)

      Users can specify a different target value by specifying a value for the control in the video_params option.

      Motion allows for three possible methods for adjusting the brightness.
      • 1: Use the brightness control to regulate the brightness (equivalent to specifying on/yes)
      • 2: Use the exposure control to regulate the brightness
      • 3: Use the exposure absolute control to regulate the brightness

      tuner_device

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: /dev/tuner0

      The tuner device used for controlling the tuner in a tuner card. This option is only used when Motion is compiled for FreeBSD with the bktr option. See the Basic Setup section of this guide for a additional discussion of this option.

      roundrobin_frames

      • Type: Integer
      • Range / Valid values: 1 - 2147483647
      • Default: 1

      Specifies the number of frames to capture before switching inputs, this way also slow switching (e.g. every second) is possible. The Round Robin feature is automatically activated where multiple cameras are sharing the same video device. Each camera can then set different input or frequency options to change camera. If multiple cameras use the same video device, they each can capture roundrobin_frames number of frames before having to share the device with the other cameras.

      Round Robin is not relevant for Network cameras or standard USB web cameras. It is used with video capture cards which have multiple inputs per video chip. This is not the ideal way to run multiple cameras. When the capture card changes input it takes some time before the decoder chip has synchronized to the new camera. You can improve this if you have expensive cameras with a synchronized input. Only one camera can be decoded at a time so if you have 4 cameras connected 3 of the cameras will need to wait for their turn. The fact that cameras have to take turns and the fact that you have to skip a few frames after each turn dramatically lowers the possible framerate. You can get a high framerate by viewing each camera for a long time. But then you may miss the action on one of the inactive cameras. If you can afford it avoid Round Robin and buy the more expensive type of capture cards that has one decoder chip per input. If you only need 2 or 3 cameras you can also simply put 2 or 3 cheap TV cards in the computer. Linux has no problem working with multiple TV cards. (or better yet, it multiple cheap network cameras) If multiple cameras use the same video device, they each can capture roundrobin_frames number of frames before having to share the device with the other cameras. When another camera wants to watch another input or frequency or size the first roundrobin_skip number of frames are skipped to allow the device to settle. The last option roundrobin_switchfilter is supposed to prevent the change of camera from being detected as Motion. Its function is not perfect and sometimes prevents detection of real motion. You should start with having the option disabled and then try with the option enabled to see if you can skip less frames without loosing the detection of the type of motion you normally want to detect.

      roundrobin_skip

      • Type: Integer
      • Range / Valid values: 1 - 2147483647
      • Default: 1

      Specifies the number of frames to skip after a switch. (1 if you are feeling lucky, 2 if you want to be safe). The Round Robin feature is automatically activated where multiple cameras are sharing the same video device. Each camera can then set different input channels or frequencies to change camera. When another camera wants to watch another input or frequency or size the first roundrobin_ skip number of frames are skipped to allow the device to settle.

      roundrobin_switchfilter

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      Turns the switch filter on or off. The filter can distinguish between most switching noise and real motion. With this you can even set roundrobin_skip to 1 without generating much false detection. This is a round robin related feature used when you have a capture card with multiple inputs (controlled by the 'input' option) on the same video_device.

    Network Cameras

      Motion can connect to certain network cameras. Please refer to the Basic Setup section of this guide for an additional discussion of network camera and how to test and specify them correctly for Motion.

      Motion cannot connect to a video stream such a mpeg, mpeg4, divx to connect to streams such as these the user may review the static files portion of the Basic Setup section of this guide which illustrates some possible work arounds using ffmpeg and v4l2loopback devices.

      The URL must return one single jpeg image, a mjpeg stream a RTSP stream, RTMP stream, file or ftp. When getting a still image, make sure to validate that the camera is serving up a actual raw JPG file and not a HTML page with an embedded JPG which Motion will not be able to process. When the netcam_url is defined the video4linux options above are mostly ignored.

      If the connection to a network camera is lost, Motion will reuse the last good image for approx 30 seconds. After 30 seconds the image is replaced by a grey image with a text telling that the signal is lost and when the connection was lost. This text and its date format is not configurable.

      netcam_url

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      URL for a network camera.

      The list below illustrates some of the more common protocols for network cameras but Motion does not restrict the protocols to this list. Other protocols that are available via the ffmpeg libraries can also be specified.

        http://
          This prefix uses the traditional http format and opens a netcam that provides a motion jpg image.

          When using the rtsp format, Motion will ignore the netcam_keepalive and netcam_tolerant_check options.

        rtsp://
          This prefix is the standard for all modern network cameras. It is recommended that users search the web or the camera manual for the exact connection string to use for their camera.

          Once a potential connection string is found, it should be validated as being functional using a external application such as ffplay or vlc.

          The connection string that works for these applications is what needs to be specified for this option.

          When using the rtsp format, Motion will ignore the netcam_keepalive and netcam_tolerant_check options.

        rtmp://
          This prefix may be available on modern network cameras. It is recommended that users search the web or the camera manual for the exact connection string to use for their camera.

          Once a potential connection string is found, it should be validated as being functional using a external application such as ffplay or vlc.

          The connection string that works for these applications is what needs to be specified for this option.

          When using the rtmp format, Motion will ignore the netcam_keepalive and netcam_tolerant_check options.

        file://
          This option allows for the processing of a existing movie file. Motion will open the file and process the file at the framerate specified in the Motion configuration file. Note that since the file may have been created using a different framerate than specified in the Motion config file, the file may be processed at either a faster or slower rate than real time.

          A sample format for the netcam_url would be netcam_url file:///home/user/cam1/cam1_20180817084027.mkv

          This option is useful for "reprocessing" a movie created by Motion to fine tune the detection options.

          At the end of the movie file, Motion will restart the movie file at the beginning so that you can continue to refine the detection parameters.

        v4l2://
          This option allows for an alternative method of using a v4l2 device that is not natively supported by Motion.

          A sample format for the netcam_url would be v4l2:///dev/video0 Internally, this is equivalent to running the following from the command line ffplay -f v4l2 /dev/video0

        mjpeg://
          This is an alternative prefix for http for use when Motion is compiled without ffmpeg.

        mjpg://
          This option may process very old netcams with non standard mjpeg formats.

        jpeg://
          This option is for processing a static JPG file that is updated by processes external to Motion. It must be a local file and specified such as jpeg:///path/current.jpg

        ftp://
          This prefix opens the ftp site and grabs a static image. The camera will be expected to periodically replace that static image as it processes images.

      netcam_params

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: varies by camera type

      This option allows for specification of parameters to the network camera. The format for specifying parameters and values is the same as what is given in the examples for video_params. The parameters are delimited by commas and provided in the format of parameter_name = parameter_value.

      For cameras that use the url prefix of mjpeg, ftp, mjpg, and jpeg the options permitted are limited to keepalive, proxy and tolerant_check. These parameters correspond to the options provided in previous versions of Motion.

      For cameras that use other url prefixes, the parameters permitted are those available from the ffmpeg library plus a some that are specific to Motion as specified below. The options of keepalive, proxy, tolerant_check are not applicable to these cameras.

      The following summarizes some of the options. Full descriptions of all the ffmpeg options will be contained in the documentation for ffmpeg.

      keepalive

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: off

      The keepalive option is specified in the netcam_params option.

      The setting for keep-alive of network socket, should improve performance on compatible net cameras.
      • off: The historical implementation using HTTP/1.0, closing the socket after each http request.
      • force: Use HTTP/1.0 requests with keep alive header to reuse the same connection.
      • on: Use HTTP/1.1 requests that support keep alive as default.

      proxy

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The proxy option is specified in the netcam_params option.

      URL to use for a netcam proxy server, if required. The syntax is http://myproxy:portnumber Use this if you need to connect to a network camera through a proxy server. Example of syntax: "http://myproxy.mydomain.com:1024 If the proxy port number is 80 you can omit the port number. Then the syntax is use "http://myproxy.mydomain.com" . Leave this option undefined if you do not use a proxy server.

      tolerant_check

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      The tolerant_check option is specified in the netcam_params option.

      Use less strict jpeg checks for network cameras

      decoder

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The decoder option is specified in the netcam_params option.

      This option is specific to the Motion software and allows for specifying a user requested decoder for the camera. Motion will try to open the camera using the decoder specified by this parameter. If it not successful, it will fall back to the default decoder. This option may improve performance in certain situations for certain platforms and cameras.

      Users can find the names of the decoders in ffmpeg on their system by going to a command prompt and typing ffmpeg -decoders and looking for the name of the decoder with a 'D' next to it and correlating this with the type of image provided from the camera. Note that although the decoder may be listed, it still may not work within Motion.

      In addition to the decoders specified by ffmpeg, additional different decoder options may also be found by reviewing the Motion log. These decoders will be shown as "available" in the log when log_level is specified at the INF level or higher.

      Not all decoders will work even if they are indicated as available or work using ffmpeg externally to Motion. If the camera does not open using the requested decoder, try a different decoder or leave this parameter empty to use the default.

      capture_rate

      • Type: int
      • Range / Valid values: Integer
      • Default: framerate

      The capture_rate option is specified in the netcam_params option.

      This option allows for the user to request a specific frame per second (FPS) capture rate for the network camera. This is needed at times so that the rate Motion is capturing images is in sync with what the camera is sending.

      When this value is used, it makes a slight distinction from the usual interpretation of framerate. The capture_rate will specify how fast images are captured and decoded and the framerate will specify the rate at which they are processed for motion.

      For example, if the capture_rate were set to be 10 and the framerate was set to be 20, what would happen is that each captured image would end up going through the Motion detection / processing routines twice because that loop is processing at twice the speed of the capture loop. Conversely, if the capture_rate was set to 20 and the framerate is specified as 10, then Motion will be detecting and processing every other image captured.

      The reason that the capture_rate is not systematically set to the framerate within Motion has to with the camera. Each camera will provide a stream of images usually in some compression format such as H264 or H265 and provide those images at a particular FPS. If the capture and decoding FPS of Motion is set to a rate lower than the camera, decoding and disconnection errors will occur.

      To avoid the decoding and disconnection errors, it is recommended that the FPS of the camera be adjusted where possible. Generally, it is preferable to have the FPS of the camera be slightly lower than the capture_rate of Motion. This allows for the decoder to perform better and reduce decoding errors. For example if the capture_rate is set at 5 and the camera is sending images at 30 FPS, the resulting images, processing latency, etc is going to be extremely "poor". But if the camera FPS is set at 4 instead, the results will "better".

      Reviews of the Motion log at the INF level can assist in determining whether a higher capture_rate is required. In particular, look for the following:
      • Log messages indicating what the netcam capture rate is versus the log entry for the camera FPS.
      • The network camera is disconnecting and reconnecting frequently.
      • A significant number of ffmpeg_avcodec_log messages

      rtsp_transport

      • Range / Valid values: tcp, udp, see ffmpeg documentation
      • Default: tcp

      The rtsp_transport option is specified in the netcam_params option. This option is from the ffmpeg libraries.

      The rtsp_transport value of tcp is highly preferred because without this option the rtsp/rtmp images are frequently corrupted and result in many false positive values and images that appear to be smeared.

      For some cameras, a tcp transport is not provided from the camera. Some Motion users have reported using netsed can workaround this limitation of the camera using the following method:

      Instead of: netcam_url rtsp://192.168.0.51:554/onvif1
      Use: netcam_url rtsp://127.0.0.1:554/onvif1
      Then in a different process, start netsed to substitude AVP; with AVP/TCP;
      netsed tcp 554 192.168.0.51 554 's/AVP;/AVP%2FTCP;'

      input_format

      • Range / Valid values: mjpeg, h264, see ffmpeg documentation
      • Default: tcp

      The input_format option is specified in the netcam_params option. This option is from the ffmpeg libraries. This option is used for specifying the palette format of the camera when using the v4l2 via netcam option.

      netcam_high_url

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The network camera high resolution URL used in conjunction with the netcam_url parameter. Users may specify the normal resolution in the netcam_url and that will be used for the motion detection and then specify the high resolution url for this parameter.
      Motion detection on the normal resolution will trigger the saving of images from the high resolution stream. Note that the ONLY overlay that will be present on the resulting high resolution pictures and movies is the privacy mask. The other overlays such as date/time, motion boxes, camera name, etc will not be included. Users wishing to see those overlays on the resulting images and movies will need to specify the high resolution url as the netcam_url and not use this option.

      If the netcam_url is not specified, this option is ignored.

      When this option is used with the movie_passthrough even less processing occurs. Since the movie_passthrough bypasses decoding the stream, images will be saved as provided from the camera and the privacy mask will not be applied.

      netcam_high_params

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: varies by camera type

      This option is the same as netcam_params option except this option applies the parameters to the high resolution camera.

      netcam_userpass

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The username and password for the network camera. The string is specified as username:password. If the camera does not have any authentication to the stream, leave this option empty.

    Raspberry Pi Camera

      Motion can use the Raspberry Pi camera when connected and Motion is compiled and installed with the MMAL support. Before setting up Motion with the camera, it is recommended that the user first validate that the camera is functional with the raspistill/raspivid applications.

      Please refer to the Basic Setup section of this guide for an additional discussion of network camera and how to test and specify them correctly for Motion.

      mmalcam_name

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      Name of camera to use if you are using a camera accessed through OpenMax/MMAL. The standard Raspberry Pi camera device name is "vc.ril.camera" without the quotes.

      Motion will ignore this option when the MMAL support is not included. In these situations, users will need to use the modprobe method of setting up the camera as a v4l2 device. See the Basic Setup section of this guide for further details.

      mmalcam_params

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      This option allows the user to specify control parameters to the Pi camera. The documentation of all of the options available to the Raspberry Camera module is beyond the scope of this guide. In general, the command line options that are available via the raspistill / raspivid applications are the options that can be specified in this Motion configuration option. Some of the more frequently used options are:
      • Horizontal Flip: -hf
      • Vertical Flip: -vf
      • Rotation: -rot

      Motion will ignore this option when the MMAL support is not included. In these situations, users will need to use the modprobe method of setting up the camera as a v4l2 device. See the Basic Setup section of this guide for further details.

    Image Processing

      width

      • Type: Integer
      • Range / Valid values: Device Dependent
      • Default: 640

      The width in pixels of each frame. Valid range is camera dependent.

      For all devices, the width must be a multiple of 8.

      Motion does not scale v4l2 devices and http netcams so the value should be set to the actual size of the image provided by the device. In case of a rtsp/rtmp network camera, Motion will rescale the camera image to the requested dimensions. This rescaling comes at a very high CPU cost so it is recommended that the network camera send the image in the same dimensions as included in the configuration file.

      While Motion will not rescale the image provided, it will attempt to set the size of the image coming from the video4linux device to match the values provided for height/width.

      It is important to realize that certain height/width combinations are only valid at certain frame rates. The particular combinations which are valid are dependent upon the device.

      For some device drivers like pwc (driver for Philips USB cameras) setting the size to a non-standard value makes the driver create an image of the nearest smaller size and create a gray band around the image to fit the size given by motion. Note that it is the driver and not motion that generates the gray band. Motion will try to detect motion in the entire image including the gray band.

      height

      • Type: Integer
      • Range / Valid values: Device Dependent
      • Default: 480

      The height in pixels of each frame. Valid range is camera dependent.

      For all devices, the height must be a multiple of 8.

      Motion does not scale v4l2 devices and http netcams so the value should be set to the actual size of the image provided by the device. In case of a rtsp/rtmp network camera, Motion will rescale the camera image to the requested dimensions. This rescaling comes at a very high CPU cost so it is recommended that the network camera send the image in the same dimensions as included in the configuration file.

      While Motion will not rescale the image provided, it will attempt to set the size of the image coming from the video4linux device to match the values provided for height/width.

      It is important to realize that certain height/width combinations are only valid at certain frame rates. The particular combinations which are valid are dependent upon the device.

      For some device drivers like pwc (driver for Philips USB cameras) setting the size to a non-standard value makes the driver create an image of the nearest smaller size and create a gray band around the image to fit the size given by motion. Note that it is the driver and not motion that generates the gray band. Motion will try to detect motion in the entire image including the gray band.

      framerate

      • Type: Integer
      • Range / Valid values: 2 - 100
      • Default: 15

      Maximum number of frames to be captured from the camera per second. The faster you fetch pictures from the camera the more CPU load you get and the more pictures get included when Motion is detected. Motion will stop storing pictures if the framerate is set to less than 2. Set this parameter to the maximum number of images per second that you want to store either as images or movies. To set intervals longer than one second use the 'minimum_frame_time' option instead.

      minimum_frame_time

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      Minimum time in seconds between the capturing picture frames from the camera. Default: 0 = disabled - the capture rate is given by the camera framerate. This option is used when you want to capture images at a rate lower than 2 per second. When this is enabled the framerate option is used only to set the pace the Motion service the webcam port etc.

      rotate

      • Type: Discrete Integers
      • Range / Valid values: 0, 90, 180, 270
      • Default: 0 (not rotated)

      Rotate image the given number of degrees. The rotation affects all saved images as well as movies. The rotation feature is used when the camera is hanging upside down (180 degrees) or if you choose a picture format in portrait instead of the normal landscape (90 or 270 degrees). Note that the CPU load increases when using this feature with a value other than 0. Also note that Motion automatically swaps width and height if you rotate 90 or 270 degrees, so you don't have to touch these options.

      flip_axis

      • Type: Discrete Strings
      • Range / Valid values: none, v, h
      • Default: none (no change)

      Flip the image according to specified axis. The flip affects all saved images as well as movies. The flip feature is used when the camera is pointed towards a mirror or provides itself a mirrored image (as found in some cars). Note that the CPU load increases when using this feature with a value other than none.

      locate_motion_mode

      • Type: Discrete Strings
      • Range / Valid values: on, off, preview
      • Default: off

      Locate and draw a box around the moving object. Value 'preview' makes Motion only draw a box on a saved preview jpeg image and not on the saved movie.

      locate_motion_style

      • Type: Discrete Strings
      • Range / Valid values: box, redbox, cross, redcross
      • Default: box

      Set the look and style of the locate box if enabled.

      text_left

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined
      User defined text overlaid on each in the lower left corner. Use A-Z, a-z, 0-9, " / ( ) @ ~ # < > \ , . : - + _ \n and conversion specifiers

      If the option is not defined no text is displayed at this position.

      You can use Conversion Specifiers to define this field and also include a new line specifier as \n and spaces if this option is enclosed in quotes.

      By combining spaces and new lines '\n' you can place your text anywhere on the picture. When setting the text using http remote control the text must be URL encoded. The browser does this for you. If you need to set it with a command line tool, use a browser first and let it make the encoded URL for you. Then you can copy paste it to your script file or cron line or whatever you want to use.

      This is how the overlaid text is located.

      CHANGES
       
       
       
       

       
       
       
       TEXT_LEFT

       
       TEXT_RIGHT
      YYYY-MM-DD
      HH:MM:SS 

      text_right

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: %Y-%m-%d\\n%T

      User defined text overlaid on each in the lower right corner. Use A-Z, a-z, 0-9, " / ( ) @ ~ # < > \ , . : - + _ \n and conversion specifiers

      If the option is not defined no text is displayed at this position.

      You can use Conversion Specifiers to define this field and also include a new line specifier as \n and spaces if this option is enclosed in quotes.

      By combining spaces and new lines '\n' you can place your text anywhere on the picture. When setting the text using http remote control the text must be URL encoded. The browser does this for you. If you need to set it with a command line tool, use a browser first and let it make the encoded URL for you. Then you can copy paste it to your script file or cron line or whatever you want to use.

      A major difference from text_left is that if this option is undefined the default is %Y-%m-%d\n%T which displays the date in ISO format YYYY-MM-DD and below the time in 24 hour clock HH:MM:SS.

      This is how the overlaid text is located.

      CHANGES
       
       
       
       

       
       
       
       TEXT_LEFT

       
       TEXT_RIGHT
      YYYY-MM-DD
      HH:MM:SS 

      text_changes

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      Turns the text showing changed pixels on/off. By setting this option to 'on' the number of pixels that changed compared to the reference frame is displayed in the upper right corner of the pictures. This is good for calibration and testing. This is how the overlaid text is located.

      CHANGES
       
       
       
       

       
       
       
       TEXT_LEFT

       
       TEXT_RIGHT
      YYYY-MM-DD
      HH:MM:SS 

      text_scale

      • Type: Integer
      • Range / Valid values: 1 - 10
      • Default: 1

      The scale at which to draw text over the image. The recommended range is 1 - 10. This option makes the text defined by text_left, text_right and text_changes drawn at n-times the normal size. This may be useful when using large picture formats such as 1280 x 720.

      text_event

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: %Y%m%d%H%M%S

      This option is special in that it defines the conversion specifier %C which can be used both for text display and for filenames. This option defines the value of the special event conversion specifier %C. You can use any conversion specifier in this option except %C. Date and time values are from the timestamp of the first image in the current event. The idea is that %C can be used filenames and text_left/right for creating a unique identifier for each event. Option text_event defines the value %C which then can be used in filenames and text_right/text_left. The text_event/%C uses the time stamp for the first image detected in a new event. %C is an empty string when no event is in progress (gap period expired). Pre_captured and minimum_motion_frames images are time stamped before the event happens so %C in text_left/right does not have any effect on those images. You can use Conversion Specifiers to define this field (except for this option itself)

    Motion Detection

      emulate_motion

      • Type: Boolean
      • Range / Valid values: on off
      • Default: off

      Always save images even if there was no motion

      pause

      • Type: Boolean
      • Range / Valid values: on off
      • Default: off

      When Motion is started, pause the motion detection.

      threshold

      • Type: Integer
      • Range / Valid values: 1 - 2147483647
      • Default: 1500

      Threshold for declaring motion. The threshold is the number of changed pixels counted after noise filtering, masking, despeckle, and labelling. The 'threshold' option is the most important detection setting. When motion runs it compares the current image frame with the previous and counts the number of changed pixels after having processed the image with noise filtering, masking, despeckle and labeling. If more pixels than defined by 'threshold' have changed we assume that we have detected motion. Set the threshold as low as possible so that you get the motion you want detected but large enough so that you do not get detections from noise and plants moving. Note that the larger your frames are, the more pixels you have. So for large picture frame sizes you need a higher threshold. Use the -s (setup mode) command line option and/or the text_changes config file option to experiment to find the right threshold value. If you do not get small movements detected (see the mouse on the kitchen floor) lower the value. If motion detects too many birds or moving trees, increase the number. (Unless of course you are one of the many many users who use Motion to bird watch!) Practical values would be from a few hundred to thousands.

      threshold_maximum

      • Type: Integer
      • Range / Valid values: 0, 1 to unlimited
      • Default: 0 (off)

      This parameter specifies the maximum number of pixels that will trigger motion. When the number of changed pixels is above the maximum, it will not trigger an event. The result is that Motion will only trigger events when the number of pixels changes is above the threshold and less than the threshold_maximum. A value of zero disables threshold_maximum.

      threshold_tune

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      Activate the automatic tuning of threshold level. This feature makes Motion continuously adjust the threshold for declaring motion. The threshold setting is ignored when activating this feature. It may give different results depending on your camera, light conditions, indoor/outdoor, the motion to be detected etc. If it does not work well, deactivate the 'threshold_tune' option and use the manual setting of threshold instead.

      noise_level

      • Type: Integer
      • Range / Valid values: 1 - 255
      • Default: 32

      The noise level is used as a threshold for distinguishing between noise and motion. This is different from the threshold parameter. This is changes at pixel level. The purpose is to eliminate the changes generated by electric noise in the camera. Especially in complete darkness you can see the noise as small grey dots that come randomly in the picture. This noise can create false motion detection. What this parameter means is that the intensity of a pixel must change more than +/- the noise threshold parameter to be counted.

      noise_tune

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: on

      Activates the automatic tuning of noise level. This feature makes Motion continuously adjust the noise threshold for distinguishing between noise and motion.

      When activating this feature, the noise_level setting is used as a value added to the dynamic noise level rather than the absolute value.

      despeckle_filter

      • Type: String
      • Range / Valid values: Combinations of E,e,D,d and l
      • Default: Not defined

      Despeckle motion image using combinations of (E/e)rode or (D/d)ilate. And ending with optional (l)abeling. A way of tuning (by removing or enhancing) noise in the motion image. Options for the despeckle feature are any of 'e', 'E', 'd' or 'D'. This can be combined by a trailing 'l' (letter l) which enables the labeling feature.

      Wind blowing grass and trees around or poor light conditions can cause a lot of dots (or noise) to appear in the motion image (See the section on Tuning Motion). This feature removes (or enhances!) this noise and so improves the reliability of motion.

      The 'e' option removes diamonds, 'E' removes squares and alternating eE will remove circles. Each e/E you add will shrink the noise by a pixel all the way around. So 'despeckle Ee' will remove circles of radius 2. However, this will also shrink the detection by 2 and will affect the threshold. So to remove noise and then restore the detected motion to its original size try 'despeckle EedD'. After the despeckle feature is done you can let the labeling feature search for areas of connected pixels and "label" each area. The program will now trigger motion based on the number of changed pixels in the largest area. In other words, the largest labeled area has to be above the threshold to trigger a motion detected. The value EedDl is a good starting point. The possible combinations are endless and it requires many experiments to find the best combination. Just remember that the labeling feature only works as intended if it runs after the despeckle feature. Ie. the letter 'l' must be the last letter and only one 'l'. If you have very few problems with false detections leave this option either blank or at EedD which will remove most of the single pixel noise.

      A very detailed technical explanation of the despeckle part can be found at the webpage of the author of this feature Ian McConnell's Webcam: Motion Web Page

      area_detect

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      Detect motion in predefined areas (1 - 9) and when Motion is detected in the area, execute the script. All of motion detection still continue. This option is only to execute the on_area_detect script.

      Areas are numbered like
      • 1 2 3
      • 4 5 6
      • 7 8 9

      mask_file

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The full path and filename for the masking pgm file. If needed, the mask will be resized to match the width and height of the frames being captured. If you have one or more areas of the camera image in which you do NOT want motion detected (e.g. a tree that moves in the wind or a corner of the picture where you can see cars/pedestrians passing by) you need a mask file. This file is a picture that you create in your favorite photo editing program. The areas that you want detected must be white. The area that you want ignored must be black. The pgm image should be the same size (number of pixels high and wide) as the pictures that are taken by the camera so you can define the correct area to mask. You can adjust sensitivity by using gray tones. If you do not have a mask file disable this option by not having it in the config file or comment it out. If you are using the rotate or flip_axis options, note that the mask is applied after the rotation.

      Detailed Description

      The mask file must be a pgm format image file (portable gray map). Note that you must choose the BINARY 8-bit format.

      To use this feature create an image of exact the same size as the ones you get from your camera. Then make it purely white for the areas you want detected and black for the areas you want ignored. You can also make gray areas where you want to lower the sensitivity to motion. Normally you will stick to pure black and white.

      One method for generating the mask file is as follows.

      Take a motion captured picture, edit it with black and white for the mask and export it as a pgm file. with a program such as gimp. If you cannot save in this format save as a grayscale jpg and then you can convert it to pgm format with

      djpeg -grayscale -pnm [inputfile] > mask.pgm

      (assuming you have djpeg installed - part of the jpeg lib package).

      Note that the mask file option masks off the detection of motion. The entire picture is still shown on the picture. This means that you cannot use the feature to mask off an area that you do not want people to see. Instead use the mask_privacy option.

      Below are an example of a webcam picture and a mask file to prevent the detection cars in the street.

      Normal picture. Notice the street is visible through the hedge.

      normal.jpg

      Mask file (converted to png format so it can be shown by your web browser)

      mask1.png

      mask_privacy

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The full path and filename for the privacy masking pgm file. This file works like the mask_file as described above. The difference with this parameter is that while the mask_file excludes the section from detecting motion, this file excludes the section of the image completely.

      mask_privacy is applied before detection so no motion will ever be detected in the excluded area. This parameter could however still be used with the mask_file. e.g. This file could exclude the neighbors yard and the mask_file would exclude the blowing tree from motion detection. The resulting pictures/movies would show solid black in place of the neighbors yard but the tree would still be in the pictures/movies.

      smart_mask_speed

      • Type: Integer
      • Range / Valid values: 0 - 10
      • Default: 0 (disabled)

      Speed for the smart mask. Default is 0 = DISABLED. 1 is slow, 10 is fast. Smartmask is a dynamic, self-learning mask. Smartmask will disable sensitivity in areas with frequent motion (like trees in the wind). Sensitivity is turned on again after some time of no more motion in this area. The built mask is a bit larger at the borders than the actual motion was. This way smartmask works more reliable when sudden moves occur under windy conditions.

      Fast means here that the mask is built quick, but it is also not staying very long with no more motion. Slow means that it takes a while until the mask is built but it also stays longer. A good start value for smart_mask_speed is 5. This setting is independent from the framerate. The attack and decay time is constant over all available framerates. When smartmask is enabled and motion is also configured to either write motion-images or motion-mpegs, the current smartmask is copied as an overlay into the black/white motion-pictures/mpegs in red colour. Same thing happens to the webcam stream when Motion runs in setup_mode. That way you can easily adjust smart_mask_speed.

      The mask_file option provides a static mask to turn off sensitivity in certain areas. This is very useful to mask a street with cars passing by all day long etc...

      But imagine a scenario with large bushes and big trees where all the leaves are moving in the wind also triggering motion from time to time even with despeckle turned on. Of course you can also define a static mask here, but what if the bushes are growing during spring and summer? Well, you have to adapt the mask from time to time. What if the camera position moves slightly? What if someone grows new plants in your garden? You always have to setup a new static mask.

      The answer to this problem is the smart mask feature A dynamic, self-learing mask.

      Smart mask will disable sensitivity in areas with frequent motion (like trees in the wind). Sensitivity is turned on again after some time of no more motion in this area. The built mask is a bit larger at the borders than the actual motion. This way smartmask works more reliably when sudden moves occur under windy conditions.

      lightswitch_percent

      • Type: Integer
      • Range / Valid values: 0 - 100
      • Default: 0 (disabled)

      Ignore sudden massive light intensity changes when the percentage of the picture area that changed intensity is greater than this value. The value defines the picture area in percent above which the lightswitch condition will trigger. When lightswitch is detected motion detection is disabled for a configured number of frames. This is to avoid false detection when light conditions change and when a camera changes sensitivity at low light.

      lightswitch_frames

      • Type: Integer
      • Range / Valid values: 1 - 1000
      • Default: 5

      The number of frames to ignore when the lightswitch condition is triggered (see above).

      minimum_motion_frames

      • Type: Integer
      • Range / Valid values: 1 - 1000s
      • Default: 1

      Picture frames must contain motion at least the specified number of frames in a row before they are detected as true motion. At the default of 1, all motion is detected. Valid range is 1 to thousands, but it is recommended to keep it within 1-5. Note that the picture frames are buffered by Motion and once motion is detected also the first frames containing motion are saved so you will not miss anything. The feature is used when you get many false detections when the camera changes light sensitivity or light changes. Even though Motion accepts large values you should set this to a relatively low number (below 10). For each step larger than 1 Motion reserves space in RAM for the picture frame buffer. If you have a large value Motion will miss many frames from the camera while it is processing the all the pictures in the buffer.

      event_gap

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 60

      The number of seconds of no motion detected that triggers the end of an event. An event is defined as a series of motion images taken within a short timeframe. An event ends right after no more motion is detected and post_capture is over.

      The value -1 is allowed and disables events causing all Motion to be written to one single movie file and no pre_capture. If set to 0, motion is running in gapless mode. Disabling events has bad side effects on noise_tune and smartmask. Both features can only work properly outside an event. When event_gap is set to -1, both features don't work properly anymore.

      For example, a person walking through a room starts an event. During the event many single images will be detected as movement. Once the movement has stopped being detected, the post_capture starts. Then once that is finished, the timer starts as specified in event_gap.

      If any motion is detected before the timer finishes, the existing event continues and the timer is reset. If no motion is detected during the time, the event ends.

      The event_gap value impacts many functions in Motion.
      • When the timer runs out the event number is increased by one next time motion is detected. When you use the %v conversion specifier in filenames or text features this means that the number in filename or text increased by one.
      • The pre_capture feature only works at the beginning of an event. So if you have a very large 'event_gap' value pre_capture is not working very often.
      • When you make movies a new file is started at the beginning of an event when the first motion is detected. When 'event_gap' seconds has passed without motion (and post_captured frames saved) the movie files are completed and closed.
      • Do not use large event_gap values to generate one large movie file. If Motion stops working this movie file never gets properly completed and closed you will not be able to view it.
      • Some of the tracking features sets the camera back to the center position when an event is over.

      pre_capture

      • Type: Integer
      • Range / Valid values: 0 - 100s
      • Default: 0 (disabled)

      Specifies the number of pre-captured (buffered) pictures from before motion was detected that will be output at motion detection. The recommended range is 0 to 5. It is not recommended to use large values. Large values will cause Motion to skip video frames and cause unsmooth movies.

      This is because Motion is processing all the buffered images including saving jpegs, encoding the movie, writing to databases and executing external programs immediately after the first image is detected as Motion.

      Motion will not grab another image until this is done. This means that even moderate values for pre_capture combined with high framerates will mean that you will probably miss many frames of Motion.

      To create smooth movies use larger values of post_capture instead.

      Motion buffers the number of picture frames defined by 'pre_capture'. When motion is detected the pictures in the buffer are included in the movie. The effect is that it seems the program knew in advance that the event was going to take place and started the recording before it actually happened. This is a nice feature that give more complete video clips of an event.

      If pre_capture is set to 0 the feature is disabled. The recommended value would be approx 0.5 second of video so the value should be defined so it fits the framerate and the desired pre-capture time. You can in theory have up to 100s of pre-captured frames but naturally this makes motion leave a larger footprint in the memory of the computer.

      It is therefore recommended to use relatively small values for pre_capture. Depending on your chosen framerate and depending on the features enabled values from 1-5 are sensible.

      To get a smooth movie use a large value for post_capture which does not cost any performance hit or RAM space.

      post_capture

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0 (disabled)

      Specifies the number of frames to be captured after motion has been detected. The purpose of this is mainly to create smooth video clips each time motion is detected. Use it to you personal taste (and disk space).. This option is the preferred way to create continuous movies. Post_capture does not consume extra RAM and it does not create pauses in the movie even with large values. If you only store movies and do not have output_normal on, then the recommended post_capture value is what is equivalent to 1-5 seconds (Don't forget to multiply the seconds desired by the framerate for this parameter)

    Script Execution

      Motion can execute external commands based on the motion detection and related events. They are described in the sections below.

      Security Warning!

      These features mean you have to pay attention to the following.
      • Anyone with access to the remote control port (http) can execute any command on your computer with the same privileges as the user running Motion. Anyone can access your control port if you have not either limited access to localhost or limited access using firewalls in the server. You should always have a router between a machine running Motion with remote control enabled and the Internet and make sure the Motion control port is not accessible from the outside.
      • If you limit control port to localhost you still need to take care of any user logging into the server with any kind of GUI or terminal session. All it takes is a browser or single command line execution to change settings in Motion.
      • It is a good idea to run Motion as a harmless user. Not as root!!

      on_event_start

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The full path and file name of the program/script to be executed at the start of an event. An event starts at first motion detected after a period of no motion defined by gap.

      You can use Conversion Specifiers and spaces as part of the command. This can be any type of program or script. Remember to set the execution bit in the ACL and if it is a script type program such as perl or bash also remember the shebang line (e.g. #!/user/bin/perl) as the first line of the script.

      on_event_end

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The full path and file name of the program/script to be executed when a event ends. An event ends after the event_gap has expired.

      You can use Conversion Specifiers and spaces as part of the command. This can be any type of program or script. Remember to set the execution bit in the ACL and if it is a script type program such as perl or bash also remember the shebang line (e.g. #!/user/bin/perl) as the first line of the script.

      on_picture_save

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The full path and file name of the program/script to be executed when a picture is saved.

      You can use Conversion Specifiers and spaces as part of the command. This can be any type of program or script. Remember to set the execution bit in the ACL and if it is a script type program such as perl or bash also remember the shebang line (e.g. #!/user/bin/perl) as the first line of the script.

      Use %f for passing filename (with full path) to the command.

      on_motion_detected

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The full path and file name of the program/script to be executed when motion is detected.

      You can use Conversion Specifiers and spaces as part of the command. This can be any type of program or script. Remember to set the execution bit in the ACL and if it is a script type program such as perl or bash also remember the shebang line (e.g. #!/user/bin/perl) as the first line of the script.

      on_area_detected

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The full path and file name of the program/script to be executed when motion is detected in the predefined area indicated in the area_detect option.

      You can use Conversion Specifiers and spaces as part of the command. This can be any type of program or script. Remember to set the execution bit in the ACL and if it is a script type program such as perl or bash also remember the shebang line (e.g. #!/user/bin/perl) as the first line of the script.

      on_movie_start

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The full path and file name of the program/script to be executed when a new movie is being created.

      You can use Conversion Specifiers and spaces as part of the command. This can be any type of program or script. Remember to set the execution bit in the ACL and if it is a script type program such as perl or bash also remember the shebang line (e.g. #!/user/bin/perl) as the first line of the script.

      Use %f for passing filename (with full path) to the command.

      on_movie_end

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The full path and file name of the program/script to be executed after a new movie was created.

      You can use Conversion Specifiers and spaces as part of the command. This can be any type of program or script. Remember to set the execution bit in the ACL and if it is a script type program such as perl or bash also remember the shebang line (e.g. #!/user/bin/perl) as the first line of the script.

      Use %f for passing filename (with full path) to the command.

      on_camera_lost

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The full path and file name of the command to be executed when a camera can't be opened or if it is lost.
      Note that there are situations when motion doesn't detect a lost camera. It is dependent upon the camera and driver and it is advised that this option be tested for each configuration. It has also been observed that there are also situations in which the disconnection of the camera even hangs the PC in which case this script will not be executed.

      You can use Conversion Specifiers and spaces as part of the command. This can be any type of program or script. Remember to set the execution bit in the ACL and if it is a script type program such as perl or bash also remember the shebang line (e.g. #!/user/bin/perl) as the first line of the script.

      on_camera_found

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The full path and file name of the command to be executed when a lost camera is found
      If motion fails to detect a lost camera, it will also fail to know it found one.

      You can use Conversion Specifiers and spaces as part of the command. This can be any type of program or script. Remember to set the execution bit in the ACL and if it is a script type program such as perl or bash also remember the shebang line (e.g. #!/user/bin/perl) as the first line of the script.

    Output - Picture Options

      Motion can output different types of pictures. The normal picture is indicated below.

      outputnormal1.jpg

      The motion type picture or also referred to as a debug picture is shown below. Note that the largest area is blue and only this is counted as Motion.

      The Motion image shows how Motion maintains a "reference frame" which is not just the last picture frame but a mathematical calculation of the past images. This enlarges real Motion and ensures that it is not easy to sneak in slowly.

      outputmotion1.jpg

      picture_output

      • Type: Discrete Strings
      • Range / Valid values: on, off, first, best
      • Default: off

      This option controls the output of the normal image.

      'on' is the usual selection.

      'first' is Motion saves only the first motion detected picture per event.

      "best" requires a little more CPU power and resources compared to "first". If you set it to "best" Motion saves the picture with most changed pixels during the event. This may be useful if you store movies on a server and want to present a jpeg to show the content of the movie on a webpage.

      'off' to don't write pictures

      When the netcam_highres option is selected along with the movie_passthrough the output pictures will be provided in normal resolution not high resolution.

      picture_output_motion

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      Output pictures with only the moving object. This feature generates the special motion type movies where you only see the pixels that changes as a graytone image. If labelling is enabled you see the largest area in blue.

      If a Smartmask is specified, it is shown in red.

      This option is good for tuning and testing but probably not very interesting for the general public.

      Default is not to store these motion images. Motion pictures are stored the same place and with the same filename as normal motion triggered pictures except they have an "m" appended at the end of the filename before the .jpg or .ppm. E.g. the name can be 01-20020424232936-00m.jpg.

      picture_type

      • Type: Discrete Strings
      • Range / Valid values: jpeg, webp, ppm, grey
      • Default: jpeg

      This option specifies the type of picture file to output. The recommendation is to always use jpeg except if you have a specific need to store high quality pictures without any quality loss.

      picture_quality

      • Type: Integer
      • Range / Valid values: 1 - 100
      • Default: 75

      The quality for the jpeg or webp images in percent. 100 means hardly compressed. A small number means a much smaller file size but also a poorer quality image to look at.

      picture_exif

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      Use this option to specify the text to include in a JPEG EXIF comment The EXIF timestamp is included independent of this text.

      You can use Conversion Specifiers in this option.

      picture_filename

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: %v-%Y%m%d%H%M%S-%q

      This option indicates the file name and optionally the path for the pictures relative to target_dir.

      The file extension .jpg, webp or .ppm is automatically added.

      You can use Conversion Specifiers in this option.

      snapshot_interval

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0 (disabled)

      This parameter specifies the number of seconds between each snapshot

      snapshot_filename

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: %v-%Y%m%d%H%M%S-snapshot

      This option indicates the file name and optionally the path for the snapshots relative to target_dir.

      The file extension .jpg, webp or .ppm is automatically added.

      A symbolic link called lastsnap.jpg is created in the target_dir and will always point to the latest snapshot, unless snapshot_filename is exactly 'lastsnap'

      You can use Conversion Specifiers in this option.

    Output - Movie Options

      movie_output

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: on

      Use ffmpeg libraries to encode movies of the motion. This option generates a new movie at the beginning of each new event and appends to the movie for each motion detected within the same event. The current event ends when the time defined by the 'event_gap' option has passed with no motion detected. At the next detection of motion a new movie is started.

      movie_output_motion

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      Use ffmpeg libraries to encode motion type movies where you only see the pixels that changes. Works like movie_output but outputs motion pixel type pictures instead. This feature generates the special motion type movie where you only see the pixels that changes as a graytone image. If labeling is enabled you see the largest area in blue. Smartmask is shown in red. The filename given is the same as the normal movies except they have an 'm' appended after the filename.

      movie_max_time

      • Type: Integer
      • Range / Valid values: 0 (infinite) - 2147483647
      • Default: 120

      The maximum length of a movie in seconds. Set this to zero for unlimited length.

      movie_bps

      • Type: Integer
      • Range / Valid values: 0 - 9999999
      • Default: 400000

      Bitrate of movies produced by ffmpeg. Bitrate is bits per second. A higher value means better quality and larger files if the camera is on a fixed bitrate setting. Experiment to get the desired quality. The better quality the bigger files. This option is ignored if movie_quality is not 0 (disabled).

      movie_quality

      • Type: Integer
      • Range / Valid values: 0 - 100
      • Default: 60

      Enables and defines a variable bitrate for the ffmpeg encoder. The option of movie_bps is ignored if variable bitrate is enabled. A value of 0 disables this option while values 1 - 100 varies the quality of the movie. The value of 1 means worst quality and 100 is the best quality.

      Experiment for the value that gives you the desired compromise between size and quality.

      movie_codec

      • Type: Discrete Strings
      • Range / Valid values: mpeg4, msmpeg4, swf, flv, ffv1, mov, mp4, mkv, hevc
      • Default: mkv

      Container/Codec to be used for the video.

      • mpeg4 or msmpeg4 - gives you files with extension .avi
      • swf - gives you a flash film with extension .swf
      • flv - gives you a flash video with extension .flv
      • ffv1 - FF video codec 1 for Lossless Encoding
      • mov - QuickTime
      • mp4 - MPEG-4 Part 14 H264 encoding
      • mkv - Matroska container with H264 encoding
      • hevc -MP4 container with H.265 / HEVC (High Efficiency Video Coding)

      Note that certain containers can handle different codecs than the defaults indicated above. For example, the mkv container can handle virtually any codec. Motion can optionally take an additional specification with this parameter. By specifying the container (mkv) and then appending a colon and the ffmpeg codec name Motion will attempt to use the specified codec for the container. This permits options such as encoding the h265 codec into a mkv container instead of mp4 by specifying the option as mkv:libx265

      movie_duplicate_frames

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      When specified, if the CPU can not keep up with the requested frame rate for the movies, frames will be duplicated in order to keep up with the frame rate.

      Users should never use this option since the resulting movies will have the same frame sent multiple times and therefore the movie will appear to "stall" and look terrible.

      movie_passthrough

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      When using a RTSP, RTMP, HTTP and some V4l2 cameras, create movie files of the motion with the packets obtained directly from the camera.

      For v4l2 cameras to use the movie_passthrough, they must be specified using the netcam_url parameter and the v4l2 prefix. Only webcams that provide mjpeg or H264 will work with the movie_passthrough.

      When using only the single netcam_url this option will reduce the processing required when encoding the images to the resulting movie file. Decoding of the image will still occur on the image in order to process the motion detection.

      When using both the netcam_url and the netcam_highres what will occur is that normal resolution stream will be captured and decoded, when motion is detected, the high resolution images will be captured and processed into the movie file without going through the decode/encode processing.

      This option should reduce CPU usage but does increase memory requirements.

      No image processing is performed so text overlays, privacy masks etc will not be on the resulting video. The resulting movie may also include a few extra frames at the start that would not exist if the movie was created without the passthrough option.

      Since this option bypasses the decoding of the high resolution images to reduce CPU, when images are saved via the picture_output option, the pictures provided will be from the normal resolution stream.

      movie_filename

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: %v-%Y%m%d%H%M%S

      File path for motion triggered movies relative to target_dir. Note that the file extension is automatically added to the name based upon the codec selected.

      You can use Conversion Specifiers in this option.

      movie_extpipe_use

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      This option specifies whether to send the output to a pipe for external encoding into a movie.

      Piping raw video to stdout has some advantages comparing to using built-in ffmpeg encoder.
      First, you can use any encoder that supports RAW frames from stdin so you are not limited to the formats that are currently implemented in motion. See examples in movie_extpipe
      Second, external encoders utilize separate cpu core(s) on multi-core systems so movie encoding is offloaded from main motion thread to separate core(s) giving noticeable performance boost

      Note that this option does not require the install or configure of the videoloopback software.

      movie_extpipe

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      This option specifies the program name and options for the program that will receive and process the images during a movie event.

      Note that this option does not require the install or configure of the videoloopback software.

      Sample:

      movie_extpipe mencoder -demuxer rawvideo -rawvideo w=%w:h=%h:i420 -ovc x264 -x264encopts bframes=4:frameref=1:subq=1:scenecut=-1:nob_adapt:threads=1:keyint=1000:8x8dct:vbv_bufsize=4000:crf=24:partitions=i8x8,i4x4:vbv_maxrate=800:no-chroma-me -vf denoise3d=16:12:48:4,pp=lb -of avi -o %f.avi - -fps %fps

      movie_extpipe x264 - --input-res %wx%h --fps %fps --bitrate 2000 --preset ultrafast --quiet -o %f.mp4

      movie_extpipe mencoder -demuxer rawvideo -rawvideo w=%w:h=%h:fps=%fps -ovc x264 -x264encopts preset=ultrafast -of lavf -o %f.mp4 - -fps %fps

      movie_extpipe ffmpeg -y -f rawvideo -pix_fmt yuv420p -video_size %wx%h -framerate %fps -i pipe:0 -vcodec libx264 -preset ultrafast -f mp4 %f.mp4

      timelapse_interval

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0 (disabled)

      Create a timelapse video saving a picture frame at the interval in seconds set by this parameter.

      timelapse_mode

      • Type: Discrete Strings
      • Range / Valid values: hourly, daily, weekly-sunday, weekly-monday, monthly, manual
      • Default: daily

      The file rollover mode of the timelapse video. Note that it is important that you use the Conversion Specifiers in timelapse_filename that ensure that the new timelapse file indeed is a new file. If the filename does not change Motion will simply append the timelapse pictures to the existing file.
      The value 'Manual' means that Motion does not automatically rollover to a new filename. You can do it manually using the http control interface by setting the option timelapse_interval to 0 and then back to your chosen value.

      The value 'hourly' rolls over on the full hour. Value 'daily' which is the default rolls over at midnight. There are two weekly options because depending on where you come from a week may either start on Sunday or Monday. And 'monthly' naturally rolls over on the 1st of the month.

      timelapse_fps

      • Type: Integer
      • Range / Valid values: 0 - 100's
      • Default: 30

      The frame per second rate to use in the playback of the timelapse video.

      timelapse_codec

      • Type: Discrete Strings
      • Range / Valid values: mpg, mpeg4
      • Default: mpg

      Container/Codec to be used by timelapse video.

      • mpg - Creates mpg file with mpeg-2 encoding. If Motion is shutdown and restarted, new pics will be appended to any previously created file with name indicated for timelapse.
      • mpeg4 - Creates avi file with the default encoding. If Motion is shutdown and restarted, new pics will create a new file with the name indicated for timelapse.

      Note that different containers are NOT planned for this option since the nature of recording a timelapse is not what typical movies containers and codecs are designed to do. Users desiring a different container/codec can use ffmpeg directly to either re-encode a finished timelapse video or output the timelapse as jpg picture files and use ffmpeg to encode those jpgs into a movie.

      timelapse_filename

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: %Y%m%d-timelapse

      File path for the timelapse videos relative to target_dir. Note that the file extension is automatically added to the name based upon the codec selected.

      You can use Conversion Specifiers in this option.

    Output - Pipe Options

      Motion provides two pipe variations. The first option is a v4l2loopback device with normal images. Using this pipe option, the video that is captured from the v4l2 device is piped into a new v4l2 device using the v4l2loopback software. This piping is desired when the user wishes to use the video device at the same time as Motion is using the same device. By default, only one application can have a device open at one time. Unlike a physical device, the videoloopback devices take both input and output. The module simply takes anything that comes on its input and send it out at the output.

      When you install the video loopback device it will create a new device for example /dev/video1 while the actual webcam device would be /dev/video0. You can then tell motion to open the physical device (/dev/video0) and "pipe" the video signal to the /dev/video1. You will then be able to open the /dev/video1 device with external videoplayers such as VLC and and look at the pictures live. VLC is "fooled" to think it is looking at a real camera.

      Installing

      The video loopback device can be added installed via apt in many distributions. The package tested with Motion is v4l2loopback-dkms. Once the package is installed, you just need to run sudo modprobe v4l2loopback. This will add a new video device that you can use for the loopback. It is believed that there are additional options associated with the v4l2loopback that allows for adding more than one device. See the documentation of the v4l2loopback project for additional details.

      To activate the vloopback device in Motion set the 'video_pipe' option in the motion.conf file to the device name associated with the one created by v4l2loopback.
      You can also view the special motion pictures where you see the changed pixels by setting the option 'video_pipe_motion' in motion.conf. When setting the video_pipe and/or video_pipe_motion options specify the input device as e.g. /dev/video1.

      De-activating should be done with this command

      sudo modprobe -r v4l2loopback

      The second option for pipe is the same as the above except motion images are sent to the loopback device.

      video_pipe

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The video4linux video loopback device for normal images. The device would be specified in the format like /dev/video1

      video_pipe_motion

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The video4linux video loopback device for motion images. The device would be specified in the format like /dev/video1

    Web Control

      Motion has a limited web interface to control some parameters while running. By default, the changing of any parameters via the web interface is disabled via the webcontrol_parms configuration option. This is for security purposes. If the webcontrol_parms is enabled, some Motion configuration options can be changed while Motion is running. Other configuration options must be saved and Motion restarted to become effective.

      If your webcontrol_port is 8080, then open the following from the same machine on which Motion is running http://localhost:8080/

      To access the web control from remote machine, first set the webcontrol_localhost to off then connect using the IP of the remote machine instead of localhost (example http://192.168.1.4:8080/).

      If you want to use a script or cron to automatically change Motion settings while Motion runs, use a program that can fetch or send a webpage. Common programs are wget , lwp-request and curl.

      Example to pause motion detection

      lwp-request http://localhost:8080/0/detection/pause

      Example to start motion detection

      lwp-request http://localhost:8080/0/detection/start

      Example script to update the text_left with cpu load (verbose for clarity)

      #!/bin/bash

      LOAD=`top -b -n2 | grep "Cpu(s)" | awk '{print $2+$4}' | tail -n1`

      TEXTLEFT=""
      TEXTLEFT=$TEXTLEFT"System at %{host}"
      TEXTLEFT=$TEXTLEFT"\nCPU $LOAD "
      TEXTLEFT=$TEXTLEFT"\nfps: %{fps}"
      TEXTLEFT=$TEXTLEFT"\nDate: %Y-%m-%d"
      TEXTLEFT=$TEXTLEFT"\n%T-%q"

      # Replace special chars with needed urlcodes
      TEXTLEFT="${TEXTLEFT//%/%25}" #Replace % with %25
      TEXTLEFT="${TEXTLEFT// /%20}" #Replace spaces with %20
      TEXTLEFT="${TEXTLEFT//\{/%7B}" #Replace { with %7B
      TEXTLEFT="${TEXTLEFT//\}/%7D}" #Replace } with %7D

      curl http://localhost:8080/1/config/set?text_left=$TEXTLEFT

      return 0
      Note that the replacement of characters with the urlcode values is required whenever updating via a script or outside the html/css webcontrol_interface

      To control from your own software (for example your own PHP front end) the motion.conf option webcontrol_interface can be set to 1(text) which will cause Motion to remove the html tags in the responses and there is no navigation of any pages via a web browser.

      The following definitions will be used when summarizing the commands that are available for control of Motion.
      • {IP} The IP address of the computer running Motion
      • {port} The port specified for the webcontrol
      • {camid} The camera_id of the camera.
      • {parm} The Motion configuration parameter requested.
      • {value1} The first value of the Motion configuration parameter requested.
      • {value2} The second value of the Motion configuration parameter requested.

      The following are the commands available.

      • {IP}:{port}/{camid}/config/list Lists all the configuration values for the camera.
      • {IP}:{port}/{camid}/config/set?{parm}={value1}Set the value for the requested parameter
      • {IP}:{port}/{camid}/config/get?query={parm} Return the value currently set for the parameter.
      • {IP}:{port}/{camid}/config/write Write the current parameters to the file.
      • {IP}:{port}/{camid}/detection/status Return the current status of the camera.
      • {IP}:{port}/{camid}/detection/connection Return the connection status of the camera.
      • {IP}:{port}/{camid}/detection/start Start or resume motion detection.
      • {IP}:{port}/{camid}/detection/pause Pause the motion detection.
      • {IP}:{port}/{camid}/action/eventstart Trigger a new event.
      • {IP}:{port}/{camid}/action/eventend Trigger the end of a event.
      • {IP}:{port}/{camid}/action/snapshot Create a snapshot
      • {IP}:{port}/{camid}/action/restart Shutdown and restart Motion
      • {IP}:{port}/{camid}/action/quit Close all connections to the camera
      • {IP}:{port}/{camid}/action/end Entirely shutdown the Motion application
      • {IP}:{port}/{camid}/track/center Send command to center PTZ camera
      • {IP}:{port}/{camid}/track/set?x={value1}&y={value2} Send command to PTZ camera to move to location specified by x and y
      • {IP}:{port}/{camid}/track/set?pan={value1}&tilt={value2} Send command to PTZ camera to pan to value1 and tilt to value2

      As a general rule, when the {camid} references the camera_id in the main motion.conf file, the webcontrol actions referenced above are going to be applied to every camera that is connected to Motion. This camera_id is usually specified as 0 (zero). So issuing a command of {IP}:{port}/0/detection/pause is going to pause all the cameras.

      A point of clarification with respect to the differences between pause, quit, and end. When the action of pause is executed, Motion will stop the motion detection processing and of course all events but will continue to process and decode images from the camera. This allows for a faster transition when the user executes a start The quit action conversely not only stops the motion detection but also disconnects from the camera and decoding of images. To start motion detection after a quit, the user must execute a restart which will reinitialize the connection to the camera. And since the camera was completely disconnect, it can take more than a few seconds for Motion to fully start and have the camera available for processing or viewing. Finally, there is an option for end. This option completely terminates the Motion application. It closes all connections to all the cameras and terminates the application. This may be required when running Motion in daemon mode. Note that there is no way to restart the Motion application from the webcontrol interface after processing a end request.

      If the item above is available via the HTML/CSS interface, it is also possible to see the exact URL sent to Motion in the log. Change the log level to 8 (debug), then open up the Motion webcontrol interface and perform the action in question. In the log Motion will report the exact URL sent to Motion that performed the action.

      ALERT! Security Warning! This feature also means you have to pay attention to the following.
      • Anyone with access to the remote control port (http) can alter the values of options and save files anywhere on your server with the same privileges as the user running Motion. They can execute any command on your computer with the same privileges as the user running Motion. Anyone can access your control port if you have not either limited access to localhost or limited access using firewalls in the server. You should always have a router between a machine running Motion with remote control enabled and the Internet and make sure the Motion control port is not accessible from the outside. Also make sure to adjust the webcontrol_parms to the lowest level possible.
      • If you limit control port to localhost you still need to take care of any user logging into the server with any kind of terminal session.
      • Run Motion as a harmless user. DO NOT RUN AS ROOT!!

      webcontrol_port

      • Type: Integer
      • Range / Valid values: 0 - 65535
      • Default: 0 (disabled)

      Sets the port number for the http based control of the Motion parameters. This option must be placed in the motion.conf file and not in a camera config file. Port numbers below 1024 normally require that you have root privileges. The port 8080 is the typical selection of the port for this purpose.

      webcontrol_ipv6

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      Listen for connections from IPv6 and IPV4.

      webcontrol_localhost

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: on

      This option restricts the control of the Motion parameters to the localhost. This option must be placed in motion.conf and not in a camera config file. By setting this to on, the control using http (browser) can only be accessed on the same machine on which Motion is running.

      webcontrol_parms

      • Type: Integer
      • Range / Valid values: 0 - 3
      • Default: 0

      Sets the type of parameters that will be listed on the webcontrol page and available for modification.
      • 0: None - No configuration parameters will be available.
      • 1: Limited- A limited list of parameters will be available.
      • 2: Advanced - The advanced list of parameters will be available. These typically require Motion to be restarted to become effective.
      • 3: Restricted - User IDs, passwords and "on_" commands.
      The default for this parameter is 0 (none) to enhance the security of the web interface. The setting of the webcontrol_parms is NEVER included on the web interface and this parameter must be specified via the configuration file. EXTREME Care should be exercised when using level restricted level because if the webcontrol is compromised, it may compromise the computer.

      Users are strongly advised to only set this option to something other than zero when initially setting up the cameras. Once Motion has been configured, it is advised to complete the set up by setting this value back to zero!

      webcontrol_interface

      • Type: Integer
      • Range / Valid values: 0 - 2
      • Default: 0

      The type of webcontrol interface to provide.
      • The value of 0 provides a traditional web page interface using html/css.
      • The value of 1 provides a text only interface suitable for programmatic access.
      • The value of 2 provides the legacy web control interface

      This option must be placed in motion.conf and not in a camera config file. The recommended value for most is "0" which provides a page you can navigate and control Motion with a normal browser.

      webcontrol_auth_method

      • Type: Integer
      • Range / Valid values:0, 1, 2
      • Default: 0

      Authentication method to use for the webcontrol port
      • 0 = disabled
      • 1 = Basic authentication
      • 2 = Digest authentication

      webcontrol_authentication

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      This parameter establishes the username and password to use for the stream. The syntax is username:password

      webcontrol_tls

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      This option specifies whether to enable SSL/TLS for the webcontrol port. For some distributions the library that Motion uses may not have been compiled with SSL/TLS support. In this situation Motion can not support SSL/TLS connections. Whether SSL/TLS can be supported will be reported in the log. In addition to selecting this option, a webcontrol_cert and webcontrol_key file must also be specified.

      webcontrol_cert

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      Full path to the certification file for SSL/TLS support. Only used when webcontrol_tls is enabled.

      webcontrol_key

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      Full path to the key file for SSL/TLS support. Only used when webcontrol_tls is enabled.

      webcontrol_header_params

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      User specified header(s) for the webcontrol. The header/value pair is separated by an equal sign and multiple header/value pairs are separated by commas. If the header or value includes an equal sign or comma, then the header or value must be enclosed in double quotes. e.g.

      webcontrol_header_params Access-Control-Allow-Origin=*, Cache-Control="no-cache"

      When Motion parses this parameter, it only shows the values in the Motion log when webcontrol_localhost is set to on. When the webcontrol_localhost is set to off, Motion will redact the values in the log.

      webcontrol_lock_attempts

      • Type: String
      • Range / Valid values: Integers
      • Default: 5

      This parameter applies to the webcontrol port and all stream ports.

      The maximum number of failed authentication attempts to the web control or streams before the client IP is locked out for the duration specified by webcontrol_lock_minutes.

      webcontrol_lock_minutes

      • Type: String
      • Range / Valid values: Integers
      • Default: 5

      This parameter applies to the webcontrol port and all stream ports.

      The number of minutes that a IP is locked out when the number of failed authentication attempts has been reached. Note that when the user attempts to connect the during the lock out period, the timer is reset to zero. So if the user set the time at 5 minutes and attempted to log in after 4 minutes, they would have to wait a total of 9 minutes before Motion would start to prompt for a password again. The attempt to open the web site at minute 4 resets the clock even though Motion does not even respond with a prompt.

      webcontrol_lock_max_ips

      • Type: String
      • Range / Valid values: Integers
      • Default: 25

      This parameter applies to the webcontrol port and all stream ports.

      Motion can only keep track of a limited amount of IPs that are attempting to log in but failing. This parameter specifies the maximum number of IPs that can be blocked at the same time. Motion will clear the log of IPs that have been locked out but the webcontrol_lock_minutes has expired so this parameter represents the maximum concurrent IPs locked out. Note that when this maximum is reached, Motion will deny all connections until one of the time of one of the lockouts expires.

      While it is permitted to have a high value for this, it should be noted that it could impact the loading time for the webcontrol and streams. Motion loops through the entire array looking for the connecting IP to determine whether to block it on each and every connection.

    Live Stream

      Motion has simple webcam server built in which allows for streaming the images from the camera(s).

      The streams are generated in "multipart jpeg" format (mjpeg) which most browsers can display. If the browser does not directly open the stream, it may be possible to manually create a simple HTML page that references the stream.

      By default many browsers limit the number of simultaneous connections (usually to something like 5). Since Motion uses connections for each camera, it is possible that only the first 5 cameras are displayed on the all cameras home page. To get around this, some browsers allow the user to specify a different(higher) number of simultaneous streams. For some browsers, this is specified via the network.http.max-persistent-connections-per-server option. For other browsers, users are not permitted to customize the settings. For these browswers, users will need to specify a different port for each camera stream. The connection limit is based upon the server:port combination therefore specifying a different port for each camera avoids the limitation.

      Some regular stream players such as mplayer, ffplay and avplay may open the streams as well by specifying the network stream as http://localhost:mystreamportnumber/

      While normally the stream players will open after a bit, it may be useful to also provide the format such as ffplay -f mjpeg http://localhost:mystreamportnumber/

      It has been observed by the author that VLC will not open the stream. This is not a Motion limitation but instead is related to the general VLC support for MJPG http streams.

      While the above examples indicate the Motion streams can be accessed as http://localhost:mystreamportnumber/ Motion does provide other options for accessing the streams and images. In addition to sub-streams, motion image streams and static images, Motion can also be configured to use just a single port for accessing streams to all cameras. This is accomplished by specifying a stream port within the motion.conf file and also using separate camera files. The following examples should clarify the methods by which streams can be accessed:
      • {IP} The IP address of the computer running Motion
      • {port0} The port specified for the stream within the motion.conf file.
      • {portX} The port specified for the stream within a camera.conf file.
      • {camid} The camera_id of the camera.

      • {IP}:{port0}/cameras.json JSON object with IDs and names of all cameras
      • {IP}:{port0}/status.json JSON object with information about all cameras
      • {IP}:{port0}/{camid}/ Primary stream for the camera
      • {IP}:{port0}/{camid}/stream Primary stream for the camera
      • {IP}:{port0}/{camid}/substream Sub-stream for the camera
      • {IP}:{port0}/{camid}/motion Motion image stream for the camera
      • {IP}:{port0}/{camid}/source Source image from the camera
      • {IP}:{port0}/{camid}/current Static JPG for the camera
      • {IP}:{port0}/{camid}/status.json JSON object with information about the camera
      • {IP}:{portX}/ Primary stream for the camera running on port {portX}
      • {IP}:{portX}/stream Primary stream for the camera running on port {portX}
      • {IP}:{portX}/substream Sub-stream for the camera running on port {portX}
      • {IP}:{portX}/motion Motion image stream for the camera running on port {portX}
      • {IP}:{portX}/source Source image from the camera running on port {portX}
      • {IP}:{portX}/current Static JPG for the camera running on port {portX}
      • {IP}:{portX}/status.json JSON object with information about the camera running on port {portX}

      stream_port

      • Type: Integer
      • Range / Valid values: 0 - 65535
      • Default: 0 (disabled)

      The TCP port that Motion will send the main stream. The stream port must be different than the webcontrol_port. If the port is specified within the motion.conf file (as opposed to being specified in the camerax.conf files), then Motion will provide all streams on that single port by specifying a different url. See the stream section above for further details and examples of how ports can be specified. If setting a unique port for each camera good value may be to select is 8081 for camera 1, 8082 for camera 2, 8083 for camera 3 etc.

      stream_localhost

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: on

      Limits the access to the stream to the localhost. By setting this to on, the stream can only be accessed on the same machine on which Motion is running.

      stream_auth_method

      • Type: Integer
      • Range / Valid values: 0, 1, 2
      • Default: 0

      This parameter establishes desired authentication method for the stream port. The parameters have the following meaning.
      • 0 = disabled
      • 1 = Basic authentication
      • 2 = MD5 digest (the safer authentication)

      Note that if you are enabling the webcontrol feature of Motion, you really really really ... should enable security authentications. No. Seriously. You really should. See the security warnings in this document regarding how it completely opens up your system.

      stream_authentication

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      This parameter establishes the username and password to use for the stream. The syntax is username:password

      stream_tls

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      This option specifies whether to enable SSL/TLS for the stream port. For some distributions the library that Motion uses may not have been compiled with SSL/TLS support. In this situation Motion can not support SSL/TLS connections. Whether SSL/TLS can be supported will be reported in the log. In addition to selecting this option, a webcontrol_cert and webcontrol_key file must also be specified.

      stream_header_params

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      User specified header(s) for the stream. The header/value pair is separated by an equal sign and multiple header/value pairs are separated by commas. If the header or value includes an equal sign or comma, then the header or value must be enclosed in double quotes. e.g.

      stream_header_params Access-Control-Allow-Origin=*, Cache-Control="no-cache"

      When Motion parses this parameter, it only shows the values in the Motion log when stream_localhost is set to on. When the stream_localhost is set to off, Motion will redact the values in the log.

      stream_preview_scale

      • Type: Integer
      • Range / Valid values: 1 to 100s
      • Default: 25

      If the webcontrol page has HTML enabled, Motion displays all of the streams on the home webcontrol page in HTML format so that all the images can be viewed by standard browsers.

      This parameter indicates the percentage to scale the stream image when it is placed on the page. Note that this is scaled on the browser side, Motion will keep sending full frame.

      Numbers greater than 100 are permitted.

      stream_preview_newline

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      If the webcontrol page has HTML enabled, Motion displays all images of the streams on the home webcontrol page in HTML format so that all the images can be viewed by standard browsers.

      This parameter determines whether the image is placed on a new line in the webcontrol web page.

      Preview images are placed on to the webcontrol home page in camera id number order. This parameter allows the user some flexibility in organizing the images on the page.

      Setting this parameter to off will set the image to the right of any image from a lower numbered thread number. Setting it to 'on' will place the image on the start of the next line(below).

      Users that require a more polished and customized preview page are encouraged to create their own local HTML page that reference the URL streams.

      stream_preview_method

      • Type: Integer
      • Range / Valid values: 0 - 4
      • Default: 0

      This option determines the method used for displaying images on the webcontrol page.
      • 0 = Full stream images are sent and scaled by the client to the webcontrol page
      • 1 = Substream images are sent by Motion. This saves bandwidth
      • 2 = Static images are sent by Motion and the page must be manually refreshed
      • 3 = Full stream images and motion images side by side to assist setup of detection
      • 4 = The source image provided by camera without privacy or other Motion overlays

      stream_quality

      • Type: Integer
      • Range / Valid values: 1 - 100
      • Default: 50

      Quality setting in percent for the jpeg picture frames transferred over the live stream connection. When it is set to a low number, it will lower the bandwidth required to stream the images.

      stream_grey

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      Send the live stream in grey (black and white) rather than color. Useful for limiting bandwidth.

      stream_maxrate

      • Type: Integer
      • Range / Valid values: 1 - 100
      • Default: 1

      Limit the framerate of the stream in frames per second. Set the value to 100 for practically unlimited. Don't set this parameter too high unless you only use it on the localhost or on an internal LAN.

      stream_motion

      • Type: boolean
      • Range / Valid values: on, off
      • Default: off

      Limit the framerate to 1 frame per second when there is no motion being detected and increase it to the stream_maxrate when there is motion.

    Database

      Motion can record many details of its images, movies, and events in a database. Support for one or more of the Database Management Systems (DBMS) MySQL, MariaDB, PostgreSQL, and SQLite3 may be incorporated when Motion is built from source. Many Linux distributions provide packages to selectively incorporate most or all of Motion's DBMS support. Configuration option database_type specifies which DBMS, if any, is used in a given Motion run.

      When a Motion installation includes DBMS support, SQL statements to insert or update database records may be specified using Motion's database configuration options sql_query, sql_query_start, and sql_query_stop. These SQL statements may record dynamic image, movie, and event data in database tables using Conversion Specifiers for data elements like filename, time, number of changed pixels detected etc. Motion does not record images or movies themselves in a database.

      Motion can insert or update database records when it creates image or movie files, when it recognizes the beginning of a motion event, and when it closes movie files at the end of a motion event. sql_query and sql_query_stop are executed only for the image and movie file types enabled by their respective sql_log_* configuration options. The sql_log_* options do not impact sql_query_start, which, if specified, is always executed at event start.

      Motion does not provide for deletion of the database records it creates nor for the images and movies they catalog. Other user-provided scripts or software may analyze, search, display, and purge database records and related images and movies.

      Example SQL statements defining a database table to record Motion file details:

      MySQL; MariaDB : CREATE TABLE security (camera INTEGER NOT NULL, filename VARCHAR(255) NOT NULL, file_type INTEGER NOT NULL, time_stamp DATETIME NOT NULL, frame INTEGER, motion_event INTEGER, movie_end DATETIME);

      Postgresql : CREATE TABLE security (camera INTEGER NOT NULL, filename VARCHAR NOT NULL, file_type INTEGER NOT NULL, time_stamp TIMESTAMP NOT NULL, frame INTEGER, motion_event INTEGER, movie_end TIMESTAMP);

      database_type

      • Type: String
      • Range / Valid values: mysql, mariadb, postgresql, sqlite3
      • Default: Not defined

      This option specifies the database type.

      database_dbname

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      Name of a database (SQLite3: full path to the database file) containing preexisting table(s) created with schema(s) consistent with any SQL statements specified by sql_query* configuration options.

      database_host

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: localhost

      The host on which the database is located. Hostname, domain name, or IP address. Optionally for PostgreSQL, full path of the local directory containing its Unix domain pipe; e.g., /var/run/postgresql. Ignored for SQLite3.

      database_port

      • Type: Integer
      • Range / Valid values: 0 - 65535
      • Default: 0

      The port number that is used for the database. Ignored for SQLite3. Typical values are: mysql=3306 and postgresql=5432

      database_user

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The user account name for database. Ignored for SQLite3.

      database_password

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The user password for database. Ignored for SQLite3.

      database_busy_timeout

      • Type: Integer
      • Range / Valid values: 0 or more, millisec.
      • Default: 0, immediate timeout

      SQLite3 only. If a required SQLite3 table is locked when a Motion thread issues a SQL statement, the maximum time it may block the camera's Motion thread before that SQL statement is abandoned.

      sql_log_picture

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      Log to the database when Motion triggers an image file to be saved.

      sql_log_snapshot

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      Log to the database when creating a snapshot image file.

      sql_log_movie

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      Log to the database when creating a motion triggered movie file.

      sql_log_timelapse

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      Log to the database when creating a timelapse movie file

      sql_query

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      SQL statement (typically INSERT) to a database table when a sql_log_* image file is recorded or movie file recording begins.

      You can use Conversion Specifiers within the query.

      Sample Queries (depend upon the table provided):

      INSERT INTO security(camera, filename, frame, file_type, time_stamp, text_event) VALUES(%t, '%f', %q, %n, '%Y-%m-%d %T', '%C')
      INSERT IGNORE INTO security(camera, file_name, year, month, day, hour, minute) VALUES (8, '%f', %Y, %m,%d, %H, %M)

      sql_query_start

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      SQL statement (typically INSERT) executed when a motion event is recognized. This can be used, for example, to record event start times and generate unique event IDs.

      You can use Conversion Specifiers in this statement.

      sql_query_stop

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      SQL statement (typically INSERT or UPDATE) executed when Motion stops recording a motion-triggered or timelapse movie. For example, this can update an events table with an event end timestamp, provided that movie_output and sql_log_movie are enabled.

      You can use Conversion Specifiers in this statement. File type (conversion specifier %n) allows distinction between motion movie end and timelapse movie end.

      Sample Queries:

      UPDATE security SET movie_end='%Y-%m-%d %T' WHERE filename='%f'

    Tracking

      Motion can move the camera to a fixed position given in degrees pan (left-right) and tilt (down-up). Movement can be set with absolute coordinates or relative to current position. There is also an auto tracking feature for the Logitech Quickcam Sphere/Orbit but it is not very mature. Review and revise the Motion code regarding tracking if these features are required. The Motion developers do not have any tracking cameras so it is unlikely that tracking features will be developed in any way. (We have no way to test anything!)

      track_type

      • Type: Discrete Strings
      • Range / Valid values: 0 (none), 1 (stepper), 2 (iomojo), 3 (pwc), 4 (generic), 5 (uvcvideo)
      • Default: 0 (None)

      Type of tracker.

      Motion has special tracking options which use either a serial stepper motor controller, an iomojo smile cam or a Philips WebCam driver compatible pan/tilt camera such as the Logitech Quickcam Sphere or Orbit.

      To disable tracking, set this to 0 and the other track options are ignored.

      Value 1 is for the special Motion Tracking project using a stepper motor and a home made controller.

      Value 2 is for the iomojo smilecam

      Value 3 is for pwc type USB tracking cameras such as the Logitech Quickcam Sphere/Orbit which is driven by the pwc (Philips WebCam) driver. To use this camera your version of pwc must be at least 8.12.

      Value 4 is the generic track type. This option executes the track_generic_move script. Users can write their own script to move the camera based upon the Conversion Specifiers passed to the script and/or based upon the environment variables set by Motion.

      Value 5 is for uvcvideo type USB tracking cameras such as the Logitech Quickcam Sphere/Orbit MP which is driven by the uvcvideo driver.

      track_auto

      • Type: Boolean
      • Range / Valid values: on, off
      • Default: off

      Enable auto tracking of the motion. Requires a tracking camera or custom script as specified in the track_type above.

      track_port

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      This is the device name of the serial port to which the stepper motor interface is connected. Only used for stepper motor tracking.

      track_motorx

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      The motor number that is used for controlling the x-axis. Only used for stepper motor tracking.

      track_motorx_reverse

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      Description

      track_motory

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      The motor number that is used for controlling the y-axis. Only used for stepper motor tracking.

      track_motory_reverse

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      track_maxx

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      The maximum position for servo x. Only used for stepper motor tracking.

      track_minx

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      track_maxy

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      The maximum position for servo y. Only used for stepper motor tracking.

      track_miny

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      track_homex

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      track_homey

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      track_iomojo_id

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      Use this option if you have an iomojo smilecam connected to the serial port instead of a general stepper motor controller. Only used for iomojo camera.

      track_step_angle_x

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      Angle in degrees the camera moves per step on the X-axis with auto tracking. Currently only used with pwc type cameras. Requires a tracking camera type pwc.

      track_step_angle_y

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      Angle in degrees the camera moves per step on the Y-axis with auto tracking. Currently only used with pwc type cameras. Requires a tracking camera type pwc.

      track_move_wait

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      Delay during which tracking is disabled after auto tracking has moved the camera. Delay is defined as number of picture frames. The actual delay is depending on the chosen framerate. If you want the camera to move maximum once every 2 seconds and the framerate is 10 then you need to set the track_move_wait value to 2 * 10 = 20.

      track_speed

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      Speed to set the motor to. Only used for stepper motor tracking.

      track_stepsize

      • Type: Integer
      • Range / Valid values: 0 - 2147483647
      • Default: 0

      Number of steps to make. Only used for stepper motor tracking.

      track_generic_move

      • Type: String
      • Range / Valid values: Max 4095 characters
      • Default: Not defined

      The full path and file name of the command to execute to move a PTZ camera in generic tracking mode

      Users have the option of using the Conversion Specifiers and including the parameters as part of command line options to the script and/or to obtain the values from system environment variables as indicated below.

      The following are the parameters provided as environment variables:
      • When called to recenter the camera: TRACK_ACTION=center TRACK_XOFF TRACK_YOFF
      • When called to track a motion: TRACK_ACTION=move TRACK_CENT_X TRACK_CENT_Y TRACK_CENT_WIDTH TRACK_CENT_HEIGHT TRACK_CENT_MINX TRACK_CENT_MAXX TRACK_CENT_MINY TRACK_CENT_MAXY TRACK_IMGS_WIDTH TRACK_IMGS_HEIGHT TRACK_IMGS_MOTIONSIZE

      The following is a sample script that moves a PTZ netcam based upon the system environment variables. The 3/8 and 5/8 are illustrative only and set based upon testing with a VIVOTEK PZ81X1 camera. The values and methods applicable to any other camera would need to be established by the user.

      #!/bin/bash

      LOCKFILE=/tmp/track_generic_move_netcam.lock
      if [ -e "$LOCKFILE" ]; then # Trick to avoid flooding
      exit 0 # the netcam of multiple
      fi # moving commands.

      function movecam() {
      touch $LOCKFILE
      curl "http://youripaddress/cgi-bin/camctrl/camctrl.cgi?move=$1"
      LOCKED=true
      }

      case "$TRACK_ACTION" in
      "center")
      movecam home
      ;;
      "move")
      if [ "$TRACK_CENT_X" -lt "$((TRACK_IMGS_WIDTH*3/8))" ]; then
      movecam left
      fi
      if [ "$TRACK_CENT_X" -gt "$((TRACK_IMGS_WIDTH*5/8))" ]; then
      movecam right
      fi
      if [ "$TRACK_CENT_Y" -lt "$((TRACK_IMGS_HEIGHT*3/8))" ]; then
      movecam up
      fi
      if [ "$TRACK_CENT_Y" -gt "$((TRACK_IMGS_HEIGHT*5/8))" ]; then
      movecam down
      fi
      ;;
      esac

      if [ "$LOCKED" = "true" ]; then
      sleep 2
      rm -f "$LOCKFILE"
      fi

motion-release-4.6.0/doc/motion_guide.html000066400000000000000000000246471452402535500206030ustar00rootroot00000000000000 Motion

The links below provide the documentation associated with the various releases of the Motion and MotionPlus software.

Documentation For Latest Releases

Comparison Of Motion vs MotionPlus

Motion Description MotionPlus
Limited Feature Enhancements Yes
Optional FFmpeg Libraries Required
Supported Multiple input v4l2 cards(RoundRobin) Not Supported
Supported Brooktree video cards Not Supported
Internal partial legacy Camera Tracking External scripts only
Optional Multiple ports for web control and streams Single port only
- OpenCV Cascades/HOG/DNN Yes
- Direct libcamera support Yes
- Sound recording from passthrough cameras Yes
- Sound frequency detection Yes
- Download/Play movies via web page Yes
- Add/Delete cameras via web page Yes
- Additional Motion detection measures Yes

Documentation For Prior Releases

The documentation is provided as it was included in each release.

motion-release-4.6.0/doc/motion_stylesheet.css000066400000000000000000000245471452402535500215220ustar00rootroot00000000000000* { box-sizing: border-box;} body { padding: 0; margin: 0; font-family: Helvetica, Arial, sans-serif; word-wrap: break-word; font-size: 16px; line-height: 1.5; color: #606c71; } a { color: #1e6bb8; text-decoration: none;} a:hover { text-decoration: underline; } .btn { display: inline-block; margin-bottom: 1rem; color: rgba(255, 255, 255, 0.7); background-color: rgba(255, 255, 255, 0.08); border-color: rgba(255, 255, 255, 0.2); border-style: solid; border-width: 1px; border-radius: 0.3rem; transition: color 0.2s, background-color 0.2s, border-color 0.2s; } .btn + .btn { margin-left: 1rem; } .btn:hover { color: rgba(255, 255, 255, 0.8); text-decoration: none; background-color: rgba(255, 255, 255, 0.2); border-color: rgba(255, 255, 255, 0.3); } .page-header { color: #fff; text-align: center; background-color: #159957; background-image: linear-gradient(120deg, #155799, #159957); } .page-header h1 { margin-bottom: 0.1em; margin-top: 0.1em;} .project-name { margin-top: 0; margin-bottom: 0.1rem; } .project-tagline { margin-bottom: 2rem; font-weight: normal; opacity: 0.7; } .main-content :first-child { margin-top: 0; } .main-content img { max-width: 100%; } .main-content h1, .main-content h2, .main-content h3, .main-content h4, .main-content h5, .main-content h6 { margin-top: 0.5em; margin-bottom: 0.5em; font-weight: normal; color: #159957;} .main-content p { margin-bottom: 1em; } .main-content code { padding: 2px 4px; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; color: #383e41; background-color: #f3f6fa; border-radius: 0.3rem;} .main-content pre { padding: 0.8rem; margin-top: 0; margin-bottom: 1rem; font: 1rem Consolas, "Liberation Mono", Menlo, Courier, monospace; color: #567482; background-color: #f3f6fa; border: solid 1px #dce6f0; border-radius: 0.3rem;} .main-content pre > code { padding: 0; margin: 0; font-size: 0.9rem; color: #567482; word-break: normal; white-space: pre; background: transparent; border: 0;} .main-content .highlight { margin-bottom: 1rem; } .main-content .highlight pre { margin-bottom: 0; word-break: normal; } .main-content .highlight pre, .main-content pre { padding: 0.8rem; overflow: auto; font-size: 0.9rem; line-height: 1.45; border-radius: 0.3rem;} .main-content pre code, .main-content pre tt { display: inline; padding: 0; margin: 0; overflow: scroll; line-height: inherit; word-wrap: normal; background-color: transparent; border: 0; } .main-content pre code:before, .main-content pre code:after, .main-content pre tt:before, .main-content pre tt:after { content: normal; } .main-content ul, .main-content ol { margin-top: 0; } .main-content blockquote { padding: 0 1rem; margin-left: 0; color: #819198; border-left: 0.3rem solid #dce6f0; } .main-content blockquote > :first-child { margin-top: 0; } .main-content blockquote > :last-child { margin-bottom: 0; } /* .main-content table { display: block; overflow: auto; word-break: normal; } .main-content table th { font-weight: bold; } .main-content table th, .main-content table td { padding: 0.5rem 1rem; border: 1px solid #e9ebec;} */ .main-content dl { padding: 0; } .main-content dl dt { padding: 0; margin-top: 1rem; font-size: 1rem; font-weight: bold;} .main-content dl dd { padding: 0; margin-bottom: 1rem;} .main-content hr { height: 2px; padding: 0; margin: 1rem 0; background-color: #eff0f1; border: 0;} .site-footer { padding-top: 2rem; margin-top: 2rem; border-top: solid 1px #eff0f1;} .site-footer-owner { display: block; font-weight: bold; } .site-footer-credits { color: #819198;} .topnav-d, .topnav-m { color: #1e6bb8; text-decoration: none; } .topnav { background-color: #333; overflow: hidden; } .topnav a, .topnav-m, .topnav-d { float: left; display: block; color: #f2f2f2; text-align: center; padding: 14px 16px; text-decoration: none; font-size: 17px; } .topnav .icon { display: none; } .topnav a:hover{ background-color: #555; color: white; } @media screen and (min-width: 48em) { .topnav a { float: right; } .topnav .topnav-d { float: right; display: block; } .topnav .topnav-m { float: right; display: none; } .topnav .logoimg { width:auto; height:3.0em;} } @media screen and (max-width: 48em) { .topnav a:not(:first-child) { display: none; } .topnav .topnav-d{ display: none; } .topnav .topnav-m:not(:first-child) { display: none; } .topnav a.icon { float: right; display: block; } .topnav.responsive {position: relative;} .topnav.responsive a.icon { position: absolute; right: 0; top: 0; } .topnav.responsive a { float: none; display: block; text-align: left; } .topnav.responsive .topnav-d { float: none; display: none; text-align: left; } .topnav.responsive .topnav-m { float: none; display: block; text-align: left; } .topnav.responsive .dropdown {float: none;} .topnav.responsive .dropdown-content {position: relative;} .topnav.responsive .dropdown .dropbtn { display: block; width: 100%; text-align: left; } } .subnav { overflow: hidden; background-color: #159957; background-image: linear-gradient(120deg, #155799, #159957); border-top: 2px solid black; } .subnav a { float: left; display: block; color: white; text-align: center; padding: 5px; text-decoration: none; font-size: 12px; } .subnav .icon { display: none; } .dropdown { float: left; overflow: hidden; } .dropdown .dropbtn { font-size: 12px; border: none; outline: none; color: white; padding: 14px 16px; background-color: inherit; font-family: inherit; margin: 0; } .dropdown-content { display: none; position: absolute; background-color: #f1f1f1; min-width: 160px; box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); z-index: 1; } .dropdown-content a { float: none; color: black; padding: 12px 16px; text-decoration: none; display: block; text-align: left; } .subnav a:hover, .dropdown:hover .dropbtn { background-color: #555; color: white; } .dropdown-content a:hover { background-color: #ddd color: black; } .dropdown:hover .dropdown-content { display: block; } @media screen and (min-width: 48em) { .subnav a { float: left; } } @media screen and (max-width: 48em) { .subnav a:not(:first-child), .dropdown .dropbtn { display: none; } .subnav a.icon { float: right; display: block; } .subnav.responsive {position: relative;} .subnav.responsive a.icon { position: absolute; right: 0; top: 0; } .subnav.responsive a { float: none; display: block; text-align: left; } .subnav.responsive .dropdown {float: none;} .subnav.responsive .dropdown-content {position: relative;} .subnav.responsive .dropdown .dropbtn { display: block; width: 100%; text-align: left; } } .panel { padding: 0.5em 1.4em 0.4em 1.6em; background-color: white; max-height: 0; overflow: scroll; overflow-x: hidden; transition: max-height 0.2s ease-out; } .active { background-color: #4CAF50; color: white; } .logoimg { width:auto; height:3.0em; } @media screen and (min-width: 48em) { .nav-vertical { font-size: 1em; } .accordian { font-size: 1em; } .nav-button { font-size: 1em; height: 2.5em;} .vertical-menu { font-size: 1em; } .panel { font-size: 1em; } .site-footer { font-size: 1em; } .project-tagline { font-size: 1.25em; } .project-name { font-size: 3.25em; } .page-header { padding: 0.1rem 0.1rem; font-size: 1rem; } .btn { padding: 0.75em 1em; } .main-content { padding: 0.5em 0.5em; font-size: 1.1rem; } .tblalpha td { height: 17px; } } @media screen and (max-width: 48em) { .logoimg { width:auto; height:3em; } .nav-vertical { font-size: 0.5rem; } .nav-button { font-size: 0.6em; height: 3em; } .vertical-menu { font-size: 0.9rem; } .vertical-menu a { font-size: 0.7rem; } .accordian { font-size: 0.5rem; } .panel { font-size: 0.5rem; } .site-footer { font-size: 0.5rem;} .project-tagline { font-size: 1rem; } .project-name { font-size: 1.75rem; } .page-header{ font-size: 1rem; padding: 0.1rem 0.1rem; } .btn { display: block; padding: 0.75rem; font-size: 0.9rem; } .btn + .btn { margin-top: 1rem; margin-left: 0; } .main-content { padding: 0.5rem 0.5rem; font-size: 0.7rem;} .main-content { table-layout: auto; } } @media screen and (max-width: 48em) { .tblsignal table,.tblsignal thead,.tblsignal tbody,.tblsignal th,.tblsignal td,.tblsignal tr, .tblalpha table,.tblalpha thead,.tblalpha tbody,.tblalpha th,.tblalpha td,.tblalpha tr, .tbldetail table,.tbldetail thead,.tbldetail tbody,.tbldetail th,.tbldetail td,.tbldetail tr, .tblconvr table,.tblconvr thead,.tblconvr tbody,.tblconvr th,.tblconvr td,.tblconvr tr, .tblpaltte table,.tblpaltte thead,.tblpaltte tbody,.tblpaltte th,.tblpaltte td,.tblpaltte tr, .tblconfig table,.tblconfig thead,.tblconfig tbody,.tblconfig th,.tblconfig td,.tblconfig tr { display: block; } .tblsignal thead tr, .tblalpha thead tr, .tbldetail thead tr, .tblconvr thead tr, .tblpaltte thead tr, .tblconfig thead tr { position: absolute; top: -9999px; left: -9999px; } .tblsignal tr, .tblalpha tr, .tbldetail tr, .tblconvr tr, .tblpaltte tr, .tblconfig tr { border: 1px solid #ccc; } .tblsignal td, .tbldetail td, .tblconvr td, .tblpaltte td { border: none; border-bottom: 1px solid #eee; position: relative; padding-left: 5%; height: 2.8em; } .tblsignal td:before, .tbldetail td:before, .tblconvr td:before, .tblpaltte td:before, .tblconfig td:before { position: absolute; top: 6px; left: 6px; width: 65%; padding-top: 10px; white-space: nowrap; padding-left: 5%; } .tblalpha td{ border: none; border-bottom: 1px solid #eee; position: relative; padding-left: 15px; height: 2.8em; } .tblconfig td { border: none; border-bottom: 1px solid #eee; position: relative; padding-left: 5%; min-height: 2.8em; height: auto; } } motion-release-4.6.0/doc/normal.jpg000066400000000000000000000337161452402535500172220ustar00rootroot00000000000000ÿØÿàJFIFÿÛC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROÿÛC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÀð@"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ƒ÷»HÈÚGØÌ‚q°ƒž”èÞdrw«+.xÝÎú`þ•©.ü† cðþ””@ØšØGI,Èÿ*²î3ŠÎ!„” æxíí[Ú#ÆÒÄ«"¼8$µXódõª°ÄÒÉÓçYŒòXà¨ÇçVàhdº‚æá"bPÌsÓ9çô¦Ù(, \6Â=†xæ®h±Ê†æ(f?(+/LåXãê>jf™lÓO¡™—Ì,{Øä©ühQí(@XÈ〣(Ì{±AV.˜³\,ˆ¸{’6Uçiþ+ŠžÞŽæ$ÅÇll'ÌËm?©úSõ÷Q±"…alÑtâHÿNµiY…=¨"e ¨ì¤òy#ü?:``Ò¾kF®@dœ+TÓb“B¶’•Ź9ë—ÚOçƒTl c’Ô­$QÜÓӆWÇ¿­Kƒ;Ÿ>€&Õ zœœÖb IÙÙŽàØÅtbÕcÓ–uPH,ŒqÇÞ?á\ܲ¼åIɬä–`FIaíL”›…>X9ëI¹7uì §¢¸B>EÏaYˆªÈDhF>SÈ¢2[s18c¥XÙ¶6”gÔS–Ã8÷¦‘‘‡ w¨¦´Ü¤Å~pyǵ£d¬e`6ôœÔ‹å;»&á·£zþ¬pÇ, 0yÜ:S¥„³W Ojh¸,pFGó¨äL¶c,¤÷À}³Ë‘$Ãç¥#ªHã'Ë=@õ¤¶FOš u4‹‡ ăœÒÀ•míüÁ÷˜òj°™$c¿øCRN…S‰="«DQ& Éס¨ä0¬hJ‚힤ÒL sncŽ0èj$a–Øê6œ“šsIÙÀ~ÿJE*3ûÃë€i²Ç¿“ó=jca@ùÍ+ÎT•QÆh¼r¬7iÆp@ïZÚØD‚Œ˜oçšË–(šs“´îåjݸ¶†êÖ,K÷—å-ß…¨Ñå- Â3Ö§Iª0W‘M’†FI01éMFòäMØ98¦/•·çvb -²,°66õÆi5xÈŒ9àš¹ `O•céMš"™[c’„)ö8¨ncVyÁ«,B™Zhˆ ÙŒŠaXÜl} !•™\• ô5UR %^}H«Ò,ˆ¥ƒdQUܼ±)+Á Ð"£`Ì«pG4HŽ àƒõ«-ä±ä`Ô3 X˜£Öž—iÅãBÄ:ψ¬yÃí~\Ô nd³ó@º)ç8Lþ&xm¾Õ˜ç…ÀÜ\“ø‚*+[‰(á 0>P=~pßζMl#¡‚ðX3‰Ö>ØUèÇôaø /ã[haÚåEÈ’"?…X•?‘?¨¦éÑ[‰$ØE˜m'*Fî8úÖ©^È‹bÖŠÅž<¹=‹/ÄsøVÙ4 ‘]\,£äº¶iQIÇ*Ì?Æ¡ðü²ö¤ˆ2:t?Ι ÒG¤Û†õdç?xp1õ¬Ø§häVÜ3Ò³çHlës ú¢;Y"*£'*s’~¢²µK¥nA?½·Û‚z˸~hj´W³ˆh$zŒõª³Áqq+;žIÉ>攪\HÒÔu&Òk8]J C!ÃÐãóÍa¾¥!hÉs˜ÆÕÁÇÏó«Ù’0›ŒóR.’ƒ ‚}ÍC›`V²½–]Ð>V Žüÿ‰ª7a÷–>¼æ¶ÒÕc”¨âd,Ǩ¥Ít$ñÆÄäÌòp¤çÔÖÓÚž{vª²éûÆ7‘Sqje“àjÌ…£\îè8–]'-œŽ(š DHŠ6„î( Æð¡¤VßüêBUäÀ”.GN•^5ù€”äõ¤‰‚±,…=Æq@ÖßËî¸#Ö˜P¡$)õãµ0Î ÈQ´ôã­,w$a‰e\ã© 5lô°öñËtäy‹•^äv¤ºÓì£lù­ëÔb·µâc‘pÑ‚Hìk‹ÕRâ90[}kV’è_%‡7ï.]G·zb ŠFkˆÊƒÈÇ"ªÛfNL›O°«F#"¸ó‰ô$ô¬™;RiYvœ^Ô‘”œb5Âõ'¡ûX]%ß$¡ˆ8":ä1ܨ1Œb s=¼Žì8㊚ ÛÚ–È`}«1ã†2d¿¨«®¯,Y,pA@ˆÊí#ŠQ(Ø Ÿ,tÏ­Aö7f*¼ŒóVÒÕV1•ÜÈx e»Å76©2`0lÔ6è»A+ç¦ÓšuÀY8ö¦Ü§’îªàb˜ËWò ü¸ÏE&­,,¨<©øô<Ös.ê%9äŠÖ"ÎCÁß]¦™q)9ž{b )ã#ØÓdòú:múг˜© 'ÔRyN b‹€ÂäžG¥(^I÷4í§#$r*C"àpxë@˜G'ž: P˜\õÏ\TÜä­5†8Êûb˜:ä·©ÎGj„ã®óÎzU¼wî:SFgoN¦‹ˆ„ì“„€j6…3œs×­Jð(%—§¨5eç·­=´Œœg'ÖšH-ó.•LrsíK”*FqÏ"À­°ÊžÜQm È\†p<š˜aI wÈÕ½0m–I²ÅÂûg¿å]XsÕHÊ´¹`Ù.ºÌÚ]Äh#¨Ïzóû6y¤$Œ&~•ßÌL˜N¤œzÊÔ–(IERI ÎE{õhBZ³Î§RQVF ¤vK“‚Æs}æ&6+(îE2âlÊF„š IvÚ{äb¹ê%Ëȶ6ƒw¹ –ÐÍxòA*6Óÿ¸>¼Sü4Zhn`'˜þaëŽõ¦È@ ´àúW‡5Êìw§¡ÏÍmqÙWzT23€  pÑ^ôŽ–ònÚòÏZÔÓA†9# Ó‹ÆFÞié –ûÊ=j“;OH†¢Ï6â6œd Ô–Ý'Œ¬W ´öÎETÓHIdÄ[±µMxmÚHÄy‹|ÇN*Q²È“y,Šä üµ˜[ª”oqŠ­]&3$¥Ûù¹âšÒ0š/Är) ¨^E”"I¸žy¨òÑïi#È'$Šœ­»e£m­íÅE¶g€‚} !%ÏËÁü«ü¶,[VËíé"õ‡.Öº§+šq&[ÍÆ$o3çãiÆh6æW%#Ú;S`i%;‚•Ç€ê*±8Bó÷û~>†º}@tä<¼¥IõTlžKmÜöì*ãl‰XÏ4‹R¡Wˆz*'M=€‚1àÉçß4í„䢂}Í,6{IòˆU’ǽ$°ÉàqŽ£¥sÊ›Aa„À Î;Q¿Ÿ˜õ9ú DÎqMô –8ⳉr„nëJ9PLt¨‚œ‘œzPŒû° $sJA ÁéÅ5 £Oz²¸*YÈO›4ŽñÇ*áwŒg¥;í.pyô4ª:€@¥ ÙÀÏáQ¶å”ãŽô‚„È`qÉíLh™PaG'½;ÏÂ(=H8ïJÓŒgägŠƒbô'žæšÖÌ3µpIÆsSFá˜ü¸>•-¼Í."À=I=ÖšM»DÖ3Ý\¬K…Œríׯj1Ã`°CàÙ9É=:ÔwZ­¶†ÔïryaÉcYÖÍuu$³]“‚¸T=G5é`ùaQ_r1^ɢйX¿xÊs:éÊ õ«ú”ŒŠBœW-xò;šõkÔ²²<ÚP¹ º->[©ãõ«3{´õšã “ëZ%Y§Y"RÊFr+‚3ë&t¸_D]Ò"0ëw»rmœ§;‰ê¥béŽ%ÕŒÀù{n©­½û·@Ï¿Zó«´æìtÁ5HÚE”¸ÈÇjhÚ~Qǽ?j±,zzšnÕ7/šÅDñØÉJ…”€8õ«Ná³É9ç$Sq6¼y9È"˜ÆÃ JÁX¨ Éã­Aw?ꊡæèsS®Cä6ÁÜŽÕ™žûËäc€Îi­@ŽÖ)‘X¬œç¿ ÔpêÞ\°î$gåæœÏ™åÏ!$†síNò Éç$¾fnj#±RÜFQ‹;ÆìÄœqô§7š>ë,ƒßƒOó’XÃIÁèqš£Œ©hd+ŽÀñ@Ê›7 ´³gšŒå%Dø`O<â¦fšXäN #Ò‚-ݾ_•ÿ#HDR¼ŠŒ^<ŒuÎãoZß¾i!µ‘ƒïX ~ïý㊨‘3Ø"i•Ä*v'@}*ìimÏžûª± ͆xãµG÷@ێé§ ½Æ_Q‰³æ|„däqùSÂÂ23ô?Amâ¾_jE`O?*È5º]PMvÑü¿tž1P£ÊæHÛ(À$g?…IæE±NTö#ŸÀÑ,±Þ˜<æÓÜ Ém'Ž`Re`ON‡2ÉoiÁP$t«ðÊ©cÝÜg·½6Q$²o.6`®1ëÞ²•(½G$%[J”ª¼»£/)ãð£ìÀFæ xª®vðS,8¬%'v„° ªAb8à/Ö eÃaNqÜ:ÓË m«Þý)¾a.K‚zÔ±Xg›¸2°8Á§n]¤ã<ñº£`AÏ/ê=:ÓX’Û‹|£µHµ£le¸”× °ã'°©²ƒºN}})ÁÉ"„ÆK§Â׌°E_âîúõ¨ê^mèÒ´Æ"Ï™/]ǽ.£öìé-í 3[¸\ÇŠ§¥Ø›Hr]ÎO¶;VÊJ+MʺQн ´6Ø(Ûæ=[9Î}*äÒ©I$Ûµ‚ ý†xÿ  ®àyaHÛÁ'½#ÈÏgp ç)Æ{Š× ­h»œõ¾dßÌ\ç<•‰79õ­[¾U}@¬ÇÆqžk׫«8¡¡BUÜ>ZévŒ“ÀéúSÂɼ˜ßþM‘Úkr G“Œ­hh‰K`!ƒ€£•á~õ6SÇëOX¯î& úg" ¸YÊlt 22E!Œ,ñºG @{TD2F>ö1ÞœV<–¶)±K+Ä  Ð"ެlÿw!Á8Æk>Ý<(:šµ«2³Æª¸n§Š4¨¼ÍE>諎ÆrÜõPON¸ö òÞÃÒ¨Å8<ûqV7gnÏ”÷÷®kHÌP”LO\T–Ó5ºæQ¸“Ôš„W!äô=E/ÎÀí#ךÚywãÜ,„6ÞO)­…àa²1×5Y÷¬NÊß…ü(¶eÆ&_›·8º”€±Î#‘—c{u4ØX²r§wsž”ädÈòÏCƒÎ*7‘K²Dw¾yÛÎM=¶À’U_,ciüj#¶5oÝîn¤šO0£“2×sž dÜ7¾=ûÑxõ-ʸ–Ù@%OÊyÝøö¨d¨Q¤Ÿ@§ž)’]Ï$¼[U†7ž¢›m± Í'<–é“YJ*[ ÏŠ†B£æ>¦žÌ°r#P2sÏzÎP°¬M&qŸÇ“UüÂÅwpqœÆ*Áž6AÎ =3Là‚1„A†Èü«;ÐÒmó(8¦†*»sŽy⤠òÁç§½"®èǘ>b3ëƒ@†‘”ä¨ç¨¦²d:¦TŽ}*B$fÈÚ@è¨Ú]¨ÛˆÀSÈ«¢Úš°§±q4`•s‚QȬ÷¹´9ÌËõ~îÊnç‚™8;OViÓíí]üôÏ5꺳ò9}œ$šÕ¸YóíŠè´†ðˆNW×L>¼-s÷À¹íÅn$‚×Á¶jxk‰d×ÐW=Y7¹ÑB)=hq¿9v8ôãÿ×Z[,ÇäÓ,”Ee qÀýM,Ÿ3ðp5ÀÙlk1ÆI±ßŠaÁÆåxÈÏÖœŠK£·JGeaÎã’]•U‘AÁëééQïÆí©¸ã¹éOœoQ‡ãó¤H…TÉ$AëÇzw ›« †9Â}i×)"ÊæáÏšFæçœšmd`UC~j9Y-2ó.cÇ~nsùb„µW)ïÞ«!þ÷Jq/Eƒ«N˜Mä²íY20íMU·%@&7QJÐÐs4Mþ¶2‡ûßýz‰ÚDuXŸÌgš±ûÔ H?#UØB_*J?ähÝî‘®Snâ1ž”¢ îdù}:Šd«4°ôýi¡c'ŒÆß• 2ug¿ÚÀ|£±«¾3Ë/¥eÊÅ®¦rŹ<Öö‚VÚŧ—îæµŠ1z³²x²Û”¾âˆçĪ庯zs¹bG'£SZ2«˜ÔqÀ&¹Dàòr8É?J˜/Æz¤®Uˆo›=êepØ+ÆF(Ü`¸ä)õÉ5˜ K°ÎsÛÖªã9ÿ‚¸îZ@—Ëb‡rã8=G±«Š“Øwc‘áP_.2§«–iå‘úU-ñǵJŒ¥Id“Œ•µ9ÙÙˆ¶í_üÝñQJ#È* |Üäg5]§ÃíRvƒŒöü(TwÈw,û½­¤2h%€ÈbÇ+ÐãŒÕ™‰€­´Ð•*·Á±òÒ˜†VsHã3dþµŠî!8VÏ9=sÍA,rÎ6ƪaÏZ–%Egf¸ Ñãï^?CNŠtwfœ’pК’™-©·$,eØsÁ¨ñsd ‘ô÷­wù¹=1€}*¡]„–ÃÎ3Ö¦T—@ ŠRÊVVù±»å1S›‹;¿J‚o$´“*#h!y®?¼UR%.X"ƒ…+ü_OjÁÆÌV4¾FŒ°rx'¸ôª×~Å66|ç|ðsíP<¡7m3Ó§N¦œ‘»Ã"¶Ãû³óçiÓV’dËc)˜³@*1Q1@2Nâ˜nBÜ*6>cŠ–àm\ ì+Ó¹Îf\¶O*I' õ­[¥»YÚ1ÏØâXøè;‰üb†~`NxÀ§C²2§8ÀÆk¡W²µHž)ÅÄ“9”BÅ6÷ŽÉ©²VBFO1T-f&Ê —Ã?€ «—Ù g“Ú±”œØ`33nçŸz6#rßxñÞª|¿.8ïNÜTü¼°äVªã¸d!1´|¼t9ªÒÜÆ®–ß× 2EWhb #vïN€Ä ¢·Sr4r2ƒ' â1V`Üe2vÉÛ·üi#ÈbNyÆÔü+!lŽSÅ5¸…pªHVß‚@Ç_ʪ»«‚ÌFHç=?J•ÕŽJ9UK„Ay˜©ézñÒ”·9TÊv¸œêiE¬Ûñ6à3Áà "h¶î™Š°ÎáŒþE\†@Îz`ãµ%i(ùm,GrŒtëŽ>•¯Ï̬p ïèj{¹@$äzdÕ-ãqe\ªÿ¥Ê®7ª0/W÷¹sW·y¶Áúž‡ëUå¤Éõî)ö-ºÚâ?î¶áø×ZÜå(L~ùœTºi.d.Ùzž‚¢yaWü2bgù¾\×5m i«Èò0¸ zú ѳ²o(Ërâ#ˆ¥ûÜ{àÕ{`CñµŒj$%ˆÀÅ,W¾hp‰ðíÓ÷±Ð`f¹ª·RMRo3JaÇ/)$ð}ë*y "v®w{ššëV76ñêá\3•F:ø~µ Ô–ïz×+oµCs“ÜÿŸJ#æ6»¢ùÜo±ÐfŸpB  R¢9“#w@GJ¯rëÇ;˜UìK@\ÏÝŸfF#88ªK!ŒçfâxúUëGeŒm‘wH=é¡ÅjM (6)s´ck”„G!${sÑ…E…I%Âmsа…Ât¡íTXÇßeƒ×­VâI—ÇëS±ÁRJøf£mÃr”Þ¥+ O)ã,H¸çÞ²5†LF‰ÄäŠÒŒ2¨ÚønàÖF¥+M}‡l\qM-I“²%Ñbóu=Sui|ÛéaÅ\Ð×Ë‚âàö²d%äfë“Z=Œ‘èM€~nAÎi”îmžŸZ•PïÉ Ù= 2@Œ0 }1šã,–'¬…AWŸjC XÉGqQFçŸîš—Ì;€P ã¯Ò˜ëÎ0@#ךkvPƒw)ì8ïK(%I ò³À4$f(©#=úõ£am2-cn2Cí“VÕ¶‡5^ÕJ<Ñm;‘²±æ¥VðXœ€pOÆ€-•|Ž7ÌÞv¨%FA#Šs œ@íK®)Æx*6ÀÊ Ãƒõ¦ùèFrxî*2A“’?:d1`@8É­€•Ãà’>j{OÕHÚ@éŸÖ˜dUåÉp1aQ*³ÊÆB@ã¯Q]©}N“3±Jç©<ÔfÔ4`3¹ݜԑ•°q»°§´«å¼dtävÁ­4ê2‰¶Ù mnKïfüþ\z…>9Õ`ÜNÜ|¹«ƒhQ¸àc<÷ªò¬dä/ŒIðˆ|©‘ƒGœƒ·©ÈéCí\ç×y#o—î1ø›æ±eç ŸjIØe+¯$;¨oCÚ³,'òH”pñ·>¸æ—Rb/gËmÆk:6ò®ëÆ~µÒæsX’GÝ+zf®ẖ¬Àç9Î;Ïe(Ä7QM¶˜Åt‡±8"±šºÔ¸›s»2¾Ù3žËÞ‘&È‚ç}3K,ÉP0G"  ËH¾{×3¡!dr$Œ’çµY–(¢~@t5—$ŒX"NVù†ù>ýªlÂåÙ÷¥²M,7ÝöŽ1ùóùTDE>;¶c¸V]€ŽçòàÒE{ѵ^j¹—ÉûÖAÁ<šÑh[‡M¨±È_›>µ©;a@èHÚ9JHñR¼ÛÙ˜`g¥_i)t“>áïJÅD6’!–=rGãRBÇp1“ЊÝüÕfp;w©–}Ɇ©”1âpê[çAÎGZnð£t/É?t÷§`Ìàv‘Z%EŽEÁî† ùÉ·ý¡\Ó°y¥pIœè/$xmdtpêzÀ·Œ»"cï5\w3™µÿº •ŠÄt¹«Å+G ¡!W'†ÈѶJŸqTÉ=dà‘Œž*)ê¸t ¹p8äçz}i6®=5Ék f$Ž¿¦+2o¡©¶¶"¡‘¹#“@‹ u'–cV;ƒÜö4Ñ Ú2ÙãŽj#.sžÙ©jä‘"ŒqŒòhˆäôÕp@.Ò=Ç#úÒÈDi—mǨÖ›w„@ãª2²ý;Ó^E‘ÁQ€O\sŠ,$YT'ñÆ›¼TeɤU ‰“‘œœP¤–Ù»2sÆiz’]qÛ°«æO›;vðAïþqT×r—a—ŒŸZ”Ì(Ä)Éí»œÓ@XÂ}žIX€r'¨Á9Èñº‚6¯^zþTÙgŽk™™¤?Â@Q€ÞGáÓð¨ÞEäY¶àõ¦Þs¼€;IëŽi<ðr¤|T¦I|ñøRïIrÛˆQŒ“øõ¤*5 \°&ó6€3Ïznò\€UýyôïVãÒg1«]Ì–Ð÷[ïÀP"Ñí“`žiRT] 2z½™•|ÂCœt…:T1°ð3V i̸I¦SêÊ E$81J²§r8#ê*¹,9AÒî2Cc­fÊ22x­{øÖ+‰ww6F+"E±Ï«’±‰>¢J÷PERcŒ8­MRؤPÈ[v Ë—1PÊHë-ÿc€à¨š5ÆÐ1ïëUtI‹ÚÉû†¯’*4E-S¨æª](EÀéÞ´¥b‡;K·÷EWY >7ÇŒVm&ìlv‘°ªucÝ©íy½€òÂÆ§·¥kEpGÉœwíY²Zf<<‡fIp)8Ûa ‚$¸c/%Áà犙ÕË®ÂLçž})žIh Á&ÈW€:d÷®³AÓ Ò¬£ÕoÿÖ¸Ì7ðïåU9; »´½þæ?:ãm¬$ £,G°ÿÕ‘Ì’M#{¢¢¸Õ¤™ƒ(wF]Û—ž>•ÈÓ~ò D uŒðúÕУÐ.Ëri:<‹·È{‰ Q¸ðô—µ¸el`,œÎ­Dw!’5~\+8ÛŽµ!‘cšMÀž0*œbúÙÄø‚Ò{HBI ÍÑùÖ~›³íñ¬ŒµèòGÝ»$‰¹2ãù×!©i g9F^7鎵“‡.Á{›ˆ©" €ÀÔ:l. ưmî.-Oî% q«RßZC…ºCþðéMI0-d—.Ç'9$ž¦¦ î ’p9ÉíPÀ8yFä•R3.͈~ðÚÇÔW D…ºàöõÍ! ' Í#He”±ÀÎ:w ÈîÉéH JpËÌXàúÓª°!‚€?*‚)$'æFzŠY@#ïw¦;’òÁ#'êzÓbæÀÇOozF;˜ñÐR/Ì2A,)çgfÂŒâœgL“ÀÓ>F*£ bšÈÊ6N~”;8»p02~)¬Fzr;ŠD<Žz|ÔוBáA Hõüh $y8韭 Å™x$÷ííBÊä6äùˆœzšId`¥¸Ú=iˆ| 5ÄÂÞÜn–A…Qú’{ Ô2ZèypmšøŒI1=‡ ¨­Gö6“ç¸ÿN½Éëv’Uä&GeÉîN+®œ9Þâ=Ü÷/ºišŽ43ò¯õ?J ‘æ)Ü ?…Iƒ´`–_‘qÁíŸ~†­j’%Ú$ìFåGvÇúûT¶À#ÄY±¿§4áŠ:ù×¥Ju ž?à*‰órCÌéÞÀ;]Ðn'‰®ôô æHˆëî?¸÷{†!|Éê£5é~Õ“ì·xÿÕ1þF›¯øwÌ-y§F7žd„q»Ý}ý»ÕI]]1uÔãæŒÍdÛÇÌ`9ÆFzWOÕX‚20z×;5£ÆÇÍÏÒ³[·/x~]­*žç¶wyŠ|¼ª÷b9ü+šÒ›áTe{×FòÔ”…Ø1„àzÒy ðÃ50#“éžjUA‚;Ž´ì2ªÀéó#g=4 T¯Å\*9¬­ÉâŽ^£é±^jI[D<Ù¾ƒ üOò5ˆõ u+—òÏî‡Ê£ÛÖ´Peøo©í¸“Ô'oӟư•Ã2€¤.:â©ûªÂ[–´O4XˆÕ¶´o´=¿0kL¨geòeþPðÏ¡ª–ûD2ãùsƯÛQæ© '¥TvYDc³Ìè2@ȵI¶@ +GÇLt¡pìÀ±l¶ÎÔó,[ìªO«Íh"=³»s>›?úô—ö^}³)‘Áô5$¿f·¶{›ÈQ#Lc% ÅA¡êj:ÌË!ýÛÛ±Tl#žÛ|’CƒÎjœ‹4|0Ü=ësRM—÷ þßôÍRlV%šìŽ@˽©²FÝ\qÆjF$:1=jŒ& Ÿc\%¦W#9çš‘[# ÎM1‘dü§5"¸Á ~R02)ˆt‡Ž›Hãâšp2ñ~”Ï,ž:åN`ʽ‰=y¥pˆ 1Ò!o=*6ÏÉÈãŠÚ¤·Cß½IÁŽxãôÎA9è1Ò‚Ñ€@É^ÀÓѲFÈâ¨B60ü­Ž[Ö…ˆº‘žx©: Çb›¸-Ã8cƒõ¤1­´f~â‹p—76Ö¼–uFì“Ï階By,Uöçè)úT‹ý±§Ë€¨·O¯ úšºqNZ‹¡s\•®59 8QÂúb©ùkΘû Vž»jÐÞ €N*”e×j³cwN~µÙ-ì$3ËÚ™òŽÕ ±'·L~´èÕ£aŒ¤ IíéS˜S½ËúÜö£fCÇ$gžæš@Å·‘0§N]ϱ؇¿5S˜§y6î,8ö­Lna mùQz ÿ?γ'ÊÉ Éö¥=´R“’¡í].ƒ­ù¥l¯÷#ÿ±÷þuÈÌ’I¸†=èòäu í½HàšÎiê7ˆt/¶+]X€· |ËÐIÿ×÷¯3ÖYQZ'.“!Ã#pA÷¯FÐõÆR–—íœñ§×Ðÿ3ÆšŸyfu ‚¥Ä8¿ç ÏÝ>¾Õ³ÕâFÛže¥‰Tˆû+¦¶ ·4ø­’Úª8ì)æÕ3¾<«{t&±Q,˜8 ž¹˜P|ãQR+‚…H"¨ 7n8Å>EÝÌ6 àÌûN;/SúfªË*Ä››9ìRjæ…º9.¯î8(‚(×з$ýp¿­Tuba«L/uIÉ€yjJ§2r0)!ÃäüjA"ž ûÒnìÛ«ޏ²¯ó«°!iA‘eä2ž¤‚ laÈæReü ü³øÕˆ£]…1x<Ö‘D’Äv™€Â–t^jHcY$XÁ¹%Î7F)Â'*B°OBjŽúi4Í.âá§i$+²0T 1ïÇçøUì#+U¾K›“ 6b€ì_öˆêj×…P6µ#÷-ÈÏÕ‡øW2$]Ÿ)®“Â-åZjWÏÄq¨@~€“üÅgyö252_Rºldy„céÅP géâéeË1Ã1,F Ç<Š–îÀº­…ù¸&±"™Ÿq@l± N+Ï*ãÎx2Ojw8ži6Ÿ7$úSWp`ÂŽ¤š~xÉ-À¥ 뚤|¬:òyÏo•lvd-ÈÀÝ¸²·´Ò|JÖá‚ckcë WÞÏ ÕrNHÒŸ˜#8glFp;`úõ§É ØŒPr8äsÎ3T"º2¼›Kg'¡8|8XœwÑq9ÈÎ'šªyÎOP)”™fжD'8‹v$Éè½ê±r9‘±Ï©¨ÞW'88ãÒ @ÌOÖšÀrÈs¼?+ÂJ€µÔ†R;0èjeëÅ;ŒšÑFÀuŽ©¯hk"€&Æqý׫™‡Ù%GÜ>Ç8ý ZÒõÓîÚfù¡˜þõG¯¨­=kKŽò©XaØ®æUé õõ»¼•ÑчP@E ¼qMnWp eGÓšHåó!‚à`¬Š gÔpQU¦¸ˆQÍZb- 0»@Ûž§¹ª·=~PK?@*K[yçaÁæº[ *³¸Œ>}iò¹ ½ŽHGåýö øè)¥zýkjýt-2f%¤¸t…[ }Oÿ^¹»«¶–y$Ž!1È@IÇâjU¢,Ȕ۸àâ¯xžú+½/N†+$¨Êò€ÙïøšçŒ„ä¹$ýi ;r{V±§ebîh¶¡n¼sÇ¥Koqð^H»•mby-Î1XņqÓ5¡£ÜÃiö™&ˆN%A„•¹Ï&—$P)6Å[ø[‚ç—Pl- úc­O®ÊŠÓY"’mÙî0Àöçô¬mÃ銎DÆäÑ«möÊC?lâµGÉ£+<Öy/•‘®THCd1r=RäB±¹Š€{ æš…ƒœÚ‚Ù§ºû<#$Ù@ïL»ÓÑoå[„•­"”Fî¬ÊÑ#,x—ƒ€ ´Ä³†OÜíà’MX°£îrÅú¡ô¤Ôõ:œKcËk™#ßf$r­Ÿ”çjŒ¹Ê©Ù¹YœbºŽæÕ¢5Ιg-Ä"‡H•vŒ®#Œ9¬«MrâvÞ«YL~T.¥Ió<­§Ìç|[Açi}¼Â|E?Ø¢uQ,· º=–¤2Œ#m1ù„"XŠþðg~>ð ÚXGK`X0}¾~L4ïÐëRŸÚÂIÖ*G70Æ­ÉÈè]2 }rN©~ú¨Šá¦‚Ö$1í2DZIåeËîÁÚ&ˆ•!Ì@fÚIRWZ =LöDÚr·äVÓ¼‘ò%»;±ìÇ?ú+™wA$šð´E¡¶é¸pÎ? ª~ ñ:Á†+„q”o¼?Þ>ÞŸc‹˜A*'ˆß8­9‘ ²n…è}iŒÍ» äTFâqsýô)†æfˆÿÀ…È›HsõúTyÅÞ¢70‘:<¼)êÜg§ýô*yX”àžJ|"ÜF±±@üê´À Éÿ} “NžßûFØÉ4aDÉ’\p2)6†“'Õd-ª\œŸõ­üÍSܳŽ{Ñss —âXÎXŸ¼*ÃRS†"ù°Bœ["½æ£ ÉAb£'dfa!PU ÛW€± ðI'y \I)xÁ7Ê8ÏoºzûP£üL´Òu Þ\ß 8ËÛL£æY¯ ÛAíߌ<&- SŸJ“SŠÎF³Lîc ê@ê@î@ÇÐ×­|CÔ„ž½¶Œ»ËÞGoÞ)¯/¶ñV¥káù4hÌ?fp˸§ÎªßxÓœž žO=0‰EPEP§|Gø_eàŸ ØjV·÷¼ëo:Ê«µ˜£6åÇÝ!àîê9ãŸ1®³Å5ÿéVzv¨öæf˜¢ÚÒ¸]¡›ž¸-Óæ^Þx扶ÉSŒàƒ‘L¢´¥Jud¡N-·Ñ+°:‹]Ýé—“Zþe)æ! #ƒžz÷ôüyz(­^Š“§.g²³»ùoЊ(ªÄ`qhÆu â¥{_}7Óuó¢Š+Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(¯Ñøc)úµ/­ÍûÓZ.Ê÷ï­ô{i·p (¢¾£–.JVÕ~¿ðË+äøÂ?ì´åeño×g¢Óg×^‹GÐ (¢¿<¯ ¼¡-Ÿ€ìc¸† ê#4 .C¬œÙü¥AϦ:U¿èþo èú…©¹û8Ýså~óÌÁY>b7}íÃÓ8Åu7QIö9| S±Š‚{@8ïƒøÐ‰/Â=OR½{›;›4ɧfƒ÷­# ¬0l®ù¹ÈÉ×D©ðßA´°¹´žñe¹1$Öq.é¹]ÈH;*1»„Œ]׆¤’çB¶–m&],ˆÔ-´›ÅÚ0SÀÆSÇ V‹Ûß‚8 •¼YsöÏßÜgËaæ8o³Ê›|£æaŽ }ãþ÷SÖ±«Ñ¾4Dañ²3öéÿ]$¯9 Š+KÃú<ž ×mt¸¥Xšv9‘†B€ Žçñü¨káæ•.£â˜§+Áh¦Y× ½±»'#ýÒ{W¤x§ÁxŽË*VB%ýÌÄpG÷[Õ—QÜ x{þÍi¬c£³yÈ»L¹çsÄ}Þ§…öm €<¢_„—eÙ«ÄØLǺ77<NNyêxãŸ7¯N¿—âæ«©ÙY\yÐÂûàHâPw¬Ü‚Ž„‘Ç= ó9"’^)Q£‘«£ #‚ìh´QEQEQEQEQEQEQEQEQEQEQE~ß㛿ŸºÈŠ(ª¢Š+åx¿ýÆã_”€+Öáø? þKµ¸½ÓÚ‰– ¨$#w–T€Aþ–àóŽÕä•ö,h§µ~pàŸê^ðÜ6ó\Í+º‰e+žYS^y HÆMUøuq€u]“:1XÐí882(#èA û^ˆ_ÊÂŽsÚ³%œüBÕÿ¦_ú)+“ ½oàÚØµ®¦âßý>7PÓÿ,˜|ª9ã•bxçåëŽ<’½'á¥mm©ê62¶Ù®Q,lݑ׮?@}(ØÙY”àt¨f€Â³žÆ™©êK¦h÷·Ê‚O³@ólÝÛTœg·J¥¥jñë=¥ú‰âW(¯¸!#•ϱÈü('šµ®§u®Ém¹£ûw·å`"2pFPžB3ŒŠÌø•ak/….®¤…Lð242c•%ÔÀ‚xúz èô»h¬ ž(çYYn%‘öãå.æM¤g‚Ð÷®/âÝìcFÓì¶¿™-Á•N8Â)>ÿ8ýhÈ袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠëÀR\U*sWNQOѰ (¢¿f¢Š(¢Š+ÁâXÆYeFÖÖ·—¼—äÀ+ë;˜íü;áC=¼E­ôë`Þ^ó‘cæœå‚ƒ€z#9+i¯g©i&¡Ëd³#\F‡ ñ†€ärF{­}tgÓntíÓIk-•ʪåLr«à(ç† ¸ë‘ë_–rÚÖ<bNGJ«rבkEnŠlZg-ó,“`ô ÉØýÑÈï ŠŒ„vö5Ïé×÷~"×-ßìëcg4PÁ°7˜XÄ’>üœc÷‹Œ{æ€:ˆT(玵ÍÝø_H·Ô®5 ¾ºrÓÌ‹†rqŸ¦HÔäžI5ª‰\ø•búu6þJɲDÂí”aë–Ý“ëžù®N½+ãv?á6´#¾žŸú2JÄøqáOøôëÛ™ ·ŠÙço'ßTN@åÎLwÈä(®¿â?„m|âtÓ¬®fžÞ[d ØÞ¹,¤0*Np:ã¶O!@¿´¯þÁö·\ýþ}üÖòúçîçyúÖ®‡ã WÃÖv-—3DÜclcrûð:äp8ëœ (³Ñ>"êM½úÏn··R™„Ò9R®T/ Wå\Œc˜ÇñŠ5Ëß,(°)¡ÔòIÉÀïÛëœJ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÕÈá æ4•Ge{üÖ©|ÝQ_®QEQEó¼O^œ2ùS“÷¥k.öi¿¹Z  ô¿‚E®§ã‰g¼´Çejf‰IXæÞ¡O¦q¼Œúdr2<Ò½Oợé‹qe4ÆßT»DnÙ *…ùT€ƒ»®3¸žƒó>„[»â²´eu+)%0˜.'€®ìÿ«•£Ïã·8íœsÖ°û6ËöÇQÅ7JÓ-míD\ù³Ë;–lÒHÒ0úÄo^´wÌKTN¦BYHÏlô¥šx'ñ5ÎxÏÆ6 Òb»”4óLÅ!rä)99<(8€q¸phÊ>3êÖWÚ†›gou׆ap±¶ï,’£Ž3•n:ƶ¾ øNKh—Å]®Û¨¤†;uS¸¶zå郞Õãºôºž§w8Q5ÔÏ3„™‹{d×]àˆú‡„öYL¿jÒL›š#÷â91œàrsƒÁÇbI  ßñÒySyŽ,ã4¾ÆÜü`Ÿ—åÚp1×=É}¬|µÅ±órIxƒ’@}3Ë×Ö1ÝÄñ³(%Œ¡ô8$d{+æ­kÂ怭-õ‹}œ1|D:`$}Ðr1»æ€0袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šý‡)æú…göcùiß§ßå°Q^€Q_ÆT¤áF¢Z&×ÍÚß“­¿ÚÍ{ã-s‹¸ä# |¨w1çÑTŸÂ±+²ø]m<þ=²’,¶é$’œ•vÏæÊ?ø0=õÆÜTÑLb“q={v¤rZ<¨äS-ƒ\ZÇ;#DÌ¡ŒoËìpHÏКԎò)—fv¶9Vâ¼7ãuè“^Ólq»M¿w]íŒc¶<¿×Ú½~Hƒë_:üDYǺ •ÕÛtx*¤qå®SÈ÷<ñÒ€9z(¢€ ±ay&¨ÚßB¥¶•&@ã • ŒûqUè ªlî¬õ]:Û)Òki—tr/B?¡ê Ö.í´ïêms:Æ&·’÷uwe!TçúdôÁü4ð{ëz£»©iÒ™Œ,䨹U3ÿxeúqÐóÏÇ‹´é"'ñÝO‘£‚y. ÈO|’¹  ÇN9j(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢¿q¢Š+â3¬ö¦2Ц® ¬ïךͫú%gÞû  (¢¾K œ`šNð–ý{ýéü½SÔ õ¿Òu­FÑ1VXX¿Tüs“œð1òœãŒù%tžñ…ׄ/¦–(âÚá@š;K¤6ÉõìGå8œ<ðÕ¥F¦ñvÿƒè÷^@}-rÑ€<°3è8¬½.Ó­Ù›Ì/q4Ù Œy’4˜ëÛv3íK¢Ï.¥¢Yj„Vº…g£„W‚ûñ’3œ SËkdÑ5ÍÄQdGæ8]îz(ÏR{ À ß_ßéZ6£¨Z¥¼¦ c$qË‘†Pʼn#9Æ¡çž>mÔluKY¼íRÖògfm÷Q²™V9n§ž~µõ%Ê¿–O¯2ø¨\Ë¡Üio ÝÈû„«v‰¾ÑI;ÃCm Ç’0XÆêΟqž¥ku5º\Å É#Àÿv@%NAàãZ­EzGÄŸxgĺnŸ6šõ0ß;´E8°IF'‚wŒn ÈÏ>oEÕøKÇÚŸ„a{[xmî,ä˜JñJ`x µàä08ëž›Ç_lüGáæÒ4Ë)Ñge3Ér +B±ä‘Ôô¡ÎG—Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q^–OJU1ôcwÌŸÉ;¿ÁQEúøQ_‰U©*³•I»¶îýXQ]Ùfg[/­í)êžë£_çÙôôº`QEúu—ÑÇàåR 9¥x´®Ýµ²¶éôé­íp>”øos-çÃÝ&[‡ÞëD£²(ãÑT ÁøÅ4x^ÆXdhåQÑшe!$ ƒØŠ¡ð£ÄúhÑ×Aضú„lòÀûH$œç»ƒÎÀ8¹ñVÜÞø:I‹íû4ñÍÓ;³”Ç·ßÏá_•[Á?›Z™4­sÊŠñ°°NƒjÌq¬:'‘Œœô9aW€Œe«å*õ/üMž9×Mñ Ç™áa¼|Æ0ç¸?Þ<ƒÔr5u…º<– §™kp»qrY¤-Ž»”9öÇ>ÜW—x‹@¹ðÞ®ö ² »â‘z:@8ìx#ÝÇ'è—¼‚æxdI@]AäGQ\'¼3.¿o͘O¶ÛäÄ.ôäã8ëž™ rhÆè¢¬Kcwº\MkøÔ[¼öæd^Ná´ÉùpqØò3ÏEYÔÒMJéì"x¬Úg0FçæHòvƒÉä w5ZŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+è8c“ûJ÷½­ÞÏ+_ç` (¢¾ÿ8Ÿ&³³~ëZy«_Ñnü®EWäQEQE~ÂØ‰ÖÀZe¸¯K'ø^ËÊÀ:9RX’D`ÊêpTŽ„Æ»xî×Å%¥”sC"Ê&”ÈF FGÌy8è8玊ø<ÝÑx겡.h·{ù½_Ê÷·—}À(¢Šó@é<7ã-CÃ̱ô›!»ýÎ0Oul9íÓ“ÆNk×4½ZÓ^°KË97FÜ?yuaØÿž•óýOgyq§ÝÅwi+EÚ×LšÞbòÍ2FTwri[S'X2@l-ï"À·'cÁ,Çúc›¤M,onй™ãxãÝÓaSùþ•ÕøÎÕ5~¢Ái5ؼgýa<Àk.× â &åA0ýœy ºU?÷Ï•fãï¡[ì×yŽØº›©%))ï…ÁÝC>µ<Ì…Â:£Fq’sýl%Ã\Üjz„ !¸»ºò¬¶½ýæÿÇGåSÜY3jú£ÊŠë][„m¬súŠ™Fã9Ëy&žÖÏFÞUá¸Ú‹ßÎ¥;Ä€¤ê¸ Ç$€02à>™¬}©Y%x‹íoSœS5·’æî0ÿ|D2=ÏZÎR¼lÃa¶QH̶À€È¥€>ßýj•cUÓÕ¿ç¡tõü©f‘f¼G‹(|°2=@æ¡–áÆÈÆ6£îZ©ìÊùÆ]¹éŠ–ãäóOžBÖñD*®{õ¥.bŒ.“š‘•ʰ@vázdÓ¢™7GEvl`úR\KµTü„årj§ Bã$ ЄM#Ä×Ô;›q# {w ¹Œ{QÒÙïȤ2&|3b£}«ç¯¥+rx錊Ÿp~† ’ ŽŸ…9¹úc­ ùAÏ<ç$ÒPÆ(¼ÒD$/æ±cû¢»r=®šnüdðy®c‰LˆÿíqZ^€I¤ÜJܘ=H>õWÑMÍæ¡!*³“=Ÿë]Š:!¾Ñ–xfš`JÊÅöûäé\ÿÅ«eµÓt£ %cþ]O….­¤ˆ±fG‘së‡'ú×;ñƒþAzFGü·ýµ™Çx‚Ítû_8žØÊÞãpÿë×Q¡Ãu¨¶¹£XyºN–±‰âÝÿ= •úW3â k C>C¥£Fsè_ƒ]í®³{áÛð¡€6ª­“(ùfGþ?ýDm èC{¢iž2º†ÏÃk0EÚ%»çˆùSëž´7ÙüM§ÛørÛMŠ×W.bÔ_ø÷ Œ°>üb¦Úÿ ‚ ÆïN¿L>0 w ÿ|š}æŸyáK¼dÓyºœŒP‹¼—‰%žŸ,PÌG@Änü¾Oʬê·Úå”jà—ÆfÿxBHkkbOˆú”í†[Ôc°”õüõ®sPûE¥Äp±?kžTg÷oÁ?×ð®‡ÂvÆãUÖR¸¹`òtÜÁˆ8ü¿Z]jÝ£ø£¥™àÝè¼7óÅg$ùGÔ¯áë9-4;[üœ$8Ÿþy®pqõïT4‹ß3ÄÚ„néöeºÞw ~_Öºí"Þ+}6îÇÌRÖ—“D¨ÝÞH‘®?C¶û\¶—AÜ5ÄÒJ¡Ž –n)¸Ù« æ¯ ºx§S÷¿Ï'¢"}MÌ$˜@ „õÅ^¡¾Ô.ž%HgYÝÙÚDGþ‚MgJ¾v©åçjI.ÑžÞ•Ë5b˜‹“ʆ‘îü&ªO¸±u<4‡‘í×e÷+IS–¿9ÍQ€¼±JŠ7>a>‚¡ »Ì”+ *õ¥vS9U$/ô¦ åäÆr@©Qn£'•Á-Æ>‚¥ œ)‡!OÞ S¶Nx犖GaTùŽx 6q^EJñew7ËïéJP}À*9dàdsÓ¢U1•ô4xÎj€¦XŽÂ§“/ßÍ@Ìñcž¾´†Fû°Tœàæ³$ð8àÇ(ëú=‡„ÐÆf´.ÃÔf›g9ŸDÔtø¢ÜËp¹”ŽU@ǯ4Û)ã·ÓîlÍÆÕ†)!ïAÆ*¦ƒysku˜ÁLò´wK–ùJ8çëŠîNÖÒèöâÒ÷Q†.[P7£g§ãšæþ1t+?¿ýº} ÙÚifyó'f•Ïñp¿Ê¹¯ŒH#Ñô¦<÷þù«— æ|cÅ…uþÏ$þ]œzT¾#Ó_ÄÏyäjaU´öÏË §cõÇ5Æx¬±ðy<†²#ðó+ Ö-bÑ5á¥Û]8ЦX¤¼+’-KF} JÜHÚðüðøþâ]GX~Ïm’-3ÑØaŸü*—‡%}GÄVš6¥sçéÖHlÇ[q€O}´ÿZÅc¨À|5­Á´ayƒlÞúõÅikßÙš§†t='ÃÅMÌå$°™ ¾>ó±íïLHŠîæ(#”[ÛNàºçËóO;søÔi¨BKG8VGÈ#ÚŸk¬ÚØø=´'²XгIiÝå'>n}ç5Èêv÷:f¾l/heņ¸¬æšÕ0­¥™Ð]ØéÚ‚ù×ä¢ÇÄl*¾•§àûÛH®ÞÒÚ[|¶Òßyóð®.îñï#@ÞJ"â>µ½¤ÛÍiq Îÿ½R íè´sÆžâiÕzФµ·eë eŠÿ‚c)˜ÉxrÞx¼¤¹—Æ ¹ŒmÝ£*Hÿ¾‚þU«¯o¼Ñîçb©2I •G†üüÏ?Zä–ì½½‘ó˜‡9í#ÿ˜¤êÆ÷0”\]™éZ$¢b7tÚ…ö*NïË5oÉ{[heÜi‰šFõ_,ž õ•h«Gr.Oâ¸dwÒ6ù‚g· Ǩxœ æìn|í C¹Œ$a5¨•GÝÀϨµ_›«x /üzÌ%ÜßÄœ~•g­Ko [éñÆ™Žñ.˰뵷m¨öѾã: ví&ñrZ«7Û¤^8ÂùJƒùµlø2TÂ:tb7Û•‚/;ã5ÀÏ­?ü$rjѧïŒ(ã€IÀý1RéZåÞ—g K!‚ñýæÝüÍDk®f ôËpn“Yµh‚ .]T±û»Ôþd×%©k*÷ÚuÜ…¬¾tª§Ÿ2(ÈÁö$β¦×ï®n¦+1@ñ¦ãýæþX¬YÒiãf –bOÒ‰â@õ:ÏêpÛéZVeD˜ ebOñ±Ü ýE7WñD-âXïÀV6ßg|zàI‘ÿ ãU !ÎÞÔ¯mÄ£3¦£ëµyž‹âA£©K$­ºXþЃ8 0R ýdiÞ$NÐl+yÅq!^9ÏÓëùÖ‚|“+Ž˜¥6²²+’;RöÒh¤®>Ë{™I'–‘DH'øŸ9?©4—.#Ÿyè˜|ú­5€ÃžW•-æJê¸"³–Àg-ä²6ws!ÜçÔg5"ÊQX)ûÃÅCöS Ðã"!XËnɆÞFÊóªúS²v-ߏ Áõ5 ±;A=ºRÛ²(É:ÕV”!N[=i& 9ÁéQˆpÞW ’ä·ÓëRJl‹´ã©&‘Aç§Öcªž ÔEU€\֞ܩã€1ô¨£$äõ¥pÙ$(^´…[ÌPF*L î-Ž;Ñ¿ž ñô¢â=Ç2È@”\¬lI唩ëìj=4\j^$¶·µŒÃwA(=8$‚>‚¨]j¯q,×(£Î”œL1Нc«Íoâkå% ,G\‘ƒšßÚÅÑëZN›q¼Q•c${ŸZâþ2E$Z.–X©CrØ {í5³oâáå…$€½ýkŠñþ²uË{[u¬2—çÜb·•x¸ÚäÝ|_:gƒÔ7/`À{õÛè—ú~Ÿá-VÃX…›VÎ.`q—¹Ü>LzŽ•çº…Ôš–£!„ƒgnу×w֖͜£®ßêÚÍž¨-–9­cTPwc¹©öŠ÷C:ßð=·ˆ¢óRúÜ< ó`¨?¸?Ò›¢DÞ Ô—ZÔmÕ4Ý[w˜ª2lI;”}®_XÔ5v8£¼Fò¡1UG½h¼¾Ö5KAgw4’C…ùXõÇLÐê+è\Ö÷÷xò uo†ÕÇßµƒ“ýâ "¹Ä1ø‹X{ÙÊÃon¬mÓ”ÏSëÍF¬µŸØþÑ/ÙÊÊnà¯Lj#Ó­¬¢“€Ùw7SYÎ«ŽÆ°…õFvfY|¿Þ8ʯ÷·Ä…r¬ s\í½Ù‚ݶðòœýaùsøÓ#‘¡@UˆcÎ}ëšRrwgL}Õdu)y£c<áL2)êÿ¯¹ÕÓÊB"aÉÈ8÷¦  šœ3‘¤Œ¤€w#k¦ù‹¹WscwáEô9ë¾§9ýœîë“ÓŸQW!¶ÛÄŒqZÕä%¶ý@íOŽÜÆX°'¥gí[ÜÍ’Ê'æf8è¶¶¡ ÛÔVÑKO<•À6©å½O¥?hØîìe%” °làýHöè²|ª¤g©­ˆÊHSƒŒúRý•X6Â8Î(¼˜µ3Ùò±¯©>¾ÔìQò€ÝÎ*ßÙ àõX –ØG®:TF%Žz.0*ûÛîÜ œ¼Tkn¡Xì#žsIÜ53ü°¯¦Žy«­Ê0§ 0ÄÎáƒgê*UÁÜ€Ia’zUYMËp –ïÒ¶.¿uå6;VÄ’8Éb2I­ •ÊE†³Z€8öª¯iòã§=jÛm6qŽTgŽôÀÌTs5 ®bXœ“š¬SrFs‘[l¤`p3UÅqÔûÕ)f[Æ©Î:ŸZ‹s)8Çj¾m1'œòEW–3†8à*®UƘîyŸ”zÐdBBƒœŽ=éŒ XüÝ1íQ6Ú8 Ó'#¿"£ù›9Çj±9ÝJ´ƒ¸ÉúSP¤ Ò7|Ø%};Ô[Ï$ôÇÒ«ŠÖmÁ¹éÒ´#³"Mì£1ŠÑ‚ð¼~•?ÙÛ«øÉÊâ±L[W<Š$Óâ•>eÎ}ºU¿(«î úÔÁ)ìÞ¢§˜ 0Y‹tà«Î«JÒ(VÉ Ã°ÅLŸ1ÚªNzñVÖS“Ž1À«I$4ì@ ¾2zÓÿ³#2oRÉlqR‹F^0W'9õ©B9 —híÍuSš‘jÝ'•íí\.æ )+½¸V¸Xsˆú~­mj|Ê‘1Ëcñ?Ò¹-BW æ/$ Öu]ätAZ%¸ÇW=qø“þ¦`02x<d`5ª¿÷›#è:ZT“–^Øâ¢ÅÝŸÝ pñäõàç]|M ¶‹r ã+‘¹Ä(ß‘GëÿÖ®êÒØI¥[ȾS$vš|²kÝ0¬®ˆ ™âÉÈÇLjYeäþïœÓxÊí'žjÔ$ ³NOJçq×S’̤2ÙùqžjÌq)Ug_•­1¹Te|긠۲á•wmÎ<`Õ¨¤j©èPµDJ<ý)[÷NP9Àã“Z&æl£FW‘ž”=³ÌÛ¶+)<+DìZ¦‘–!2¹Ü ©ùHÏ·lSBŸ/×O½h5–AÆA-’HÏ\BÊá0Aîió±L†!Á_—¡ì*$A 2ÄîÉèkC.aeP§<׊„ˆ˜‘"äò•ÓLW)cŸ.:ŠÔA€–=5¢Ù€XdqÞ¥’Ó1Ì(ªHR¤HPN@>µ¢ÑçÀ<Ò¬ Ôœ{RQOqF+©“,*€“Ž…VhGÊ@&µgxúUf@yãéRãÙƒc8Æ ŒU7€¾ò©œ˜ŽÂ¶ ‡\öëT¦·*€lqȦ“D¸´d]ÈTŽO­U’ÊT õ'¸­ƒÒ@q‘Áæ xØ”³ÆO±ªL•#T1†ÈªÌ23·ŽÕ¶ñ·Lã‘Un- €_Je©ø9>”…‚vçžõ9‚UuÜ2éUä_,¶î¿¦)ܽTD9ߎXóRÆï™¾œÑ¦˜À7ðOÙ´`ÿúëŸTˆbW †5bT‚[“QÆ›—iв‹äŒœ`sÍEÁ!‚/-Eäœæ§ó]Tg€xÆh Ò(#±ëíNi7)SƒïHdÛÎÀÝÇJiBQ€Ü¤qš…¤ÚI^{ TŃ)Ü@ã‚*âßF+œeôÅ®$rrwý+wýàyÅ_¼fDê‡w×5™(ýêýq[} xÐ:ß'…pñœzT'—¦Ú£œ§õª“Ëçg,=¨)–®Ò8>Ï(o•ÁuÝ8æ½#J·‹û*ͤ<ù ‘鑚ó ½Hß‘Fr~¦½ȼšU¬èø, 2ÇN+£+6eSbûÛ"ñµYOû5 iÁä2DþYqÂã´‹£¾$Ìl€±#Æ”¬y=½2k­Ò…Dbb¸‰XJ‡Ç>´.Tï%·gïw­·“b²`2‘ŒzšªÚMäm帷•ORx'5É<%µ‹"‡Pv‹ ŒçjQ0|ø9ôã5œÑÍi!¿x3€ÀðiðK “û̾y k•óEûÅs>¦º]¤x¦)./-HN:dŽIªò(ã•çŽõMáì[QK™ô;èZò È•=Zo ˜mº Ýê(ïš&·#šC|+·9çpç4&ìW6!l7‡J¯ó&23ŒûÕ¶™|¢UI$c¯Z©‘žFXà“š‡Qåm…ÜEå>¢ª„%ˆÁ'9çµK#IN#4+ýÓŠ¥PÈxR¥s“Љ÷c$ãjTqÐb£˜!<¿\ ¦Ê¹BEÁŸ^ ˆÂ_*À«ò´±Éö¨b™G rO'56èEо@ØqË ‘ß Ó•‘Á%¶· ª¬]¡sÛŠwC±•-°-¸žj±·9'wéŠØò$Dgtã¥TÀfœT¶ÄÑšñ’Êp„Tr©*ÌOLV„ªÜíéŽ*»‡´Ô…dcHÀ° •î}ê ¡‰åó“ÅlÓi|ßÞÅT–5Ï8ýj¹‚Ö;ñqÔcš™0Úú✱–R8ö=ªC ä–²mšØjåJý1R2Œ§:ÒÇŒ`õ)ÎÆU\àzw©°­¡]NÞc#ŠB0\+ïÜ€ 7~µ"JÑ6ÊŽ˜©¹%µ‰‚üëÏg¥S½ÙyY¾URH트.D±“ ã¬uY´K†E<Ï`3T· jrlÊF çÉí“T^òýÞ‡$ŠÐHÑ­¢pœšÏžaixæ<’BƒÚº.uØ¿pÄqîÎÈÀÇëPÅ'Ù¤ ïŒzŽõ$Ä'd‰=N9¦y¡FÌîGJhbÉ<0¦Ô úšìü'8m-RmÅ¡‘”‘é^s¤ÊÆë8È&½·)iÌR"´o cÇ#ŒqZÑš„®Èž±7%H$\ç#¨ Ôú~5‰#S!s RËnª=½jXãŸÝÊ2Û¸9Ç×Ò¬ù¶À±g'g<š¢A¤S÷zsÞœÅÎâ©*)W•=Žsrà|4QÝ{Ö™àÆ±»g¾Iɬû;ù,ÔF¾1ü°ô©’[M@™C˜]N ·¦+Ò¥‰„÷ܤ˘A´±ÝN¢«2N€Ì£'$}î{Ÿ^ô¯"ðåÛ#•SI’ÊþfÖQ–-ò­nÜ^Û”“+‰C¯É´œààð>µ`ÛHk”ÍþZìÏS’1Ö²h–Šæ}ŸtñžôÂáÛ aíSM$¤äc¯½@äB@Ïë6¬!’FW8ldÔHÛI{R´Á#åúÓ7B Ï<ZH¢Œ–#޼PvJšŒ“·å$t¦á˜tô âßPM„ŠA$~`T-î(’GV *6—#’hùŒ_޼Òy`äpG¯¥0·>¾õr­É÷§q’±Xùã×&¥†V™‘äcŽF TIHfìÜñV-î2Ø#SS¢.æ‚‘³± })¹£´lÙ&£ŠbwgoµW{³É^2(ÉYdÀfÏLÔQï„° Ãc'Þ£\JG8@õa °ÉcÛ4"nXÈ'€¿JœÜH\uUÇAëTƒì ¢¥Žtœ}Ü7n;Q¨\æ|n¨ÒZ6>m¤W2„8ëåØR$ã ¹»Õ¡•Ž}MF¬‘3©©·hoǪAbÈ„íÀÆ1Ö$úqÔu¨áœ${†I>Ôõ•IvwظéMDdâ!× €3Ž™¨Â,a¥DÜ{ÒžÈÊ  Ë¹éQ#LWeãiàÞµpW’D½>Ôå:•Ì»² ¾˜¬©;Wñ5¥÷¸÷®ZÊY-çä>GQž•êàq1–©…Hž±›™Ký£ø#¨ãéWG ¹ÝÏ-Ž«ÑõA4(»‹•ù³Óð¦.w6âK dsÛÒ¼ünêõ,¶{Rš”E”$NÍ Œ©Ó#”„#Ÿ˜p§¶)Ë’m“~OÊã5+[Ìì2qÚ¸µ4å}Ús±‹DpÜ÷¥u;T±è2@™?˜¸$·= ôª¦á••$$žÄT´&Hvís'P8&’+Ãnß»`ðõhÏOþµEË–9ÈãZˆÏÌ7Èõ¢2”]Ð&’Úã÷‘¶ÂyÚÝ?H‘˵U˜Æ+.7`Hà~¢•§‘`“ŽÙ®ÈbßÚC4ÞsÍ´SM}O|j©H¥y$qÿצZîÔÄŠEù°{úâ™$N±³…轿 쌹•ÓIl'ì„*œÁéíV>Õ5»ž,¯®?­ZR¸$jF£hÙøî§šŸgmc D‘H›–N½J«,ꄨ|q…ç4ùì#XPDpAèzb¨‹Óo.%aÝÁgéIÊKâÐ )=Öâa†Þj­0™ä/4™É$í^MiDöóª¼sðǹ¢áR1÷ëžM7ÖásØ,ìZ'þXªòÛÜBHuÉ Ö¤‘f#ŽiÍ#†Ù 6÷íXÊ„dƒCÍÉ!†HéQc%†9ã®ÜéÊÍ[=³È¬ÉPa¸#Ö¸§IÇr]Äs¼•ÇNâ£l…çƒOV;c®EDÌqYr<àJŒ°× §œ”?6=2)Žª¹"ÀëPäÉã­K²7 Ó9¨„cfBð½óÞ¦S¿•"–¦ö&ÛÕô'ò¦yjíFô¢EùNIÇ ¨—YW8Q©%ÈÔŒ(aµGOZ³ [n·ž+6¶ãnü‘Ï5"ÊX¬h1““íBÐW5Äg‚wwª×Ó³Nå° |wŠQˆÜ1“ÅexŽåít™˜ýÙTõ9­è'*‰ [L³Œ&xRxªë™$X‚]‚ã5 1ȵ]ÑÁ“W´ŒòZAùW¯R®œñZž…mkýf–°HÌ€Ê Âƒßõ5¤ú”k`qœŸZÍóÑK6ã´ƒ€G\T¨ºV’rzq^#w{^H²%.7w`x®cÄ:WÞ½µÁbÙ‘së[Â1 ¤1˜=ÍMn‘™¿|v ü¨FwŠºStç̈q¾ŒâìoJví«±Ó¯b»ŒõK–gÚA$ rÜ×$âìÎØ½ ŒÞlaT隥sPwtªiçM¡UÕÈíU~Øà`ÜqRÚÙ#´N î8SnIE8Ž´·7HÄ ö8ïUžàw=ê¾Æl”ç Ç‚zŠS&ŽãÓUåÜêàãøi§Ìöþ4˜®ZY)ã•!ùO½ké¤Ño ¼‡^õί™³kŠpÜg§Òµ¥ZPØhÜhÃñ:H™ìÜÔlL*¥œ'¾kåvXqÜwúÕÛwíÚ]®*ÞµÙ B–Œd·ñUå=ȪÓ,·±ì‘•˜ÉV\1è{ö©Q°pq[î2‘µžy ¼äR& Ê»fRqÉ=ÿ*¼ É' ŸÃ¶É(!º“×¥G#ZÄCÌÊH6ùmÜš©%Ê™[fé00BÕ{«9½?»ÜT°^Â>F\ƒ±ÍúÚZ#-ÃĦ0±ñÎæäÖTÖ¤%™I>õ®Ä‘ŒûTÊN­ŠhfŠx•°£;ÕbÏá² ç‘[Œû¹ÅA$qÉòÈ£oµsÊ‚{ ɘ匀tÅ4† ³h>õræÐÆ "€ž¹ª È«½—ŠçtÜXœNɤ!àö JíO»ØŠ«Ê¯Ï 8¤óÜ1*Ï ¬niró`¨9,© Ž3P}*—˜ÒmÉàvÍKæ¡@ç¥ ±\—`fGÌ8'=(É$uïL„±×lҨȋ Os\¬-‰ô÷®’}MlÚ=±¸F‹1¶qƒôük‡_µ$ŒœÅz4+{8+»™J7gu§ëê±Ãk&eeaóŸàé]W&à¤|+ ͸ñ€Oò®#F°ŠÞß|¬2t&·mʧ·¡®lUoi.k+•YÍÉu-‚ÿ9©$– Pç+Œ“øU6˜}œ¬dd˜ŸJU`éÓÐW5Ð\™Ü¬e“¹â‘Y¥bì{„aI8Å8FU‹dc Å%ääˆU^§’;f Ë!?7Ò¥óUI?ZŠB¥;@¤ÆÕÄó1÷ŽAÀäzSÀîã±UÀTÆâÀãu¦#þ^ Zu •Ï#5«Iî2çZ¡1±•GM {ƒ½ mèiË!$çÑ*C0+ ÏÜ:Ôrµð€d>vœñU&˜GÊx5¶³FI™†~i±ÝŰaÔš‡.@f’HÁÝ…ôj¤ÊŠ¥X–¦8«r|ä“Ï5U”俇sY.AJ³G\©âª™U±òçÔÓш^ü{ ó%a—*¤|½*@Z<°b îá€-žqéU™î<ßdg¡ª~

µ#Ƭ29ö£A3.~âB %g\¦±ïMíñ”ˆÊ+c ñ]Gå“´t5¡xÏ÷WKÅTåå#”åSL¹\‡”æµ´û%ƒ—;Û<ÛéVÞ¸ä‚G§jjº*TõàŠÍÕ”•›î_ŠaÄzšGœ·Íœø»UEFwÆMM³Î:à{ÖWc¸;¼’¹ÀPIô9æ™$’ï*ùdüØïVc‡åçšB›Kc9Å;Œ‚ES ‚{㸕Ú.T)ÀÉ>äU’ àó“ÏJnOšŒž”s q‘ÚÉ)A«,aÊå† c½; 8žµX¹Êÿ2)#‹qÜŽwf“T+ù¹p@ÉäSÕH@wq€zU`ª¤–lrI¥›|M±Ž@ä`Ò³fti<ã¥3r¾W< WY”¶Ùµ,ry{¶€ÜÏzf+– äd𣿥'’‡!_¿\S£ãrÀ¦r”ÉyR£CWk Lˆ¡ÄœtÍEæ”]¸ÿëÔ»+ç–ì;Ô-†I|ÜÔ¥r˜¾yDPp<àñD“““Ž@„uÎyç4.æe 1×ëUd$û’yžjðߥ>u?{rz®¨¬SyÆü…9þu̧ï‚sŠ>4‹DàŽŒy¨ÕeËg`늬e žE0ÈÁ‰ Œœôë[»E^åÁ"…É©âOØÔ å;’$Úõ(Ûƒ¸2±çšéUbʱ+?p>µ^äÁ2ê =ÇZC!G8lŒTd‚8äSzˆ¬«q’¸eî æq¹òÛÐÕ†l ÿxUibY†z|Ôr[ác5|•)¸ñž(Û´9QLÜpÎ) g‚Û}«ÍÄr’§°ïNœûÕer¤ŽvžÕ6Tx'®ª  ëS3l$ÝŒsU¸ާ­>7M¸Î=I¦€{±mœóô¨$'n°©Ÿrµå˜0úSÔb…bFUêNIÍ<€$ ŸSOBPåW¿9¦®—^½9=*„M CÜc(,xÊŒT/vä¸ÏLÔK3 ãÛR&ËŠ_>Y_”ÿ*±2}Ñ7ÈÉ‚¾€õI.w¶ÕqéÚŸæÊG#5J]qIßù³žÝ©6+0^GûÓ¼œÄí[<Œ÷¨À}Ûzc5V¸\F áA8$öÏz›{É Dªy$‚NìûÕdBX†“ñ©âI#ó}Ö>™§­Yü#(VÎAãüE9¤DU7¥@Ar#Ï çëAµ%³0y÷¤Ýô zLÊåqœuéSHWzüÝqÖ¡•Ê’ÅrIçüŸ(H។SMX^"C`g*%$öÅY‘ÙOÌzñQÀ H~u‰€Œ”.žôõ$ÈÏYYÄlÌZ˜e‘xE ˆ²Ùó‘‘ߨÕWrÛÇ÷})Þsàa¶÷í‹Íò£*(ܹ’Sy?{å}¨]®>cƒœýhr7œ}¾•¨\ڭźÁ.æ…RÝe+7ï¶yg ¡:ív)çG¼.N&‡@Ôïü“löw1Ël×I,?hpQZ5+åˆ|àøš'Ç‚Ž1Iè2º\8'ñ¤æi·™p§òÍ@ÐJZì%´ó›‹™m­æhâ9/¹£«ƒ½W”n f¤k9ÓJmRWµ[h–'‘ ¬²¢H£T#.%„ŒÅ|è÷ÉÅ©45.„’‹•ù—ÔTFb§ÀïOšÞú «k3k+Ý\ÃçEo™e#|ˆT¢‚Cƒ–NJó`† ÄW’ÖõÞ!³ÚnVòä]Ò¬8~bÁØnù{J†è…Tôe\Q)$Ž£µ5_äÇ9¦4S®Ÿöý¨-Œën­¼nf+!/RƒÉ‘KtÜ Œ•}° sŒ>µªw´’sŒÆ˜Q¤‘UWÌbþ^Õ–4gnÄV`Ò¾NÈÃ7̼|Ë•]„ON)—£EåÉngžG çùk™$uq±‹¡Ç´l>oŸæ|ÄQ2É-ÄñGomæLi$Ñc!UŒ”ݽ‹(ê¨w©Ý†Rd)v>ÀéÙ™q$vÊ<·D“&f@6¼‘¡Ïñ6ÞJ°RÃQ¾°¸‚O²ÙH°ÃeQ Q¹­nÊLÂ?0ï6ø*I æ gË Ó'¼ÑôÓg×’)ãûM¾ ÖÓ aj>WÙ&КŒvB>P£pK9®&Ex¢†D3Ê¿¶rò¬R0²“+aӈð_½ÅñYUlùÑ– Ø Íc"«n]®Ê·& Þ»›oy}kasc ÷iew,òÝÃ-ï˜÷fU…X;ˆÔI`åNL„2ºï{–µkwK5ˆÚZZ[h–P¶æÊHû¼ŽU›xë°nKA…Áù–4V1Æe¼ñB¨•K••GÌè1œ’í6;Å•OÜ$6ßÝÊ’®zðñ³#ÀIÁÈ<‚vyÒá%¶šþT½…ñ³”‚Aǘþ^9]¼§#nG™¤,D’0, ï<(\³`nvÆæl ÎÌØ° —FmaŒž)¬…€ù°R2ˆþf“,E2L”9àg5H.&øÄ›ÆïïJÉàç(ŽÕ%Æ:[éHV’®AƧm °ü`qÔŠ‰æ!0f“p‰73ƒèhAËÊNr8¥Ë ¶&ó?’)À;!3¶=Ùô¨ :l9,8ã½0‰c˜ÆÌP‚U¿¤¬+Ø1.¸%qÏ^hl ù[qÅ5¡s+ªÇæõ±«£3ð†¥PÃ!Û­J³3H»¸@pÛz‘HcsÐã¡hØIò€àsIn=Ql¸òŽC=ê(®!ß¹‹ƒÂÕ\¼d– •þ}é€ÈÊß'Ê9£Ð›²ûH.U¦Váx*{UmåÕŽsŒ TpK°±ëž}jI l(ÚIéC³ZÅ]ʹ-žM!œäÔrºŽ”Ѽ°@½856cE’à”Žj¿ž ^ŸÊ¢‘AÝÉ x>ÔÀ `ä÷÷£Í ’pã4ôw‘N>P¼S»È8=)™gÿ®„4Iýì*¹9…­e°±º‰§®~Ð8P«ÌSG9*;K¹n4ŠÍ¼‚8ÇSK—ÅíŒU%Ü ?Ú·–¶¶Š³ÁØbŽ4ºXö˶&“~O”J˜aù¼°ÄCf aÕ¢šúý­õ-OYm³+i÷[h óÞ1k…1|‚ dTQµ+œS|–pÄ €{qšq½òµ!ukmuf¤6ª"Ôq:yqÇ’9ÄCËb‘*Ÿä4£€ÿ(ím± ¶RÝ‹»Él#tÓŰžA°­²º¬VárIJ•D Ê_*‹î3ɨjÒév‹±[xd‡NŽêÑ$IÆÙ"‹*øi‚2 “DŽ@jÓ´7]\Mb%¼—Ê6÷ rÛ­ŠàHÄÏ*½›oÎYÀ°$:½ÌšJh×[Ýié5»ùfâsm)h|ÔMãšÙ“%†_ïyM!Xšxõ¿^išeÓ>¯pRH,ßÅt$Ái¤ýïšÈ\3–*Äû¥ªië,–w cii<Эª´¯±Æ% n¾b$Ü"mdRL¼f)ãÚÂXI1‚™ËÇåØl3DË®ÿÂ9,/sy.„¯lÎwæ,#ä+yh£mÀ®ä Å"*~îì¼))µ‰Ç­]¹ÖΞ,Ä%-ã¶’Q>å•PÁ†òÊå\­­º“¼®ˆE.HÉbAÈn=ªãQ¢®ÏÿÙmotion-release-4.6.0/man/000077500000000000000000000000001452402535500152245ustar00rootroot00000000000000motion-release-4.6.0/man/motion.1000066400000000000000000001272631452402535500166260ustar00rootroot00000000000000.TH MOTION 1 2020-10-19 "Motion" "Motion Options and Config Files" .SH NAME motion \- Detect motion using a video4linux device or network camera .SH SYNOPSIS .B motion [ \-hbnsm ] [ \-c config file path ] [ \-d level ] [ \-k level ] [ \-p pid_file ][ \-l log_file ] .SH DESCRIPTION .I Motion uses a video4linux device or network camera to detect motion. If motion is detected both normal and motion pictures can be taken. Motion can also take actions to notify you if needed. Creation of automated snapshots is also possible. .SH OPTIONS .TP .B \-c Full path and filename of config file. For example: \fI /home/kurt/motion.conf \fR The default is \fI /usr/local/etc/motion\fR unless specified differently when building Motion. Many RPMs and Debian packages will use \fI/etc\fR or \fI/etc/motion\fR as the default. .TP .B \-h Show help screen. .TP .B \-b Run in daemon mode. .TP .B \-n Run in non-daemon mode. .TP .B \-s Run in setup mode. Also forces non-daemon mode. .TP .B \-d Run with message log level 1-9. .TP .B \-k Run with message log type 1-9. .TP .B \-l Full path and file name for the log file. .TP .B \-p Full path and filename for process id file (pid file). E.g /var/run/motion.pid. Default is not defined. Pid file is only created when Motion is started in daemon mode. .TP .B \-m Start in pause mode. .TP .SH "CONFIG FILE OPTIONS" These are the options that can be used in the config file. .I They are overridden by the commandline! All number values are integer numbers (no decimals allowed). Boolean options can be on or off (values "1", "yes" and "on" all means true and any other value means false). .TP .B daemon .RS .nf Values: on/off Default: off Description: .fi .RS When specified as ON, Motion goes into daemon (background process) mode and releases the terminal. .RE .RE .TP .B setup_mode .RS .nf Values: on/off Default: off Description: .fi .RS Start in Setup-Mode, daemon disabled. .RE .RE .TP .B pid_file .RS .nf Values: User specified string Default: Not defined Description: .fi .RS File to store the process ID, also called pid file. .RE .RE .TP .B log_file .RS .nf Values: User specified string Default: Not Defined Description: .fi .RS File to save logs messages, if not defined stderr and syslog is used. .RE .RE .TP .B log_level .RS .nf Values: 1 to 9 (EMG, ALR, CRT, ERR, WRN, NTC, INF, DBG, ALL) Default: 6 / NTC Description: .fi .RS Specify the level of verbosity in the messages sent to the log. .RE .RE .TP .B log_type .RS .nf Values: COR, STR, ENC, NET, DBL, EVT, TRK, VID, ALL Default: ALL Description: .fi .RS Filter to log messages by type .RE .RE .TP .B quiet .RS .nf Values: on/off Default: on Description: .fi .RS Do not sound beeps when detecting motion .RE .RE .TP .B native_language .RS .nf Values: boolean Default: on Description: .fi .RS Use this option to enable native language on the webcontrol and log message. Specify off to have messages provided in English. .RE .RE .TP .B camera_name .RS .nf Values: User specified string Default: Not Defined Description: .fi .RS User specified string to describe the camera. .RE .RE .TP .B camera_id .RS .nf Values: Numeric identification number for the camera Default: The order in which the camera is opened by Motion Description: .fi .RS Use this option to assign a number to each camera that is consistent every time that Motion is started. By default Motion will assign a number based upon the sequence in which it reads the configuration and this sequence may not be the same every time that Motion starts. .RE .RE .TP .B camera .RS .nf Values: User specified string Default: Not Defined Description: .fi .RS This option specifies the full path and file name to individual camera files. This option can be listed multiple times. Each camera file should contain the options that are unique to that camera/video device. Common options are obtained from the motion.conf file and values are overwritten from each camera file. While the motion.conf includes four sample camera files, the actual limit of cameras is only dependent upon the machine capabilities. Remember: If you have more than one camera you must have one camera file for each one. For example, 2 cameras would require 3 files: The motion.conf file AND camera1.conf and camera2.conf. only put the options that are unique to each camera in the camera config files. .RE .RE .TP .B camera_dir .RS .nf Values: User specified string Default: Not Defined Description: .fi .RS This option specifies the optional subdirectory that contains the camera config files. .RE .RE .TP .B target_dir .RS .nf Values: User specified string Default: Not defined Description: .fi .RS Target base directory for pictures and films. It is recommended to use an absolute path. If this option is not defined, the current working directory is used. This option accepts the conversion specifiers included at the end of this manual. .RE .RE .TP .B video_device .RS .nf Values: User specified string Default: /dev/video0 Description: .fi .RS String to specify the video device to be used for capturing. The format is usually /dev/videoX where X varies depending upon the video devices connected to the computer. For FreeBSD certain devices use the bktr subsystem and they will use /dev/bktr0. .RE .RE .TP .B video_params .RS .nf Values: User specified string Default: None Description: .fi .RS String to specify the parameters to pass in for a video_device. The parameters permitted are dependent upon the device. This only applies to V4L2 devices. The Motion log reports all the available options for the device. .RE .RE .TP .B auto_brightness .RS .nf Values: 0 - 3 Default: 0 Description: .fi .RS The auto_brightness feature uses the device options to adjust the brightness Only recommended for cameras without auto brightness. 0-disabled, 1=Use brightness, 2=Use exposure, 3=Use absolute exposure. .RE .RE .TP .B tuner_device .RS .nf Values: User Specified String Default: /dev/tuner0 Description: .fi .RS Tuner device to be used for capturing images. This is ONLY used for FreeBSD. .RE .RE .TP .B roundrobin_frames .RS .nf Values: 1 to unlimited Default: 1 Description: .fi .RS Number of frames to capture in each roundrobin step .RE .RE .TP .B roundrobin_skip .RS .nf Values: 1 to unlimited Default: 1 Description: .fi .RS Number of frames to skip before each roundrobin step .RE .RE .TP .B roundrobin_switchfilter .RS .nf Values: on/off Default: off Description: .fi .RS Filter out noise generated by roundrobin .RE .RE .TP .B netcam_url .RS .nf Values: User specified string Default: None Description: .fi .RS Full connection URL string to use to connect to a network camera. In addition to standard camera protocols, the following prefixes are added by the Motion application. .RS ftp:// mjpg:// mjpeg:// file:// v4l2:// .RE The connection string is camera specific. It is usually the same as what other video playing applications would use to connect to the camera stream. .RE .RE .TP .B netcam_params .RS .nf Values: User specified string Default: Not Defined Description: .fi .RS User specified parameters for the network camera. .RE .RE .TP .B netcam_high_url .RS .nf Values: User specified string Default: None Description: .fi .RS Full connection URL string to use to connect to a high resolution network camera. The URL must provide a stream of images instead of only a static image. The following prefixes are recognized .RS rtsp:// rtmp:// .RE The connection string is camera specific. It is usually the same as what other video playing applications would use to connect to the camera stream. Motion currently only supports basic authentication for the cameras. Digest is not currently supported. Basic authentication can be specified in the URL or via the netcam_userpass option. .RE .RE .TP .B netcam_high_params .RS .nf Values: User specified string Default: Not Defined Description: .fi .RS User specified parameters for the network camera. .RE .RE .TP .B netcam_userpass .RS .nf Values: User specified string Default: Not Defined Description: .fi .RS The user id and password required to access the network camera string. Only basic authentication is supported at this time. Format is in user:password format when both a user name and password are required. .RE .RE .TP .B mmalcam_name .RS .nf Values: User specified string Default: Not defined Description: .fi .RS Name of camera to use if you are using a camera accessed through OpenMax/MMAL. This value is used to specify the use of the PI camera. The typical value for the PI camera is vc.ril.camera .RE .RE .TP .B mmalcam_params .RS .nf Values: User specified string Default: Not defined Description: .fi .RS Camera configuration options to use for the OpenMax/MMAL camera. See the raspivid/raspistill tool documentation for full list of options. Typical value for the PI camera is -hf .RE .RE .TP .B width .RS .nf Values: Dependent upon video device Default: 640 Description: .fi .RS Image width in pixels for the video device. .RE .RE .TP .B height .RS .nf Values: Dependent upon video device Default: 480 Description: .fi .RS Image height in pixels for the video device .RE .RE .TP .B framerate .RS .nf Values: 2 - 100 Default: 15 Description: .fi .RS The maximum number of frames to capture in 1 second. The default of 100 will normally be limited by the capabilities of the video device. Typical video devices have a maximum rate of 30. .RE .RE .TP .B minimum_frame_time .RS .nf Values: 0 to unlimited Default: 0 Description: .fi .RS The minimum time in seconds between capturing picture frames from the camera. The default of 0 disables this option and relies upon the capture rate of the camera. This option is used when you want to capture images at a rate lower than 2 per second. .RE .RE .TP .B rotate .RS .nf Values: 0, 90, 180, 270 Default: 0 Description: .fi .RS Rotate image this number of degrees. The rotation affects all saved images as well as movies. .RE .RE .TP .B flip_axis .RS .nf Values: none, v, h Default: none Description: .fi .RS Flip the images vertically or horizontally. The flip affects all saved images as well as movies. .RE .RE .TP .B locate_motion_mode .RS .nf Values: on/off/preview Default: off Description: .fi .RS When specified as 'on', locate and draw a box around the moving object. When set 'preview', only draw a box in preview_shot pictures. .RE .RE .TP .B locate_motion_style .RS .nf Values: .RS .fi box : Draw traditional box around the part of the image generating the motion .nf .fi redbox : Draw a red box around the part of the image generating the motion .nf .fi cross : Draw a cross on the part of the image generating the motion .nf .fi redcross : Draw a red cross on the part of the image generating the motion .nf .RE Default: box Description: .fi .RS When locate_motion_mode is enable, this option specifies how the motion will be indicated on the image. .RE .RE .TP .B text_left .RS .nf Values: User specified string Default: Not defined Description: .fi .RS Text to place in lower left corner of image. Format specifiers follow C function strftime(3) .RE .RE .TP .B text_right .RS .nf Values: User specified string Default: %Y-%m-%d\\n%T Description: .fi .RS Text to place in lower right corner of image. Format specifiers follow C function strftime(3) .RE .RE .TP .B text_changes .RS .nf Values: on/off Default: off Description: .fi .RS When specified, draw the number of changed pixed on the images. This option will normally be set to off except when you setup and adjust the motion settings. The text is placed in upper right corner of the image. .RE .RE .TP .B text_scale .RS .nf Values: 1 to 10 Default: 1 Description: .fi .RS The scale at which to draw text over the image. .RE .RE .TP .B text_event .RS .nf Values: User specified string Default: %Y%m%d%H%M%S Description: .fi .RS Define the value of the special event conversion specifier %C. The user can use any conversion specifier in this option except %C. Date and time values are from the timestamp of the first image in the current event. The %C can be used filenames and text_left/right for creating a unique identifier for each event. .RE .RE .TP .B emulate_motion .RS .nf Values: on/off Default: off Description: .fi .RS Always save images even if there was no motion. .RE .RE .TP .B pause .RS .nf Values: on/off Default: off Description: .fi .RS When Motion is started, pause the motion detection. .RE .RE .TP .B threshold .RS .nf Values: 1 to unlimited Default: 1500 Description: .fi .RS Threshold for number of changed pixels in an image that triggers motion detection .RE .RE .TP .B threshold_maximum .RS .nf Values: 0, 1 to unlimited Default: 0 Description: .fi .RS Maximum of changed pixels in an image that triggers motion detection. A value of zero disables this option. .RE .RE .TP .B threshold_tune .RS .nf Values: on/off Default: off Description: .fi .RS Automatically tune the threshold down if possible. .RE .RE .TP .B noise_level .RS .nf Values: 1 to unlimited Default: 32 Description: .fi .RS Noise threshold for the motion detection. .RE .RE .TP .B noise_tune .RS .nf Values: on/off Default: on Description: .fi .RS Automatically tune the noise threshold .RE .RE .TP .B despeckle_filter .RS .nf Values: .RS e/E : erode d/D : dilate l : label .RE Default: Not defined Description: .fi .RS Despeckle motion image using (e)rode or (d)ilate or (l)abel. The recommended value is EedDl. Any combination (and number of) of E, e, d, and D is valid. (l)abeling must only be used once and the 'l' must be the last letter. Comment out to disable .RE .RE .TP .B area_detect .RS .nf Values: 1 to 9 Default: Not Defined Description: .fi .RS When motion is detected in the predefined areas indicated below, trigger the script indicated by the on_area_detected. The trigger is only activated once during an event. one or more areas can be specified with this option. Note that this option is only used to trigger the indicated script. It does not limit all motion detection events to only the area indicated. .RS Image Areas .RE .RS 123 .RE .RS 456 .RE .RS 789 .RE .RE .RE .TP .B mask_file .RS .nf Values: User specified string Default: Not defined Description: .fi .RS When particular area should be ignored for motion, it can be accomplished using a PGM mask file. The PGM mask file is a specially constructed mask file that allows the user to indicate the areas for which motion should be monitored. This option specifies the full path and name for the mask file. .RE .RE .TP .B mask_privacy .RS .nf Values: User specified string Default: Not defined Description: .fi .RS The PGM mask file is a specially constructed mask file that allows the user to indicate the areas to remove from all images. This option specifies the full path and name for the privacy mask file. .RE .RE .TP .B smart_mask_speed .RS .nf Values: 0 to 10 Default: 0 (off) Description: .fi .RS Speed of mask changes when creating a dynamic mask file. .RE .RE .TP .B lightswitch_percent .RS .nf Values: 0 to 100 Default: 0 Description: .fi .RS Ignore sudden massive light intensity changes. Triggers when the percentage of the picture area that changed intensity is greater than this value. .RE .RE .TP .B lightswitch_frames .RS .nf Values: 1 to 1000 Default: 5 Description: .fi .RS Number of frames to ignore when lightswitch has been triggered. .RE .RE .TP .B minimum_motion_frames .RS .nf Values: 1 to unlimited Default: 1 Description: .fi .RS The minimum number of picture frames in a row that must contain motion before a event is triggered. The default of 1 means that all motion is detected. The recommended range is 1 to 5. .RE .RE .TP .B event_gap .RS .nf Values: -1 to unlimited Default: 60 Description: .fi .RS The number of seconds of no motion that triggers the end of an event. An event is defined as a series of motion images taken within a short timeframe. The recommended value is 60 seconds. The value -1 is allowed and disables events causing all Motion to be written to one single movie file and no pre_capture. If set to 0, motion is running in gapless mode. Movies don't have gaps anymore. An event ends right after no more motion is detected and post_capture is over. .RE .RE .TP .B pre_capture .RS .nf Values: 0 to unlimited Default: 0 Description: .fi .RS The number of pre-captured (buffered) pictures from before motion was detected that will be output upon motion detection. The recommended range is 0 to 5. It is not recommended to use large values since it will cause Motion to skip frames. To smooth movies use larger values of post_capture instead. .RE .RE .TP .B post_capture .RS .nf Values: 0 to unlimited Default: 0 Description: .fi .RS Number of frames to capture after motion is no longer detected. .RE .RE .TP .B Script Options .RS .nf on_event_start, on_event_end, on_picture_save on_motion_detected, on_area_detected, on_movie_start on_movie_end, on_camera_lost, on_camera_found .fi .RE .RS .nf Values: User defined string Default: Not defined Description: .fi .RS Specify the full path and file name for the script to execute when the indicated event occurs. When a file name is required for the script, append a %f to the script string. .RE .RE .TP .B picture_output .RS .nf Values: on, off, first, best, center Default: off Description: .fi .RS Output pictures when motion is detected. When set to 'first', only the first picture of an event is saved. Picture with most motion of an event is saved when set to 'best'. Picture with motion nearest center of picture is saved when set to 'center'. Can be used as preview shot for the corresponding movie. .RE .RE .TP .B picture_output_motion .RS .nf Values: on/off Default: off Description: .fi .RS Output pictures with only the pixels moving object (ghost images) .RE .RE .TP .B picture_type .RS .nf Values: jpeg/ppm/webp/grey Default: jpeg Description: .fi .RS The file type of output images .RE .RE .TP .B picture_quality .RS .nf Values: 1 to 100 Default: 75 Description: .fi .RS The quality (in percent) to be used by the jpeg and webp compression .RE .RE .TP .B picture_exif .RS .nf Values: User specified string Default: Not defined Description: .fi .RS Text to include in a JPEG EXIF comment .RE .RE .TP .B picture_filename .RS .nf Values: User specified string Default: %v-%Y%m%d%H%M%S-%q Description: .fi .RS The file path for motion triggered images (jpeg, ppm or webp) relative to target_dir. The file extension .jpg, .ppm or .webp is automatically added so do not include this. Set to 'preview' together with best-preview feature enables special naming convention for preview shots. This option accepts the conversion specifiers included at the end of this manual. .RE .RE .TP .B snapshot_interval .RS .nf Values: 0 to unlimited Default: 0 Description: .fi .RS When specified as 0, the snapshot feature is disabled. When a value is specified, the value indicates the number of seconds between snapshots. .RE .RE .TP .B snapshot_filename .RS .nf Values: User specified string Default: %v-%Y%m%d%H%M%S-snapshot Description: .fi .RS The file path for snapshots relative to target_dir. The file extension .jpg, .ppm or .webp is automatically added so do not include this. A symbolic link called lastsnap.jpg created in the target_dir will always point to the latest snapshot, unless snapshot_filename is exactly 'lastsnap' This option accepts the conversion specifiers included at the end of this manual. .RE .RE .TP .B movie_output .RS .nf Values: on/off Default: on Description: .fi .RS Use ffmpeg to encode movies of the motion. .RE .RE .TP .B movie_output_motion .RS .nf Values: on/off Default: off Description: .fi .RS Use ffmpeg to encode movies with only the pixels moving object (ghost images) .RE .RE .TP .B movie_max_time .RS .nf Values: 0 to unlimited Default: 120 Description: .fi .RS Maximum length in seconds of a movie. When value is exceeded a new movie file is created. The value of 0 means that there is no limit. .RE .RE .TP .B movie_bps .RS .nf Values: 0 to unlimited Default: 400000 Description: .fi .RS Bitrate to be used by the ffmpeg encoder. This option is ignored if movie_quality is not 0. .RE .RE .TP .B movie_quality .RS .nf Values: 0 to 100 Default: 60 Description: .fi .RS Enable and define the variable bitrate for the ffmpeg encoder. movie_bps is ignored if variable bitrate is enabled. When specified as 0, use the fixed bitrate defined by movie_bps. When defined as 1 - 100 varies the quality of the movie. A value of 1 is worst quality versus a value of 100 is best quality. .RE .RE .TP .B movie_codec .RS .nf Values: .RS Motion videos: .RS mpeg4 - Creates .avi file msmpeg4 - Creates .avi file swf - Flash film with extension .swf flv - Flash video with extension .flv ffv1 - FF video codec 1 for Lossless Encoding mov - QuickTime mp4 - MPEG-4 Part 14 H264 encoding mkv - Matroska H264 encoding hevc - H.265 / HEVC (High Efficiency Video Coding) .RE .RE Default: mkv Description: .fi .RS For regular motion videos, the container/codec must be available in the ffmpeg installed on the computer. .RE .RE .TP .B movie_duplicate_frames .RS .nf Values: on/off Default: off Description: .fi .RS When creating videos, should frames be duplicated in order to keep up with the requested frames per second .RE .RE .TP .B movie_passthrough .RS .nf Values: on/off Default: off Description: .fi .RS When using a rtsp camera, make movies without decoding the stream. .RE .RE .TP .B movie_filename .RS .nf Values: User specified string Default: %v-%Y%m%d%H%M%S Description: .fi .RS File path for motion triggered ffmpeg films (movies) relative to target_dir. The extensions(.swf, .avi, etc) are automatically added so do not include them This option accepts the conversion specifiers included at the end of this manual. .RE .RE .TP .B movie_extpipe_use .RS .nf Values: on/off Default: off Description: .fi .RS Use the external pipe in order to encode videos. This is a replacement option for the FFMPEG builtin encoder for movie_output only. The options movie_filename and timelapse_filename are also used from the ffmpeg feature .RE .RE .TP .B movie_extpipe .RS .nf Values: User specified string Default: Not defined Description: .fi .RS Command line string to receive and process a pipe of images to encode. Generally, use '-' for STDIN .RE .RE .TP .B timelapse_interval .RS .nf Values: 0 to unlimited Default: 0 Description: .fi .RS Number of seconds between frame captures for a timelapse movie. Specify 0 to disable the timelapse. .RE .RE .TP .B timelapse_mode .RS .nf Values: .RS hourly .br daily .br weekly-sunday .br weekly-monday .br monthly .br manual .RE Default: daily Description: .fi .RS File rollover mode for the timelapse video. .RE .RE .TP .B timelapse_fps .RS .nf Values: 0 to unlimited Default: 30 Description: .fi .RS Frames per second used for playback of the timelapse video. .RE .RE .TP .B timelapse_codec .RS .nf Values: .RS mpg - Creates mpg file with mpeg-2 encoding. mpeg4 - Creates avi file with the default encoding. .RE Default: mpg Description: .fi .RS For mpg timelapse videos, if motion is shutdown and restarted, new pics will be appended to any previously created file with name indicated for timelapse. For mpeg4 timelapse videos, if motion is shutdown and restarted, new pics will create a new file with the name indicated for timelapse. .RE .RE .TP .B timelapse_filename .RS .nf Values: User specified string Default: %Y%m%d-timelapse Description: .fi .RS File path for timelapse movies relative to target_dir. The file extensions(.mpg .avi) are automatically added so do not include them This option accepts the conversion specifiers included at the end of this manual. .RE .RE .TP .B video_pipe .RS .nf Values: User specified string Default: Not Defined Description: .fi .RS Output images to a video4linux loopback device. .RE .RE .TP .B video_pipe_motion .RS .nf Values: User specified string Default: Not Defined Description: .fi .RS Output motion images to a video4linux loopback device. .RE .RE .TP .B webcontrol_port .RS .nf Values: 0 to maximum port number Default: 0 Description: .fi .RS Port number for the web control / preview page. .RE .RE .TP .B webcontrol_ipv6 .RS .nf Values: on/off Default: off Description: .fi .RS Listen to IPv6 localhost instead of IPv4. This option is also applicable for all streams. .RE .RE .TP .B webcontrol_localhost .RS .nf Values: on/off Default: on Description: .fi .RS Restrict control connections to localhost only .RE .RE .TP .B webcontrol_parms .RS .nf Values: .RS 0 = No parameters available to change on web control 1 = Limited list of parameters available to change 2 = Advanced list of parameters (usually requires restart to become effective) 3 = Restricted list of parameters (User IDs, passwords, commands to execute, etc) .RE Default: 0 Description: .fi .RS The type of parameters that are able to be modified via the web interface. This parameter can never be modified via the web interface and must be specified directly in the configuration file. .RE .RE .TP .B webcontrol_interface .RS .nf Values: 0-2 Default: 0 Description: .fi .RS Specified the web control interface type. 0=css, 1=text, 2=legacy .RE .RE .TP .B webcontrol_auth_method .RS .nf Values: .RS 0 = disabled 1 = Basic authentication 2 = MD5 digest (the safer authentication) .RE Default: 0 Description: .fi .RS The authentication method to use for the webcontrol. .RE .RE .TP .B webcontrol_authentication .RS .nf Values: User specified string Default: Not defined Description: .fi .RS The username and password to use for authentication of the webcontrol. The format is Username:Password .RE .RE .TP .B webcontrol_tls .RS .nf Values: on/off Default: off Description: .fi .RS When specified as on, use SSL/TLS for the webcontrol. .RE .RE .TP .B webcontrol_cert .RS .nf Values: User specified string Default: Not defined Description: .fi .RS The full path to the SSL certification file for webcontrol .RE .RE .TP .B webcontrol_key .RS .nf Values: User specified string Default: Not defined Description: .fi .RS The full path to the SSL key file for webcontrol .RE .RE .TP .B webcontrol_header_params .RS .nf Values: User specified string Default: Not defined Description: .fi .RS The comma separated header=value pairs to use for the webcontrol responses. .RE .RE .TP .B webcontrol_lock_attempts .RS .nf Values: integer Default: 5 Description: .fi .RS The number of failed authentication attempts before IP is locked out. .RE .RE .TP .B webcontrol_lock_minutes .RS .nf Values: integer Default: 5 Description: .fi .RS The number of minutes a failed authentication IP is locked out. .RE .RE .TP .B webcontrol_lock_max_ips .RS .nf Values: integer Default: 5 Description: .fi .RS The maximum number of concurrent IPs that can be locked out. .RE .RE .TP .B stream_port .RS .nf Values: 0 to port number limit Default: 0 Description: .fi .RS This option is the port number that the mini-http server listens on for streams of the pictures. .RE .RE .TP .B stream_localhost .RS .nf Values: on/off Default: on Description: .fi .RS Restrict stream connections to localhost only .RE .RE .TP .B stream_auth_method .RS .nf Values: .RS 0 = disabled 1 = Basic authentication 2 = MD5 digest (the safer authentication) .RE Default: 0 Description: .fi .RS The authentication method to use for viewing the stream. .RE .RE .TP .B stream_authentication .RS .nf Values: User specified string Default: Not defined Description: .fi .RS The username and password to use for authentication of the stream. The format is Username:Password .RE .RE .TP .B stream_tls .RS .nf Values: on/off Default: off Description: .fi .RS When specified as on, use SSL/TLS for the stream port. .RE .RE .TP .B stream_header_params .RS .nf Values: User specified string Default: Not defined Description: .fi .RS The comma separated header=value pairs to send for the stream responses. .RE .RE .TP .B stream_preview_scale .RS .nf Values: 1 to 100 Default: 25 Description: .fi .RS This defines what percentage the stream image should be scaled to for the preview page .RE .RE .TP .B stream_preview_newline .RS .nf Values: on/off Default: off Description: .fi .RS When the image is put on the preview page, should the image start on a new line. This option allows the user to specify whether the preview images should be side by side or stacked on the page. .RE .RE .TP .B stream_preview_method .RS .nf Values: 0 to 2 Default: 0 Description: .fi .RS Method to display images on webcontrol page. 0=Full, 1=Substream, 2=Static .RE .RE .TP .B stream_quality .RS .nf Values: 1 to 100 Default: 50 Description: .fi .RS The quality in percent for the jpg images streamed. .RE .RE .TP .B stream_grey .RS .nf Values: on/off Default: off Description: .fi .RS Send the live stream of the camera in grey (black and white) instead of color. .RE .RE .TP .B stream_maxrate .RS .nf Values: 1 to unlimited Default: 1 Description: .fi .RS Maximum frame rate to send to stream .RE .RE .TP .B stream_motion .RS .nf Values: on,off Default: off Description: .fi .RS Limit stream to 1 fps when no motion is being detected. .RE .RE .TP .B database_type .RS .nf Values: mysql, mariadb, postgresql, sqlite3 Default: Not defined Description: .fi .RS The type of database being used. .RE .RE .TP .B database_dbname .RS .nf Values: User defined string Default: Not defined Description: .fi .RS The name of the database being used (dbname). For SQLite3, the full path to the database. .RE .RE .TP .B database_host .RS .nf Values: User defined string Default: localhost Description: .fi .RS The hostname, DNS name, or IP address at which the database is running. Optionally for PostgreSQL, full path of the local directory containing its Unix domain pipe. For SQLite3, ignored. .RE .RE .TP .B database_port .RS .nf Values: 0 to maximum port number Default: Not defined Description: .fi .RS TCP port number used for database access. For SQLite3, ignored. Default ports used by DBMSs: MySQL & MariaDB, 3306; PostgreSQL, 5432. .RE .RE .TP .B database_user .RS .nf Values: User defined string Default: Not Defined Description: .fi .RS The username to access the database. For SQLite3, ignored. .RE .RE .TP .B database_password .RS .nf Values: User defined string Default: Not Defined Description: .fi .RS The database password for the user to access the database. For SQLite3, ignored. .RE .RE .TP .B database_busy_timeout .RS .nf Values: 0 to unlimited Default: 0 Description: .fi .RS SQLite3 only: database wait time in milliseconds for locked database to be unlocked before returning database locked error .RE .RE .TP .B sql_log_picture .RS .nf Values: on/off Default: off Description: .fi .RS Log to the database when creating motion triggered picture file .RE .RE .TP .B sql_log_snapshot .RS .nf Values: on/off Default: off Description: .fi .RS Log to the database when creating a snapshot image file .RE .RE .TP .B sql_log_movie .RS .nf Values: on/off Default: off Description: .fi .RS Log to the database when creating motion triggered movie file .RE .RE .TP .B sql_log_timelapse .RS .nf Values: on/off Default: off Description: .fi .RS Log to the database when creating timelapse movies file .RE .RE .TP .B sql_query .RS .nf Values: User defined string Default: Not defined Description: .fi .RS SQL statement to execute when Motion saves an image file or begins recording a movie and the corresponding file type's sql_log_* configuration option is set on. Use same conversion specifiers as for text features. Additional special conversion specifiers are: .RS %n = the number representing the file_type %f = filename with full path .RE Sample table set up (not sql_query): .RS Mysql: CREATE TABLE security (camera INTEGER NOT NULL, filename CHAR(80) NOT NULL, frame INTEGER, file_type INTEGER NOT NULL, time_stamp DATETIME NOT NULL, text_event CHAR(255)); .RE .RS Postgresql: CREATE TABLE security (camera INTEGER NOT NULL, filename VARCHAR NOT NULL, frame INTEGER, file_type INTEGER NOT NULL, time_stamp TIMESTAMP NOT NULL, text_event VARCHAR); .RE Sample sql_query .RS INSERT INTO security(camera, filename, frame, file_type, time_stamp, text_event) VALUES(%t, '%f', %q, %n, '%Y-%m-%d %T', '%C') .RE .RE .RE .TP .B sql_query_start .RS .nf Values: User defined string Default: Not defined Description: .fi .RS SQL statement to execute at the start of a motion event. When the related table schema (and, for PostgreSQL, a RETURNING clause included in this statement) provide for it, the database generates a table-unique event ID that is returned and substituted for the %{dbeventid} conversion specifier. When no valid value is returned, %{dbeventid} is replaced by zero. .RE .RE .RE .TP .B sql_query_stop .RS .nf Values: User defined string Default: Not defined Description: .fi .RS SQL statement to execute upon closure of a motion event movie or timelapse movie file, provided the corresponding file type's sql_log_* configuration option is set on. .RE .RE .RE .TP .B track_type .RS .nf Values: .RS 0 = none 1 = stepper 2 = iomojo 3 = pwc 4 = generic 5 = uvcvideo 6 = servo .RE Default: 0 Description: .fi .RS This option specifies the type of tracker. The generic type enables the definition of motion center and motion size to be used with the conversion specifiers for options like on_motion_detected .RE .RE .TP .B track_auto .RS .nf Values: on/off Default: off Description: .fi .RS Enables/disables the automatic tracking. .RE .RE .TP .B track_port .RS .nf Values: User specified string Default: Not defined Description: .fi .RS The serial port of the motor. For example /dev/ttyS0 .RE .RE .TP .B Tracking options .RS .nf track_motorx, track_motorx_reverse, track_motory, track_motory_reverse track_maxx, track_minx, track_maxy, track_miny, track_homex, track_homey track_iomojo_id, track_step_angle_x, track_step_angle_y, track_move_wait track_speed, track_stepsize .fi .RE .RS .nf Values: device dependent Default: 0 Description: .fi .RS These options specify the parameters for cameras with tracking capabilities. .RE .RE .TP .B track_generic_move .RS .nf Values: User specified string Default: Not defined Description: .fi .RS Full path and file name for the script to execute to move a camera in generic tracking mode. .RE .RE .SH SIGNALS Motion responds to the following signals: .TP .B SIGHUP The config file will be reread. .TP .B SIGTERM If needed motion will create an movie file of the last event and exit .TP .B SIGUSR1 Motion will create an movie file of the current event. .SH NOTES .TP .B Snapshot A snapshot is a picture taken at regular intervals independently of any movement in the picture. .TP .B Motion image A "motion" image/movie shows the pixels that have actually changed during the last frames. These pictures are not very useful for normal presentation to the public but they are quite useful for testing and tuning and making mask files as you can see exactly where motion sees something moving. Motion is shown in greytones. If labelling is enabled the largest area is marked as blue. Smart mask is shown in read. .TP .B Normal image A "normal" image is the real image taken by the camera with text overlayed. .TP .B Cameras and config files If Motion was invoked with command line option \-c pathname Motion will expect the config file to be as specified. When you specify the config file on the command line with \-c you can call it anything. .br If you do not specify \-c or the filename you give Motion does not exist, Motion will search for the configuration file called 'motion.conf' in the following order: .br 1. Current directory from where motion was invoked .br 2. Then in a directory called '.motion' in the current users home directory (shell environment variable $HOME). E.g. /home/goofy/.motion/motion.conf .br 3. The motion/ subdirectory inside the directory defined by the \-\-sysconfdir=DIR when running .configure during installation of Motion (If this option was not defined the default is /usr/local/etc/) .br If you have write access to /usr/local/etc/motion then the editor recommends having only one motion.conf file in the default /usr/local/etc/motion directory. .br Motion has a configuration file in the distribution package called motion-dist.conf. When you run 'make install' this files gets copied to the /usr/local/etc/motion directory. .br The configuration file needs to be renamed from motion-dist.conf to motion.conf. The original file is called motion-dist.conf so that your perfectly working motion.conf file does not accidentally get overwritten when you re-install or upgrade to a newer version of Motion. .br If you have more than one camera you should not try and invoke Motion more times. Motion is made to work with more than one camera in a very elegant way and the way to do it is to create a number of camera config files. Motion will then create an extra thread of itself for each camera. If you only have one camera you only need the motion.conf file. The minute you have two or more cameras you must have one camera config file per camera besides the motion.conf file. .br So if you have for example two cameras you need motion.conf and two camera config files. Total of 3 config files. .br An option that is common to all cameras can be placed in motion.conf. (You can also put all parameters in the camera files but that makes a lot of editing when you change a common thing). .br An option that is unique to a camera must be defined in each camera file. .br The first camera is defined in the first camera file called from motion.conf. The 2nd camera is defined in the 2nd camera file called from motion.conf etc. .br Any option defined in motion.conf will be used for all cameras except for the cameras in which the same option is defined in a camera config file. .br Motion reads its configuration parameters in the following sequence. If the same parameter exists more than one place the last one read wins. .br 1. Motion reads the configuration file motion.conf from the beginning of the file going down line by line. .br 2. If the option "camera" is defined in motion.conf, the camera configuration file(s) is/(are) read. .br 3. Motion continues reading the rest of the motion.conf file. Any options from here will overrule the same option previously defines in a camera config file. .br 4. Motion reads the command line option again overruling any previously defined options. .br So always call the camera config files in the end of the motion.conf file. If you define options in motion.conf AFTER the camera file calls, the same options in the camera files will never be used. So always put the camera file call at the end of motion.conf. .br If motion is built without specific features such as ffmpeg, mysql etc it will ignore the options that belongs to these features. You do not have to remove them or comment them out. .br If you run the http control command http://host:port/0/config/writeyes, motion will overwrite motion.conf and all the camera.conf files by autogenerated config files neatly formatted and only with the features included that Motion was built with. If you later re-build Motion with more features or upgrade to a new version, you can use your old config files, run the motion.conf.write command, and you will have new config files with the new options included all set to their default values. This makes upgrading very easy to do. .TP .B Conversion Specifiers for Advanced Filename and Text Features The table below shows all the supported Conversion Specifiers you can use in the options text_left, text_right, snapshot_filename, jpeg_filename, ffmpeg_filename, timelapse_filename, on_event_start, on_event_end, on_picture_save, on_movie_start, on_movie_end, and on_motion_detected. .br In text_left and text_right you can additionally use '\\n' for new line. .TP .B %a The abbreviated weekday name according to the current locale. .TP .B %A The full weekday name according to the current locale. .TP .B %b The abbreviated month name according to the current locale. .TP .B %B The full month name according to the current locale. .TP .B %c The preferred date and time representation for the current locale. .TP .B %C Text defined by the text_event feature .TP .B %d The day of the month as a decimal number (range 01 to 31). .TP .B %D Number of pixels detected as Motion. If labelling is enabled the number is the number of pixels in the largest labelled motion area. .TP .B %E Modifier: use alternative format, see below. .TP .B %f File name - used in the on_picture_save, on_movie_start, on_movie_end, and sql_query features. .TP .B %F Equivalent to %Y-%m-%d (the ISO 8601 date format). .TP .B %h The height of the image. .TP .B %H The hour as a decimal number using a 24-hour clock (range 00 to 23). .TP .B %i Width of the rectangle containing the motion pixels (the rectangle that is shown on the image when locate is on). .TP .B %I The hour as a decimal number using a 12-hour clock (range 01 to 12). .TP .B %j The day of the year as a decimal number (range 001 to 366). .TP .B %J Height of the rectangle containing the motion pixels (the rectangle that is shown on the image when locate is on). .TP .B %k The hour (24-hour clock) as a decimal number (range 0 to 23); single digits are preceded by a blank. (See also %H.) .TP .B %K X coordinate in pixels of the center point of motion. Origin is upper left corner. .TP .B %l The hour (12-hour clock) as a decimal number (range 1 to 12); single digits are preceded by a blank. (See also %I.) .TP .B %L Y coordinate in pixels of the center point of motion. Origin is upper left corner and number is positive moving downwards (I may change this soon). .TP .B %m The month as a decimal number (range 01 to 12). .TP .B %M The minute as a decimal number (range 00 to 59). .TP .B %n Filetype as used in the on_picture_save, on_movie_start, on_movie_end, and sql_query features. .TP .B %N Noise level. .TP .B %o Threshold. The number of detected pixels required to trigger motion. When threshold_tune is 'on' this can be used to show the current tuned value of threshold. .TP .B %p Either 'AM' or 'PM' according to the given time value, or the corresponding strings for the current locale. Noon is treated as `pm' and midnight as `am'. .TP .B %P Like %p but in lowercase: `am' or `pm' or a corresponding string for the current locale. .TP .B %q Picture frame number within current second. For jpeg filenames this should always be included in the filename if you save more then 1 picture per second to ensure unique filenames. It is not needed in filenames for mpegs. .TP .B %Q Number of detected labels found by the despeckle feature .TP .B %r The time in a.m. or p.m. notation. .TP .B %R The time in 24-hour notation (%H:%M). .TP .B %s The number of seconds since the Epoch, i.e., since 1970-01-01 00:00:00 UTC. .TP .B %S The second as a decimal number (range 00 to 61). .TP .B %t Camera ID number .TP .B %T The time in 24-hour notation (%H:%M:%S). .TP .B %u The day of the week as a decimal, range 1 to 7, Monday being 1. See also %w. .TP .B %U The week number of the current year as a decimal number, range 00 to 53, starting with the first Sunday as the first day of week 01. See also %V and %W. .TP .B %v Event number. An event is a series of motion detections happening with less than 'gap' seconds between them. .TP .B %V The ISO 8601:1988 week number of the current year as a decimal number, range 01 to 53, where week 1 is the first week that has at least 4 days in the current year, and with Monday as the first day of the week. See also %U and %W. .TP .B %w The day of the week as a decimal, range 0 to 6, Sunday being 0. See also %u. .TP .B %W The week number of the current year as a decimal number, range 00 to 53, starting with the first Monday as the first day of week 01. .TP .B %x The preferred date representation for the current locale without the time. .TP .B %X The preferred time representation for the current locale without the date. .TP .B %y The year as a decimal number without a century (range 00 to 99). .TP .B %Y The year as a decimal number including the century. .TP .B %z The time-zone as hour offset from GMT. .TP .B %Z The time zone or name or abbreviation. .TP .B %$ The camera name. .TP .B %{host} The computer host name .TP .B %{fps} The frame per seconds. .TP .B %{dbeventid} The id number returned from mysql_insert_id. .TP .B %{ver} The version number of Motion. .TP .B More information Motion homepage: https://motion-project.github.io/ Motion Guide (user and installation guide): .br /usr/share/doc/motion/motion_guide.html .SH AUTHORS Jeroen Vreeken (pe1rxq@amsat.org), Folkert van Heusden, Kenneth Lavrsen (kenneth@lavrsen.dk), Juan Angulo Moreno , the motion-project team, and many others motion-release-4.6.0/po/000077500000000000000000000000001452402535500150675ustar00rootroot00000000000000motion-release-4.6.0/po/LINGUAS000066400000000000000000000000541452402535500161130ustar00rootroot00000000000000da de es fi fr it ja ko li nl no pt sk sv zhmotion-release-4.6.0/po/Makevars000066400000000000000000000065551452402535500165760ustar00rootroot00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ --add-location=file # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Free Software Foundation, Inc. # This tells whether or not to prepend "GNU " prefix to the package # name that gets inserted into the header of the $(DOMAIN).pot file. # Possible values are "yes", "no", or empty. If it is empty, try to # detect it automatically by scanning the files in $(top_srcdir) for # "GNU packagename" string. PACKAGE_GNU = # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = https://motion-project.github.io # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = # This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt' # context. Possible values are "yes" and "no". Set this to yes if the # package uses functions taking also a message context, like pgettext(), or # if in $(XGETTEXT_OPTIONS) you define keywords with a context argument. USE_MSGCTXT = no # These options get passed to msgmerge. # Useful options are in particular: # --previous to keep previous msgids of translated messages, # --quiet to reduce the verbosity. MSGMERGE_OPTIONS = --quiet # These options get passed to msginit. # If you want to disable line wrapping when writing PO files, add # --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and # MSGINIT_OPTIONS. MSGINIT_OPTIONS = # This tells whether or not to regenerate a PO file when $(DOMAIN).pot # has changed. Possible values are "yes" and "no". Set this to no if # the POT file is checked in the repository and the version control # program ignores timestamps. PO_DEPENDS_ON_POT = no # This tells whether or not to forcibly update $(DOMAIN).pot and # regenerate PO files on "make dist". Possible values are "yes" and # "no". Set this to no if the POT file and PO files are maintained # externally. DIST_DEPENDS_ON_UPDATE_PO = yes motion-release-4.6.0/po/POTFILES.in000066400000000000000000000007141452402535500166460ustar00rootroot00000000000000# main sources src/alg.c src/conf.c src/dbse.c src/draw.c src/event.c src/ffmpeg.c src/jpegutils.c src/logger.c src/mmalcam.c src/motion.c src/netcam.c src/netcam_ftp.c src/netcam_http.c src/netcam_jpeg.c src/netcam_rtsp.c src/netcam_wget.c src/picture.c src/rotate.c src/track.c src/translate.c src/util.c src/video_bktr.c src/video_common.c src/video_loopback.c src/video_v4l2.c src/webu.c src/webu_html.c src/webu_status.c src/webu_stream.c src/webu_text.c motion-release-4.6.0/po/da.po000066400000000000000000003202251452402535500160170ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:31-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "%s efter version %s" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "Ukendt konfigurationsindstilling \" %s \"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "Skrivning af konfigurationsfil til %s" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "Configfile %s ikke fundet - forsøger standardindstillinger." #: src/conf.c msgid "Error getcwd" msgstr "Fejl getcwd" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "kunne ikke Ã¥bne configfile %s" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "Ugyldigt filnavn %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "Behandler trÃ¥d 0 - konfigurationsfil %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "Ingen konfigurationsfil til behandling, ved hjælp af standardværdier" #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "Skrivning af konfigurationsparametre fra alle filer ( %d):" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "TrÃ¥d %d - Konfig-fil: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s " #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "Behandler konfigurationsfil %s" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "Kamerakatalogkonfiguration %s ikke fundet" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "Kamerakonfigur %s findes ikke" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "Behandler kamerakonfigur %s" #: src/conf.c msgid "daemon" msgstr "daemon" #: src/conf.c msgid "setup_mode" msgstr "opsætningstilstand" #: src/conf.c msgid "pid_file" msgstr "pid-fil" #: src/conf.c msgid "log_file" msgstr "logfil" #: src/conf.c msgid "log_level" msgstr "logniveau" #: src/conf.c msgid "log_type" msgstr "log type" #: src/conf.c msgid "quiet" msgstr "rolige" #: src/conf.c msgid "watchdog_tmo" msgstr "vagthund tmo" #: src/conf.c msgid "watchdog_kill" msgstr "vagthund dræbe" #: src/conf.c msgid "native_language" msgstr "modersprog" #: src/conf.c msgid "camera_name" msgstr "kamera navn" #: src/conf.c msgid "camera_id" msgstr "kamera-id" #: src/conf.c msgid "target_dir" msgstr "mÃ¥l dir" #: src/conf.c msgid "video_device" msgstr "videoenhed" #: src/conf.c msgid "video_params" msgstr "video params" #: src/conf.c msgid "auto_brightness" msgstr "automatisk lysstyrke" #: src/conf.c msgid "tuner_device" msgstr "tuner enhed" #: src/conf.c msgid "roundrobin_frames" msgstr "roundrobin rammer" #: src/conf.c msgid "roundrobin_skip" msgstr "roundrobin spring" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "roundrobin switchfilter" #: src/conf.c msgid "netcam_url" msgstr "netcam url" #: src/conf.c msgid "netcam_params" msgstr "netcam params" #: src/conf.c msgid "netcam_high_url" msgstr "netcam høj url" #: src/conf.c msgid "netcam_high_params" msgstr "netcam høje params" #: src/conf.c msgid "netcam_userpass" msgstr "netcam brugerpas" #: src/conf.c msgid "mmalcam_name" msgstr "mmalcam navn" #: src/conf.c msgid "mmalcam_params" msgstr "mmalcam params" #: src/conf.c msgid "width" msgstr "bredde" #: src/conf.c msgid "height" msgstr "højde" #: src/conf.c msgid "framerate" msgstr "framerate" #: src/conf.c msgid "minimum_frame_time" msgstr "minimum billedtid" #: src/conf.c msgid "rotate" msgstr "rotere" #: src/conf.c msgid "flip_axis" msgstr "vend akse" #: src/conf.c msgid "locate_motion_mode" msgstr "find bevægelsestilstand" #: src/conf.c msgid "locate_motion_style" msgstr "find bevægelsestil" #: src/conf.c msgid "text_left" msgstr "tekst tilbage" #: src/conf.c msgid "text_right" msgstr "tekst højre" #: src/conf.c msgid "text_changes" msgstr "tekstændringer" #: src/conf.c msgid "text_scale" msgstr "tekst skala" #: src/conf.c msgid "text_event" msgstr "tekstbegivenhed" #: src/conf.c msgid "emulate_motion" msgstr "emulere bevægelse" #: src/conf.c msgid "pause" msgstr "pause" #: src/conf.c msgid "threshold" msgstr "grænseværdi" #: src/conf.c msgid "threshold_maximum" msgstr "maksimumsgrænse" #: src/conf.c msgid "threshold_tune" msgstr "tærskel melodi" #: src/conf.c msgid "noise_level" msgstr "støjniveau" #: src/conf.c msgid "noise_tune" msgstr "støjindstilling" #: src/conf.c msgid "despeckle_filter" msgstr "fjernelse af filteret" #: src/conf.c msgid "area_detect" msgstr "omrÃ¥de afsløre" #: src/conf.c msgid "mask_file" msgstr "maske fil" #: src/conf.c msgid "mask_privacy" msgstr "maske privatliv" #: src/conf.c msgid "smart_mask_speed" msgstr "smart maskehastighed" #: src/conf.c msgid "lightswitch_percent" msgstr "lyskontakt procent" #: src/conf.c msgid "lightswitch_frames" msgstr "lysskifterammer" #: src/conf.c msgid "minimum_motion_frames" msgstr "minimum bevægelsesrammer" #: src/conf.c msgid "event_gap" msgstr "begivenhedsgap" #: src/conf.c msgid "pre_capture" msgstr "pre capture" #: src/conf.c msgid "post_capture" msgstr "post capture" #: src/conf.c msgid "on_event_start" msgstr "ved begivenhed" #: src/conf.c msgid "on_event_end" msgstr "ved arrangementets afslutning" #: src/conf.c msgid "on_picture_save" msgstr "gem pÃ¥ billedet" #: src/conf.c msgid "on_area_detected" msgstr "pÃ¥ detekteret omrÃ¥de" #: src/conf.c msgid "on_motion_detected" msgstr "pÃ¥ bevægelse detekteret" #: src/conf.c msgid "on_movie_start" msgstr "ved filmstart" #: src/conf.c msgid "on_movie_end" msgstr "i slutningen af ​​filmen" #: src/conf.c msgid "on_camera_lost" msgstr "pÃ¥ kamera mistet" #: src/conf.c msgid "on_camera_found" msgstr "pÃ¥ kamera fundet" #: src/conf.c msgid "picture_output" msgstr "billede output" #: src/conf.c msgid "picture_output_motion" msgstr "billede output bevægelse" #: src/conf.c msgid "picture_type" msgstr "billedtype" #: src/conf.c msgid "picture_quality" msgstr "billedkvalitet" #: src/conf.c msgid "picture_exif" msgstr "billede exif" #: src/conf.c msgid "picture_filename" msgstr "billede filnavn" #: src/conf.c msgid "snapshot_interval" msgstr "snapshot-interval" #: src/conf.c msgid "snapshot_filename" msgstr "snapshot filnavn" #: src/conf.c msgid "movie_output" msgstr "film output" #: src/conf.c msgid "movie_output_motion" msgstr "film output bevægelse" #: src/conf.c msgid "movie_max_time" msgstr "film maks. tid" #: src/conf.c msgid "movie_bps" msgstr "film bps" #: src/conf.c msgid "movie_quality" msgstr "filmkvalitet" #: src/conf.c msgid "movie_codec" msgstr "film codec" #: src/conf.c msgid "movie_duplicate_frames" msgstr "film duplikatrammer" #: src/conf.c msgid "movie_passthrough" msgstr "film gennemstrømning" #: src/conf.c msgid "movie_filename" msgstr "film filnavn" #: src/conf.c msgid "movie_extpipe_use" msgstr "brug af filmekstrapipe" #: src/conf.c msgid "movie_extpipe" msgstr "film extpipe" #: src/conf.c msgid "timelapse_interval" msgstr "tidsinterval" #: src/conf.c msgid "timelapse_mode" msgstr "timelapse-tilstand" #: src/conf.c msgid "timelapse_fps" msgstr "timelapse fps" #: src/conf.c msgid "timelapse_codec" msgstr "timelapse-codec" #: src/conf.c msgid "timelapse_filename" msgstr "timelapse filnavn" #: src/conf.c msgid "video_pipe" msgstr "videorør" #: src/conf.c msgid "video_pipe_motion" msgstr "bevægelse af videorør" #: src/conf.c msgid "webcontrol_port" msgstr "webkontrolport" #: src/conf.c msgid "webcontrol_ipv6" msgstr "webkontrol ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "webkontrol localhost" #: src/conf.c msgid "webcontrol_parms" msgstr "webkontrolparme" #: src/conf.c msgid "webcontrol_interface" msgstr "webkontrolgrænseflade" #: src/conf.c msgid "webcontrol_auth_method" msgstr "metode til godkendelse af webkontrol" #: src/conf.c msgid "webcontrol_authentication" msgstr "godkendelse af webkontrol" #: src/conf.c msgid "webcontrol_tls" msgstr "webkontrol tls" #: src/conf.c msgid "webcontrol_cert" msgstr "webkontrol cert" #: src/conf.c msgid "webcontrol_key" msgstr "webkontrolnøgle" #: src/conf.c msgid "webcontrol_header_params" msgstr "webkontrol header params" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "webkontrol lÃ¥s minutter" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "forsøg pÃ¥ webkontrollÃ¥s" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "webkontrol lÃ¥s max ips" #: src/conf.c msgid "stream_port" msgstr "strømhavn" #: src/conf.c msgid "stream_localhost" msgstr "stream localhost" #: src/conf.c msgid "stream_auth_method" msgstr "stream autorisationsmetode" #: src/conf.c msgid "stream_authentication" msgstr "stream autentificering" #: src/conf.c msgid "stream_tls" msgstr "stream tls" #: src/conf.c msgid "stream_header_params" msgstr "stream header params" #: src/conf.c msgid "stream_preview_scale" msgstr "stream preview-skala" #: src/conf.c msgid "stream_preview_newline" msgstr "stream preview ny linje" #: src/conf.c msgid "stream_preview_method" msgstr "stream preview-metode" #: src/conf.c msgid "stream_quality" msgstr "stream kvalitet" #: src/conf.c msgid "stream_grey" msgstr "strømgrÃ¥" #: src/conf.c msgid "stream_motion" msgstr "stream bevægelse" #: src/conf.c msgid "stream_maxrate" msgstr "stream maksrate" #: src/conf.c msgid "stream_limit" msgstr "strømgrænse" #: src/conf.c msgid "database_type" msgstr "databasetype" #: src/conf.c msgid "database_dbname" msgstr "database dbname" #: src/conf.c msgid "database_host" msgstr "database vært" #: src/conf.c msgid "database_port" msgstr "databaseport" #: src/conf.c msgid "database_user" msgstr "databasebruger" #: src/conf.c msgid "database_password" msgstr "database adgangskode" #: src/conf.c msgid "database_busy_timeout" msgstr "timeout for database optaget" #: src/conf.c msgid "sql_log_picture" msgstr "sql log billede" #: src/conf.c msgid "sql_log_snapshot" msgstr "sql-log-snapshot" #: src/conf.c msgid "sql_log_movie" msgstr "sql logfilm" #: src/conf.c msgid "sql_log_timelapse" msgstr "sql log timelapse" #: src/conf.c msgid "sql_query_start" msgstr "sql forespørgsel start" #: src/conf.c msgid "sql_query_stop" msgstr "sql forespørgsel stop" #: src/conf.c msgid "sql_query" msgstr "sql forespørgsel" #: src/conf.c msgid "track_type" msgstr "spor type" #: src/conf.c msgid "track_auto" msgstr "spore auto" #: src/conf.c msgid "track_port" msgstr "sporport" #: src/conf.c msgid "track_motorx" msgstr "spormotor" #: src/conf.c msgid "track_motorx_reverse" msgstr "spor motorx bagud" #: src/conf.c msgid "track_motory" msgstr "spore motiv" #: src/conf.c msgid "track_motory_reverse" msgstr "spore motory reverse" #: src/conf.c msgid "track_maxx" msgstr "spor maks" #: src/conf.c msgid "track_minx" msgstr "spor minx" #: src/conf.c msgid "track_maxy" msgstr "spor maks" #: src/conf.c msgid "track_miny" msgstr "spore miny" #: src/conf.c msgid "track_homex" msgstr "spore homex" #: src/conf.c msgid "track_homey" msgstr "spore hjemlig" #: src/conf.c msgid "track_iomojo_id" msgstr "spor iomojo id" #: src/conf.c msgid "track_step_angle_x" msgstr "spor trin vinkel x" #: src/conf.c msgid "track_step_angle_y" msgstr "spor trin vinkel y" #: src/conf.c msgid "track_move_wait" msgstr "spor flyt vent" #: src/conf.c msgid "track_speed" msgstr "sporhastighed" #: src/conf.c msgid "track_stepsize" msgstr "spor trinstørrelse" #: src/conf.c msgid "track_generic_move" msgstr "spore generisk bevægelse" #: src/conf.c msgid "camera" msgstr "kamera" #: src/conf.c msgid "camera_dir" msgstr "kamera dir" #: src/dbse.c msgid "Closing MySQL library" msgstr "Lukning af MySQL -bibliotek" #: src/dbse.c msgid "Closing MariaDB library" msgstr "Lukning af MariaDB bibliotek" #: src/dbse.c msgid "Database closed" msgstr "Database lukket" #: src/dbse.c msgid "Initializing database" msgstr "Initialisering af database" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "" "Kan ikke oprette forbindelse til MySQL-database %s pÃ¥ vært %s med bruger %s" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "MySQL-fejl var %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "" "Kan ikke oprette forbindelse til MariaDB -databasen %s pÃ¥ host %s med bruger " "%s" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "MariaDB -fejl var %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "Ã…bner database %s" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "Kan ikke Ã¥bne SQLite3-databasen %s. Fejl %d: %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "Indstiller optaget timeout til %d msec" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "Indstilling af optaget timeout mislykkedes. Fejl %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "Forbindelse til PostgreSQL-database ' %s' mislykkedes: %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "Databasetype %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "Kører MySQL -forespørgsel" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "MySQL -forespørgsel mislykkedes %s fejlkode %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "" "Kan ikke oprette forbindelse igen til MySQL-database %s pÃ¥ vært %s med " "bruger %s MySQL-fejlvar %s" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "Genforbindelse til MySQL-databasen '%s' Lykkes" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "efter genforbindelse mislykkedes MySQL-forespørgsel %s fejlkode %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "Kører MariaDB -forespørgsel" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "MariaDB forespørgsel mislykkedes %s fejlkode %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "Kan ikke genoprette forbindelse til MariaDB -databasen %s pÃ¥ host %s med " "bruger %s MariaDBfejlen var %s" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "Genforbindelse til MariaDB-databasen '%s' Lykkes" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "efter genforbindelse mislykkedes MariaDB-forespørgslen %s fejlkode %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "Forbindes igen til PostgreSQL-databasen '%s'" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "Kører PostgreSQL -forespørgsel" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "" "Forsøger igen at oprette forbindelse til PostgreSQL -databasen ' %s': %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "PGSQL-forespørgsel mislykkedes: [%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "Kører %s" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "SQLite3 fejl %d: %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "Ignorerer tom sql-forespørgsel" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "Kan ikke starte ekstern kommando ' %s'" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "Udfører ekstern kommando ' %s'" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "Skriver billede til fil: %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "Skriver film til fil: %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "Gemt billede i fil: %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "Filmen blev gemt i filen: %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "Kunne ikke sætte billedet i videorøret" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "Kunne ikke oprette symbolsk link [ %s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "Fejl ved oprettelse af preview-rørnavn %d %s" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "Fejl ved oprettelse af filnavnsbase %d %s" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "Fejl ved oprettelse af preview-navn %d %s" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "LUKKING: extpipe-fil desc %d, fejltilstand %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "pclose-afkast: %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "Kilde FPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "filmsti: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "ingen skriveadgang til mÃ¥lmappe %s" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "sti ikke fundet, forsøger at oprette den %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "fejl ved tiltrædelse af sti %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "Fejl ved specificering af kommandolinjen: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "rør: %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt->moviefps: %d" #: src/event.c msgid "popen failed" msgstr "popen mislykkedes" #: src/event.c msgid "Using extpipe" msgstr "Brug af extpipe" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "Fejl ved skrivning i røret, angiv fejl %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "pipe %s er ikke allerede oprettet eller lukket " #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "Ogg-containeren understøttes ikke længere. Skift til mpeg4" #: src/event.c msgid "Running test of the various output formats." msgstr "Kørestest af de forskellige outputformater." #: src/event.c msgid "Error opening context for movie output." msgstr "Fejl ved Ã¥bning af kontekst for filmoutput." #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffopen Ã¥ben fejl ved oprettelse af (bevægelses) fil [ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "" "SWF-beholderen til timelapse understøttes ikke længere. Brug af mpg-" "container." #: src/event.c msgid "Timelapse using mpg codec." msgstr "Timelapse ved hjælp af mpg-codec." #: src/event.c msgid "Events will be appended to file" msgstr "Begivenheder føjes til filen" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "Timelapse ved hjælp af mpeg4-codec." #: src/event.c msgid "Events will be trigger new files" msgstr "Begivenheder udløser nye filer" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffopen Ã¥ben fejl ved oprettelse af (timelapse) fil [ %s]" #: src/event.c msgid "Error encoding image" msgstr "Fejl ved kodning af billede" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "Kunne ikke tildele hukommelse til codec-navn" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "Den angivne billedhastighed er for høj til den angivne ffmpeg-filmtype.Vælg " "en anden ffmpeg-beholder eller lavere indramning." #: src/ffmpeg.c msgid "Error setting base file name" msgstr "Fejl ved indstilling af basisfilnavn" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "Fejl ved indstilling af timelapse-append for codec %s" #: src/ffmpeg.c msgid "Error setting file name" msgstr "Fejl ved indstilling af filnavn" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "codec-indstillingsværdi %s understøttes ikke" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "Kunne ikke hente codec" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "Fejl ved afsendelse af ramme til kodning: %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "Modtag pakke kastede EAGAIN returnerende -2 kode: %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "Fejl ved modtagelse af kodet pakkevideo: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "Fejl ved kodning af video: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "Fejl ved kodning af video" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "" "PTS % Basis PTS % ms intervall % tidsbase %d- %d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "DÃ…RLIG TIMING!! Ramme sprunget over." #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "" "PTS % Basis PTS % ms interval % tidsbase %d- %d " "Ændring%d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s codec vbr / crf / bit rate: %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "Foretrukket codec %s er sortlistet: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "Codec %s ikke fundet" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "Brug af codec %s" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "Kunne ikke tildele strøm" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "Der blev ikke tildelt codec!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "Lav fps. Kodning af %d rammer i en %d rammebeholder." #: src/ffmpeg.c msgid "Unable to set quality" msgstr "Kan ikke indstille kvalitet" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "Rapporteret FPS understøttet %d / %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "Kunne ikke Ã¥bne codec %s" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "Kunne ikke kopiere dekoderparametre !: %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "kunne ikke tildele ramme" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "kunne ikke tildele buffere %s" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "fejl ved Ã¥bning af fil %s" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "Adgang nægtet. %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "Fejl ved Ã¥bning af fil %s" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "Kunne ikke skrive ffmpeg-overskrift %s" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "Fejl ved indtastning af dræningstilstand: %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "Fejl ved dræning af codec: %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "Fejl ved skrivning af dræning af videoramme" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "Fejl under kodning af billede" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "Fejl under skrivning af videoramme" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet: %s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "Fejl under skrivning af videoramme: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "RTSP-kontekst er ikke tilgængelig." #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "rtsp-kamera er ikke klar til gennemgang." #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "gennemgangstilstand aktiveret. Skift til MP4-container." #: src/ffmpeg.c msgid "Could not get codec!" msgstr "Kunne ikke hente codec!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "Kan ikke kopiere codec-parametre" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "Gennemgang deaktiveret. ffmpeg for gammel" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "Gennemgangsstrøm Ã¥bnet" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "ffmpeg libavcodec version %d. %d. %d libavformat version %d. %d. %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "av lockmgr-register mislykkedes ( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "Ingen ffmpeg-funktionalitet inkluderet" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "av lockmgr register nulstilling mislykkedes ved oprydning" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "Kunne ikke allokere outputkontekst" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "Kunne ikke konfigurere passthru!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "Kunne ikke indstille strømmen" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "Fejl ved skylning af codec" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "Overdreven forsøg pÃ¥ at rydde den bufferede pakke" #: src/ffmpeg.c msgid "Buffered packet" msgstr "Bufret pakke" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s: Givet jpeg-buffer var for lille" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "Ugyldige JPEG-billeddimensioner" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "JPEG-billedstørrelse %dx %d, JPEG var %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "Modtaget uventet kamerakontrol tilbagekaldshændelse, 0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "" "En høj billedhastighed kan forÃ¥rsage problemer med eksponering af billeder" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "" "Hvis autoexponering ikke fungerer, kan du prøve en lavere billedhastighed." #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "Kunne ikke oprette MMAL-kamerakomponent %s" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "MMAL-kamera %s har ikke outputporte" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "Kan ikke aktivere kontrolport: fejl %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "MMAL-opsætning uden padding mislykkedes" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "kameravideoformat kunne ikke indstilles" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "kamerakomponent kunne ikke aktiveres" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "MMAL-kamerakomponent oprettet" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "Oprettelse af MMAL-kamerabufferpulje mislykkedes" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "Oprettelse af MMAL-kamerabufferkø mislykkedes" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "Kan ikke hente en pÃ¥krævet buffer %d fra poolkøen" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "Kan ikke sende en buffer til port ( %d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "MMAL KameratrÃ¥d starter ... for kamera ( %s) pÃ¥ %dx %d ved %d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "kameraparam kunne ikke tildeles" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "MMAL-kameraoptagelsesport muliggør ikke" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "Start af MMAL-kameraoptagelse mislykkedes" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "MMAL-kameraoprydning" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %d flag %08x størrelse %d / %d ved %08x, img størrelse = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "Kan ikke returnere en buffer til kameraets videoport" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "Ændre størrelse pÃ¥ præfangstbuffer til %d elementer" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "Fjernet proces-id-fil (pid-fil)." #: src/motion.c msgid "Error removing pid file" msgstr "Fejl ved fjernelse af pid-fil" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "Lukker logfil ( %s)." #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "Bevægelse registreret - starthændelse %d." #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "Tilføjet %d fillerrammer i filmen" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "Kan ikke bestemme kameratype (MMAL, Netcam, V4L2, BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "Ã…bning af fil til beskyttelse af privatlivets fred" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "Ã…bning af fil med høj opløsning for privatlivets fred" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "Fejl ved Ã¥bning af maskefil %s" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "Kunne ikke læse maske privatlivsbillede. Funktion til beskyttelse af maske " "er deaktiveret." #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "Mask privatlivsfil \" %s \" indlæst." #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "Ugyldig tekstskala. Justeret til %d" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "Kamera %d startet: bevægelsesdetektion %s" #: src/motion.c msgid "Disabled" msgstr "Handicappet" #: src/motion.c msgid "Enabled" msgstr "Aktiveret" #: src/motion.c msgid "Pass-through processing disabled." msgstr "Gennemgangsbehandling deaktiveret." #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "Ugyldige konfigurationsdimensioner %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "Brug af standarddimensioner %dx %d" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "Billedbredde ( %d) anmodet er ikke modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "Justering af bredde til næste højere multipel pÃ¥ 8 ( %d)." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "Billedhøjde ( %d) anmodet er ikke modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "Justering af højde til næste højere multipel pÃ¥ 8 ( %d)." #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "Kunne ikke hente det oprindelige billede fra kameraet " #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "" "Bevægelse fortsætter med at bruge bredde og højde fra konfigurationsfil (er)" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "Bevægelse understøtter kun bredde og højde modulo 8" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "Billedbredde ( %d) eller anmodet om højde ( %d) er ikke modulo 8." #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Bevægelse understøtter kun bredde og højde større end eller lig med 64 %dx %d" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "Understrøm ikke tilgængelig. Billedstørrelser ikke modulo 16." #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "webp-billedformat er ikke tilgængeligt, og mislykkes tilbage til jpeg" #: src/motion.c msgid "Error capturing first image" msgstr "Fejl ved optagelse af det første billede" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "Ã…bning af video loopback-enhed til normale billeder" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "Kunne ikke Ã¥bne video loopback for normale billeder" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "Ã…bning af video loopback-enhed til film" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "Kunne ikke Ã¥bne video loopback for film" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "Kunne ikke læse maskebillede. Maskefunktion deaktiveret." #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "Maskefile \" %s \" indlæst." #: src/motion.c msgid "Emulating motion" msgstr "Efterligende bevægelse" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "Bevægelse i omrÃ¥de %d detekteret." #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "Forsøg igen, indtil en vellykket forbindelse med kameraet" #: src/motion.c msgid "Camera has become available." msgstr "Kamera er blevet tilgængeligt." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "Genstarter bevægelse.\n" "Den ønskede billedbredde (%d) eller højde (%d) er ikke modulo 8." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Genstarter bevægelse.\n" "Bevægelse understøtter kun bredde og højde større end eller lig med 64 %dx%d" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "Genstarter bevægelse.\n" "Højde eller bredde er ændret pÃ¥ kameraet." #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "Genstarter bevægelse.\n" "Høj opløsning er ændret pÃ¥ kameraet." #: src/motion.c msgid "Video signal re-acquired" msgstr "Genopkøbt videosignal" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "Fatal fejl i videoenheden - Lukning af videoenhed" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "Genstart bevægelsestrÃ¥d for at initialisere alle billedbuffere" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "Videosignal mistet - Tilføje grÃ¥t billede" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "Videosignal mistet stadig - Forsøger at lukke videoenheden" #: src/motion.c msgid "Lightswitch detected" msgstr "Lyskontakt opdaget" #: src/motion.c msgid "Switchfilter detected" msgstr "Switchfilter detekteret" #: src/motion.c msgid "micro-lightswitch!" msgstr "mikro-lightswitch!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "Afslutning af begivenhed %d" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "RÃ¥ ændringer: %5d - ændringer efter ' %s': %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr " - etiketter: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "Ændringer: %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr " - støjniveau: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr " - tærskelværdi: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "Ugyldigt argument for timelapse-tilstand '%s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%: s Standard til manuel timelapse-tilstand" #: src/motion.c msgid "Thread exiting" msgstr "TrÃ¥d spændende" #: src/motion.c msgid "Motion going to daemon mode" msgstr "Bevægelse gÃ¥r til dæmontilstand" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "Afslut bevægelse, kan ikke oprette proces-id-fil (pid-fil) %s" #: src/motion.c msgid "Could not change directory" msgstr "Kunne ikke ændre bibliotek" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "Oprettet proces-id-fil %s. Proces-id er %d" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "" "Camara-id'er er ikke unikke eller har værdier over 32.000. Falder tilbage " "tiltrÃ¥dnumre" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2: tilgængelig" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2: ikke tilgængelig" #: src/motion.c msgid "bktr : available" msgstr "bktr: tilgængelig" #: src/motion.c msgid "bktr : not available" msgstr "bktr: ikke tilgængelig" #: src/motion.c msgid "webp : available" msgstr "webp: tilgængelig" #: src/motion.c msgid "webp : not available" msgstr "webp: ikke tilgængelig" #: src/motion.c msgid "mmal : available" msgstr "mmal: tilgængelig" #: src/motion.c msgid "mmal : not available" msgstr "mmal: ikke tilgængelig" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg: tilgængelig" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg: ikke tilgængelig" #: src/motion.c msgid "mysql : available" msgstr "mysql: tilgængelig" #: src/motion.c msgid "mysql : not available" msgstr "mysql: ikke tilgængelig" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB: tilgængelig" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB: ikke tilgængelig" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3: tilgængelig" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3: ikke tilgængelig" #: src/motion.c msgid "pgsql : available" msgstr "pgsql: tilgængelig" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql: ikke tilgængelig" #: src/motion.c msgid "nls : available" msgstr "nls: tilgængelig" #: src/motion.c msgid "nls : not available" msgstr "nls: ikke tilgængelig" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "Brug af standard logniveau ( %s) ( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "Logger til fil ( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "Afslut bevægelse, kan ikke oprette logfil %s" #: src/motion.c msgid "Logging to syslog" msgstr "Logger pÃ¥ syslog" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "Motion %s startet" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "Brug af standard logtype ( %s)" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "Brug af logtype ( %s) logniveau ( %s)" #: src/motion.c msgid "Motion running as daemon process" msgstr "Bevægelse, der kører som en dæmonproces" #: src/motion.c msgid "Motion running in setup mode." msgstr "Bevægelse, der kører i opsætningstilstand." #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "Kamera-ID: %d er fra %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "Kamera-ID: %d Kameranavn: %s Service: %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "Kamera-ID: %d Kameranavn: %s Enhed: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "Stream portnummer %d for trÃ¥d %d konflikter med kontrolporten" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "Streamfunktion for trÃ¥d %d er deaktiveret." #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "Stream portnummer %d for trÃ¥d %d konflikter med trÃ¥d %d" #: src/motion.c msgid "Restarting motion." msgstr "Genstart af bevægelse." #: src/motion.c msgid "Motion restarted" msgstr "Bevægelse genstartet" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "TrÃ¥d %d - Watchdog-timeout. Forsøger at udføre en yndefuld genstart" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "TrÃ¥d %d - Watchdog-timeout genstarter IKKE, og dræbte det!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "TrÃ¥d %d - RengøringstrÃ¥d." #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "DEBUG-1 trÃ¥de, der kører %d bevægelsestrÃ¥de, der løber %d, finish %d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "Venter pÃ¥ at trÃ¥dene er færdige, pid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "BevægelsestrÃ¥d %d genstart" #: src/motion.c msgid "Threads finished" msgstr "TrÃ¥de færdige" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "Bevægelsesafslutning" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "Ugyldig URL. Kan ikke analysere værdier." #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "KamerahÃ¥ndteringstrÃ¥d [ %d] startede" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "Lukning af netcam-stikket, nÃ¥r Keep-Alive-tiden er op (kameraet sendes Luk " "felt). ENgenforbindelse skal ske." #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "genÃ¥bningskamera (ikke-streaming)" #: src/netcam.c msgid "camera re-connected" msgstr "kameraet er tilsluttet igen" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "Ukendt billedhoved ( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "Fejl i overskrift ( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "genÃ¥bningskamera (streaming)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "Fejl ved at fÃ¥ jpeg-billede" #: src/netcam.c msgid "Trying to re-connect" msgstr "Forsøger at oprette forbindelse igen" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "netcam kamera handler: finish set, exit" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "Intet svar fra kamerahandler - det skal allerede være død" #: src/netcam.c msgid "called with no data in buffer" msgstr "kaldet uden data i buffer" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "Netværkskamera starter for kamera ( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "Ugyldig netcam-proxy ( %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "Brugernavn / adgangskode er ikke tilladt pÃ¥ en proxy-URL" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "Ugyldig netkamptjeneste ' %s' " #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "Ugyldig webkamera-url til kamera ( %s)" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "Netcam http-parameter ' %s' konverteres til flag: HTTP / 1.0: %s HTTP / 1.1: " "%s Keep-Lever %s." #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "kalder nu netcam setup html ()" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "kalder nu netcam setup ftp" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "kalder nu netcam setup-fil ()" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "kalder nu netcam setup mjpg ()" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "Ugyldig netcam service '%s' - skal være mjpeg, ftp, mjpg eller jpeg." #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "Forsøg pÃ¥ at læse det første billede mislykkedes - gentagelse: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "libjpeg dekomprimeringsfejl pÃ¥ første ramme - give op!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "Bredde / højde ( %dx %d) skal være multipler pÃ¥ 8" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "Fejl ved start af kamerahÃ¥ndtertrÃ¥d [ %d]" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "recv mislykkedes i ftp fÃ¥ mere" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "Serverrespons: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "send mislykkedes i ftp send bruger" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "send mislykkedes i ftp send passwd" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "send mislykkedes i ftp afslutte" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "gethostbyname mislykkedes i ftp-forbindelse" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "gethostbyname-adresse misforhold i ftp-forbindelse" #: src/netcam_ftp.c msgid "socket failed" msgstr "stikket mislykkedes" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "Kunne ikke oprette en forbindelse" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "FTP-server beder om ACCT pÃ¥ anonym" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "indstilling af socket option SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "send mislykkedes i ftp fÃ¥ forbindelse" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "Ugyldigt svar pÃ¥ PASV" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "Kunne ikke oprette en dataforbindelse" #: src/netcam_ftp.c msgid "bind failed" msgstr "bind mislykkedes" #: src/netcam_ftp.c msgid "listen failed" msgstr "lytning mislykkedes" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "send mislykkedes i ftp get socket" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "accepter i ftp fÃ¥ fatning" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "recv mislykkedes i ftp-læsning" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "ftp get socket mislykkedes" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "Fejl ved afsendelse af TYPE I til ftp-server" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "fejlformet token Indholdslængde men værdi %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "Indholdslængde %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "Indholdstype %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "" "Fejl ved læsning af billedhoved, streamingtilstand (1). Nul overskrift." #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "" "Fejl ved læsning af billedhoved, streamingtilstand (1). Ukendt overskrift ' " "%s'" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "Fejl ved læsning af billedhoved (2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "Header ikke JPEG" #: src/netcam_http.c msgid "Content-Length 0" msgstr "Indholdslængde 0" #: src/netcam_http.c msgid "Found image header record" msgstr "Fundet billedhovedrekord" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "Fejl ved afsendelse af 'forbindelse' -anmodning" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "Modtaget første header (' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "Fejl ved læsning af første header ( %s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "HTTP-resultatkode %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "" "Fjernet netcam Keep-Alive-flag pÃ¥ grund af tilsyneladende lukket HTTP-" "forbindelse." #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "Ikke-streaming kamera (holdes i live sæt)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "Ikke-streaming kamera (hold ved liv ikke indstillet)" #: src/netcam_http.c msgid "Streaming camera" msgstr "Streaming kamera" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "Grænsestreng [ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "Afgrænsningsstreng ikke fundet i header" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "" "Streaming kamera sandsynligvis bruger MJPG-blokke, overveje at bruge mjpg: //" "netcam url." #: src/netcam_http.c msgid "Unrecognized content type" msgstr "Ukendt indholdstype" #: src/netcam_http.c msgid "Content-length present" msgstr "Indholdslængde til stede" #: src/netcam_http.c msgid "Content-length 0" msgstr "Indholdslængde 0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "Fundet Conn: luk overskrift (' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "" "BÃ¥de 'Forbindelse: Keep-Alive' og 'Connection: close' overskrift modtaget." "Bevægelse fjerner keepalive." #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "" "BÃ¥de 'Forbindelse: Keep-Alive' og 'Connection: close' overskrift modtaget." "Bevægelse fortsætter uændret." #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "Modtog et Keep-Alive-felt i dette sæt overskrifter." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "Ingen 'forbindelse: Keep-Alive' eller 'Connection: close' overskrift " "modtaget. \n" " Bevægelse fjerner keepalive." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "Ingen 'forbindelse: Keep-Alive' eller 'Connection: close' overskrift " "modtaget. \n" " Bevægelse fortsætter uændret." #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "Fjernet netkamera Keep-Alive-flag, fordi 'Forbindelse: tæt' overskrift " "modtaget. \n" " Netcam understøtter ikke Keep-Alive. Bevægelse fortsætter i ikke-Keep-Alive." #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "Keep-Alive har nÃ¥et slutningen af ​​den gyldige periode. \n" "Bevægelse lukker netcam og fortsætter derefter Keep-Alive med en ny " "stikkontakt." #: src/netcam_http.c msgid "disconnect" msgstr "koble fra" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo () mislykkedes ( %s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "afbrydelse af netkamera (1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "afbrydelse af netcam, da holdes i live ikke er indstillet." #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "uden forsinkelse, forsøg pÃ¥ at oprette socket mislykkedes." #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "uden keepalive, ny socket oprettet fd %d" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "med keepalive-sæt, ugyldig stikkontakt. Dette kan være første gang. " "Oprettelse af enden nye mislykkedes." #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "" "med keepalive-sæt, ugyldig socket.Dette kunne være første gang, oprettes en " "nyen med fd %d" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "SÃ… KEEPALIVE er %s" #: src/netcam_http.c msgid "ON" msgstr "PÃ…" #: src/netcam_http.c msgid "OFF" msgstr "AF" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "SÃ… KEEPALIVE indstillet pÃ¥ stikkontakt." #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "fcntl (1) pÃ¥ stikkontakt" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "fcntl (2) pÃ¥ stikkontakt" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "connect () mislykkedes ( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "afbrydelse af netkamera (4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "timeout ved tilslutning ()" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "afbrydelse af netkamera (2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "getockopt efter connect" #: src/netcam_http.c msgid "connect returned error" msgstr "forbindelse returneret fejl" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "afbrydelse af netkamera (3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "udvidelse af buffer fra [ %d / %d] til [ %d / %d] byte." #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "Potentiel splitgrænse - %d ruter skyllet, %d genplaceret" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "recv () mislykkes efter grænsestreng" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "forlader netkamera tilsluttet." #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "ved at prøve at oprette forbindelse, tid # %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "Kunne ikke Ã¥bne kameraet - kontroller din config, og at netcameraet er online" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "Fejl ved læsning af første header - forsøg pÃ¥ ny" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "Kunne ikke læse det første kamerahoved - opgive nu" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "Netcam har flag: HTTP / 1.0: %s HTTP / 1.1: %s Keep-Alive %s." #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "" "Fjernet netcam keepalive flag pÃ¥ grund af proxysæt. Proxy er ikke kompatibel " "medHolde i live." #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "Kunne ikke læse første streamhoved - opgive nu" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "tilsluttet, fortsætter med at læse billede." #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "Læs fejl, mens du prøver at oprette forbindelse igen .." #: src/netcam_http.c msgid "lost the cam." msgstr "mistede cam." #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "Genopfyldt buffer med [ %d] byte fra netværket." #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "Læs [ %d / %d] headerbyte." #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "Ugyldigt overskrift modtaget, igen tilslutning" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "Læs [ %d / %d] chunkebytes, [ %d / %d] i alt" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "Chunk komplet, buffer brugt [ %d] bytes." #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "Billedet er komplet, buffer brugt [ %d] byte." #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "tilsluttet, fortsætter med at læse og afkode MJPG-bidder." #: src/netcam_http.c msgid "Begin" msgstr "Begynde" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "stat ( %s) fejl" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]! = sidste st mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "venter pÃ¥ timeout for ny filbillede" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "forsinkelse af at vente pÃ¥ nyt filbillede " #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "behandling af nyt filbillede - st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "Ã¥ben ( %s) fejl: %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "læse ( %s) fejl: %d" #: src/netcam_http.c msgid "End" msgstr "Ende" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> fil-> sti %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "Ikke nok data fra netcam." #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> jpeg-fejl %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "*** ny pic forsinkelse vellykket ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "jpeg-fejl %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "behandling af jpeg-billede - indholdslængde %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "Kamerabredde / højde-uoverensstemmelse med JPEG-billede - forventet %dx %d, " "JPEG %dx %dgentagelse %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s: Ændret størrelse pÃ¥ pakkearray til %d" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s: av kopipakke: %s, Afbryd: %s" #: src/netcam_rtsp.c msgid "True" msgstr "Rigtigt" #: src/netcam_rtsp.c msgid "False" msgstr "Falsk" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: Ignorerer pakke med ugyldige data" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: Rec frame frame: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "Ignorerer pakken med ugyldige data" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "Fejl ved afkodning af pakke: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "%s: Fejl ved overførsel af HW afkodet til systemhukommelse" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "Fejl ved afsendelse af pakke til codec: %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "Fejl ved afkodning af videopakke: Kopiering til buffer" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: HW -enheder: " #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s (tilgængelig)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s (ikke implementeret)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s: netcam -dekoder %s deaktiveret." #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "Kunne ikke hente vaapi pix -format" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "Kunne ikke hente cuda pix -format" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s: Afbrudt." #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: mislykkedes" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s: Dekoder %s fungerede ikke." #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "%s: Ignorerer og fjerner den brugeranmodede dekoder %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s: Initialiserer vaapi -dekoder" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: Kan ikke finde vaapi hw -enhed" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s: Initialiserer cuda -dekoder" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: Kan ikke finde cuda hw -enhed" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s: Initialiserer dekoder" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s: Brug af dekoder %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: Dekoder Ã¥bnet" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s: Kameralæsning ( %s) er udløbet" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s: Kameraet ( %s) er udløbet" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "Kan ikke tildele swsframe i." #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "Kan ikke tildele swsframe out." #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "Kan ikke tildele skaleringskontekst." #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "Fejl ved bestemmelse af størrelsen pÃ¥ rammen ud" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "Fejl ved tildeling af billede i: %s" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "Fejl ved tildeling af billede: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "Fejl ved ændring af størrelse / omformatering: %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "Fejl ved indsættelse af ramme i outputbuffer: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s: Afbrudt" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: av læseramme: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: For mange forsøg pÃ¥ at hente data fra kameraet %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "%s: fangsthastighed ikke angivet i netcam -params. Brug af %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s: fangsthastighed ikke angivet i netcam -params. Brug af framerate %d" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "Netværkskameraet sender billeder pÃ¥ et andet" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "størrelse end specificeret i konfigurationen og ogsÃ¥ en " #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "forskellige billedformater. Billedet er ved at være" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "transkodet til YUV420P og i den ønskede størrelse" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "i konfigurationsfilen. Skift om muligt netcam til" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "være i YUV420P-format og den ønskede størrelse i" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "config til muligvis lavere CPU-brug." #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "størrelse end specificeret i konfigurationsfilen." #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "Billedet bliver kodet til størrelsen " #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "anmodet om i konfigurationen. Skift om muligt" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "netcam eller konfiguration for at indikere den samme størrelse" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "for muligvis at reducere CPU-brug." #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "Netcam: %dx %d => Config: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "Det sendte billede bliver ved " #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "trancoderet til YUV420P. Skift om muligt netcam " #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "billedformat til YUV420P for muligvis lavere CPU-brug." #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: Indstilling af rtsp/rtmp" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: Indstilling af inputformat mjpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: Indstilling af inputformat video4linux2" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: Opsætning af filmfil" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s: Opsætning af %s" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: option: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "Opsætning af v4l2 via netcam" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "Opsætning af fil via netcam" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "Opsætning af %s via netcam" #: src/netcam_rtsp.c msgid "highres" msgstr "høj opløsning" #: src/netcam_rtsp.c msgid "norm" msgstr "norm" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "Opsætning af %s strøm." #: src/netcam_rtsp.c msgid "Unknown" msgstr "Ukendt" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "Stream kopieret til gennemgang" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "Nul sti passeret for at oprette forbindelse" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s: Kan ikke Ã¥bne kamera ( %s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s: Ã…bnet kamera ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s: Kan ikke finde strøminfo: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s: Kan ikke Ã¥bne codec-kontekst: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s: Kameraets billedstørrelse er ugyldig" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s: Kan ikke tildele ramme." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s: Kunne ikke kopiere stream til gennemgang." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s: Kunne ikke læse det første billede" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s: Kamera ( %s) tilsluttet" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s: Netcam -fangsthastighed er %d." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s: Kamerakilde er %d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s: Kan ikke bestemme kamerakilden FPS." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s: optagelseshastighed er mindre end kameraets FPS." #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s: Der vil forekomme afkodningsfejl." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "%s: fangehastighed lidt større end kameraets FPS anbefales." #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s: Forbindelse igen med kamera ...." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s: Kameraet sluttede ikke forbindelse igen." #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s: Kontrollerer efter kamera hvert 10. sekund." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s: KamerahÃ¥ndteringstrÃ¥d [ %d] startede" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s: HÃ¥ndteringssløjfe færdig." #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s: Fejl ved start af handlertrÃ¥d" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s: Venter pÃ¥ det første billede fra behandleren." #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "ikke i stand til at oprette rtsp-kontekst" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "ikke i stand til at skabe rtsp-høj kontekst" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "Ingen FFmpeg -understøttelse" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s: Luk netværkskamera." #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s: Intet svar fra handlertrÃ¥d." #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "Normal opløsning: Luk afsluttet." #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "Høj opløsning: Luk komplet." #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "Kan ikke indstille EXIF ​​til webpunktsdel" #: src/picture.c msgid "libwebp version error" msgstr "libwebp version fejl" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "libwebp billedbuffertildelingsfejl" #: src/picture.c msgid "libwebp image compression error" msgstr "libwebp billedkomprimeringsfejl" #: src/picture.c msgid "unable to assemble webp image" msgstr "ikke i stand til at samle webp-billede" #: src/picture.c msgid "unable to save webp image to file" msgstr "kunne ikke gemme webp-billede til fil" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "Kan ikke skrive billede til fil %s - tjek adgangsrettigheder til mÃ¥lmappe \n" "TrÃ¥den vil være færdig pÃ¥ grund af denne fatale fejl" #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "Kan ikke skrive billede til filen %s" #: src/picture.c msgid "Error getting PGM vars." msgstr "Fejl ved hentning af PGM vars." #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "Dette er ikke en pgm-fil, starter med ' %s'" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "Magic %s: Bredde %s(%d): Højde %s(%d): MaxVal: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "Kunne ikke læse billeddata fra pgm-fil" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "" "Den angivne maskefil er ikke den samme størrelse som billedet fra kameraet." #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "Forsøg pÃ¥ at ændre størrelsen pÃ¥ maskebilledet fra %dx %d til %dx %d" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "kan ikke skrive maskefil %s - tjek adgangsrettigheder til mÃ¥lmappe" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "kan ikke skrive maskefil %s" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "Kunne ikke skrive standardmasken som pgm-fil" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "Opretter tom maske %s \n" "Rediger denne fil og kør bevægelse igen for at aktivere maskefunktionen" #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "Konfigurationsindstilling \"roter \" ikke en multipel pÃ¥ 90: %d" #: src/track.c msgid "internal error" msgstr "intern fejl" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "intern fejl, %hu er ikke en kendt sporetype" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "port %s dev fd %i, motor %hu kommando %hu data %hu" #: src/track.c msgid "Status byte timeout!" msgstr "Statusbyte-timeout!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "Prøv at Ã¥bne serienhed %s" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "Kan ikke Ã¥bne serienhed %s" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "Kan ikke initialisere seriel enhed %s" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "Ã…bnede serienhed %s og initialiseres, fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "Der er ikke startet nogen enhed %s endnu, prøver stepper center ()" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "kunne ikke initialisere stepapparat pÃ¥ %s, fd [ %i]." #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "succes, enhed startede %s, fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "SENDER port %s dev fd %i, motor %hu kommando %hu data %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "Kommandoafkast %d" #: src/track.c msgid "Problem opening servo!" msgstr "Problemer med at Ã¥bne servo!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d, cent-> y %d, reversex %d, reversey %d manuel %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d værdi uden for rækkevidde! ( %d - %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d værdi uden for rækkevidde! ( %d - %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "X forskydning %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "X cent-> x %d, cent-> y %d, reversex %d, reversey %d motorx %d data %d " "kommando%d" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Y modregning %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Y cent-> x %d, cent-> y %d, reversex %d, reversey %d motory %d data %d " "kommando%d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "X-offset %d, Y-offset %d, x-position %d. y-position %d, reversex %d, reversey" "%d, trinstørrelse %d" #: src/track.c msgid "Return byte timeout!" msgstr "Returner byte-timeout!" #: src/track.c msgid "Unable to set camera speed" msgstr "Kan ikke indstille kamerahastighed" #: src/track.c msgid "succeed" msgstr "lykkes" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "Kunne ikke nulstille pwc-kameraet til startposition! Grund" #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "mislykkedes VIDIOCPWCMPTGRANGE" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "Kunne ikke panorere / vippe pwc-kameraet! Grund" #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "Kunne ikke nulstille UVC-kameraet til startposition! Grund" #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "Nulstilling af UVC-kamera til startposition" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl querycontrol" #: src/track.c msgid "Getting camera range" msgstr "Henter kameraomrÃ¥det" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "INPUT PARAM ABS pan min %d, pan max %d, tilt min %d, tilt max %d " #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "INPUT PARAM ABS X Angel %d, Y Angel %d " #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "For SET ABS flyttes X %d, flyt Y %d" #: src/track.c msgid "Failed to move UVC camera!" msgstr "Kunne ikke flytte UVC-kamera!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "Fundet MINMAX = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "Før ABS Y Angel: x = %d, Y = %d, " #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "Efter ABS Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "For SET REL pan min %d, pan max %d, tilt min %d, tilt max %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "For SET REL-sporpanel Angel %d, sporvinkler Angel %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "For SET REL skal du flytte X %d, flytte Y %d" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr " dev %d, addr = %d, kontrol S = %d, Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr " dev %d, addr = %d, kontrol S = %d, Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "Før REL Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "Efter REL Y Angel: x = %d, Y = %d" #: src/translate.c msgid "Language: English" msgstr "Sprog: Engelsk" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "Kunne ikke tildele %llu bytes hukommelse!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "" "Advarsel! Funktion %s forsøger at ændre størrelse pÃ¥ hukommelsesblok ved %p " "til 0 byte!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "Kunne ikke ændre størrelsen pÃ¥ hukommelsesblokken ved forskydning %p til " "%llu byte (funktion %s)!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "Problemer med at oprette mappe %s" #: src/util.c #, c-format msgid "creating directory %s" msgstr "oprette mappe %s" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "Fejl ved Ã¥bning af fil %s med tilstand %s" #: src/util.c msgid "Error closing file" msgstr "Fejl ved lukning af fil" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbeventid} understøttes ikke. Brug eventtid." #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "ugyldigt formatspecifikt nøgleord %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "Kunne ikke indstille trÃ¥dnavnet %s" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "FFMPEG-version for gammel. Deaktiverer gennemgangsbehandling." #: src/util.c msgid "pass-through enabled." msgstr "pass-through aktiveret." #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "Fejl ved indstilling af parm>%s <" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "Parset:>%s <>%s <" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "Parsed:> redacted <> redacted <" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "Fejl ved parsing af parm nm -kontroller: %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "Fejl under parsing af parm vl -kontroller: %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "Fejl ved indstilling af temp: %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "Fejl ved genindlæsning af kontroller: %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "Parsing: %s" #: src/util.c msgid "Parsing: " msgstr "Parsing: " #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "Fejl ved analysering af kontroller: %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "Fejl: %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "Nye netcam -params: %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "Nye netcam høje params: %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "Nye videoparameter: %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "Nyt webkontrolhovedparameter: %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "Nye webkontrolhovedparametre: " #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "Nyt stream header params: %s" #: src/util.c msgid "New stream_header_params: " msgstr "Nyt stream -header params: " #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "Programmeringsfejl. Ukendt konfigurationselement: %s" #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE Fejlindstilling farvetone [ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "til [%d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE Fejl ved at fÃ¥ farvetone" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT Fejl ved indstilling af mætning [ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT Fejl ved mætning" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT Fejlindstilling af kontrast [ %d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT Fejl ved at fÃ¥ kontrast" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "METEORSBRIG lysstyrke [ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIG fÃ¥r lysstyrke" #: src/video_bktr.c msgid "Not implemented" msgstr "Ikke implementeret" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "Enhedsinput %d uden for rækkevidde (0-4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d ugyldig - Prøvning af sammensat %d" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "BT848SFMT, kunne ikke indstille inputformatet, prøv igen med standard" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "BT848SFMT, kunne ikke indstille inputformatet enten som standard" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "Kunne ikke indstille geometrien" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "til [ %d / %d] Norm %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "Ikke gyldig Frekvens [%ld] for kildeindgang [%i]" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "Frekvens [%ld] Kildeindgang [%i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "sæt input [ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "indstil inputformat [ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "indstil geometri [ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "Frekvens sæt (endnu ikke implementeret" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "Størrelse pÃ¥ buffer til 3x" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "Størrelse pÃ¥ buffer til 3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap mislykkedes" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "METEORCAPTUR ved hjælp af enkelt metode Fejlindfangning" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "Fejl under optagelse ved hjælp af en enkelt metode" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "Kan ikke finde videoenhed" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "Lukker videoenhed %s" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "Stadig %d brugere af videoenhed %s, sÃ¥ vi lukker den ikke nu" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "config billedbredde ( %d) er ikke modulo 8" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "config billedhøjde ( %d) er ikke modulo 8" #: src/video_bktr.c msgid "Stopping capture" msgstr "Stop optagelse" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "" "Genanvendelse af [ %s] input [ %d, %d] Skift indfangningsmetode METEOR CAP " "SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "VIDEO PALETTE YUV420P indstilling imgs.size norm og imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "Ã¥ben videoenhed %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "Ã¥ben tunerenhed %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "Korrupt billede ... fortsæt" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "SOI-position justeret med %d bytes." #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "opkald mmalcam oprydning" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "opkald netcam oprydning" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "opkald til netcam rtsp oprydning" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "Oprydning af V4L2-enhed" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "Oprydning af BKTR-enhed" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "Ingen oprydning af kameraenheden (MMAL, Netcam, V4L2, BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "Ã…bning af MMAL-cam" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "MMAL-cam kunne ikke Ã¥bnes" #: src/video_common.c msgid "Opening Netcam" msgstr "Ã…bning af Netcam" #: src/video_common.c msgid "Netcam failed to open" msgstr "Netcam kunne ikke Ã¥bnes" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Ã…bning af Netcam RTSP" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Netcam RTSP kunne ikke Ã¥bnes" #: src/video_common.c msgid "Opening V4L2 device" msgstr "Ã…bning af V4L2-enhed" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "V4L2-enheden kunne ikke Ã¥bnes" #: src/video_common.c msgid "Opening BKTR device" msgstr "Ã…bning af BKTR-enhed" #: src/video_common.c msgid "BKTR device failed to open" msgstr "BKTR-enheden kunne ikke Ã¥bnes" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "Der er ikke angivet nogen kameraenhed (MMAL, Netcam, V4L2, BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "Kunne ikke Ã¥bne ' %s'" #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "Fejl ved specificering af buffer: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "Ã…bningsbuffer: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "Læs buffer: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "fundet videoenhed ' %s' %d" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "Ã…bnede %s som rørudgang" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "Ã…bning af %s, da rørets output mislykkedes" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "Originale rørspecifikationer" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "ForeslÃ¥ede rørspecifikationer" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "Endelige rørspecifikationer" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "Der blev ikke fundet nogen kontroller til enheden" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "--------- Controls ---------" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr " V4L2 ID Navn og rækkevidde" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "Fejl ved nulstilling af brugerværdi" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "Forlader kontrol %s \"%s\" indstillet til %d" #: src/video_v4l2.c msgid "Device not ready" msgstr "Enheden er ikke klar" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "Sæt kontrol \" %s \" til værdi %d" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "indstilling af kontrol %s \"%s\" til %d mislykkedes." #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "%s kontrolmulighedsværdi %s er under minimum. Brug minimum %d" #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "%s kontrolmulighedsværdi %s er over maksimum. Brug af maks. %d" #: src/video_v4l2.c msgid "control type not supported yet" msgstr "kontroltype understøttes endnu ikke" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "Kan ikke forespørge input %d. VIDIOC ENUMINPUT, hvis du bruger et WEBCAM-" "skift inputværdi i konf. med -1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "Navn = \" %s \", skriv 0x %08X, status %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "Navn = \" %s \", - TUNER" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "Navn = \" %s \" - KAMERA" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "Fejl ved valg af input %d VIDIOC S INPUT" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "Enheden understøtter ikke specificering af PAL / NTSC-norm" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "- videostandard %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "Fejl ved valg af standardmetode %d VIDIOC S STD" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "Video standard indstillet til NTSC" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "Video standard indstillet til SECAM" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "Video standard indstillet til PAL" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "tuner %d VIDIOC G TUNER" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "Indstil tuner %d" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "freq %ul VIDIOC S FREQUENCY" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "Indstil frekvens til %ul" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "Kan ikke bruge %c%c%c%c (%dx%d)" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "Testpalette %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "Kontrollerer billedstørrelse %dx%d med skridt %d" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "Ingen skridtværdi angivet fra enheden." #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "Bredde(%d) skal være mindre end skridtlængde(%d)" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "Billedbredden (%d) er ikke multiplum af skridtet (%d)" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "Umulig tilstand: Bredde(%d), Skridt(%d), Pr. skridt(%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "Billedbredden vil blive polstret %d bytes" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "Justering af opløsning fra %ix %i til %ix %i." #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "Justeret opløsning ikke modulo 8." #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "Angiv anden palet eller bredde / højde i konfigurationsfilen." #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "Fejl ved indstilling af pixelformat." #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "Brug af palet %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "Justering til bredde ( %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "Justering til højde ( %d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "Konfigurationspaletteindeks %d ( %s) for %dx %d fungerer ikke." #: src/video_v4l2.c msgid "Supported palettes:" msgstr "Understøttede paletter:" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d - %s (komprimeret: %d) ( %# x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "Valgt palet %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "Valg af palet mislykkedes i formatet %s" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "Kan ikke finde et kompatibelt paletformat." #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "Fejl ved anmodning om buffere %d til hukommelseskort. VIDIOC REQBUFS" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "mmap information: rammer = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "Utilstrækkelig bufferhukommelse %d %s< >%s< >%s<" msgstr "Ugyldig handling anmodet:> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "ModersmÃ¥l: tændt" #: src/webu.c msgid "Native Language : off" msgstr "ModersmÃ¥l: slukket" #: src/webu.c msgid "Set the value to null/zero" msgstr "Indstil værdien til null / nul" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "Ignorerer forbindelse fra: %s" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "Mislykket godkendelse fra %s" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "Ingen bruger af webkontrol: leveret pass" #: src/webu.c msgid "No stream user:pass provided" msgstr "Ingen strømbruger: pass leveret" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "Ugyldigt svar" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "Fejl ved tilføjelse af webkontroloverskrift %s %s" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "Fejl ved tilføjelse af streamoverskrift %s %s" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "Ugyldig metode anmodet: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "Forbindelse fra: %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "sendes side mislykkedes %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "Streambilledet er ikke klar endnu" #: src/webu.c msgid "Stream process requested to finish." msgstr "Streamprocessen anmodes om at blive afsluttet." #: src/webu.c msgid "Send page failed." msgstr "Send siden mislykkedes." #: src/webu.c msgid "Basic authentication: available" msgstr "Grundlæggende godkendelse: tilgængelig" #: src/webu.c msgid "Basic authentication: disabled" msgstr "Grundlæggende godkendelse: deaktiveret" #: src/webu.c msgid "Digest authentication: available" msgstr "Digest-godkendelse: tilgængelig" #: src/webu.c msgid "Digest authentication: disabled" msgstr "Digest-godkendelse: deaktiveret" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd libary for gammel ipv6 deaktiveret" #: src/webu.c msgid "IPV6: available" msgstr "IPV6: tilgængelig" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6: deaktiveret" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd libary for gammel SSL / TLS deaktiveret" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS: tilgængelig" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS: deaktiveret" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "Fejl ved læsning af fil til SSL / TLS-support." #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "SSL / TLS anmodet om, men der blev ikke leveret nogen certifikatfil. SSL / " "TLS deaktiveret" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "" "SSL / TLS anmodet om, men der blev ikke leveret nogen nøglefil. SSL / TLS " "deaktiveret" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "Starter webkontrol pÃ¥ port %d" #: src/webu.c msgid "Unable to start MHD" msgstr "Kan ikke starte MHD" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "Startede webkontrol pÃ¥ port %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "Startet kamera %d strøm pÃ¥ port / kamera-id %d / %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "Startet kamera %d strøm pÃ¥ port %d" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "Start af alle kamerastrømme pÃ¥ port %d" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "Start kamera %d strøm pÃ¥ port %d" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "Kan ikke starte strøm for kamera %d" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "Dupliceret port anmodet %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "Ugyldig webkontrollÃ¥s maks. Ips. Indstilling lig med 25." #: src/webu_html.c msgid "Cameras" msgstr "Kameraer" #: src/webu_html.c msgid "Camera" msgstr "Kamera" #: src/webu_html.c msgid "All" msgstr "Alle" #: src/webu_html.c msgid "Action" msgstr "Handling" #: src/webu_html.c msgid "Start Event" msgstr "Start Event" #: src/webu_html.c msgid "End Event" msgstr "Slutbegivenhed" #: src/webu_html.c msgid "Snapshot" msgstr "Øjebliksbillede" #: src/webu_html.c msgid "Change Configuration" msgstr "Skift konfiguration" #: src/webu_html.c msgid "Write Configuration" msgstr "Skriv konfiguration" #: src/webu_html.c msgid "Tracking" msgstr "Sporing" #: src/webu_html.c msgid "Pause" msgstr "Pause" #: src/webu_html.c msgid "Start" msgstr "Start" #: src/webu_html.c msgid "Restart" msgstr "Genstart" #: src/webu_html.c msgid "Quit" msgstr "Afslut" #: src/webu_html.c msgid "Help" msgstr "Hjælp" #: src/webu_html.c msgid "No Configuration Options" msgstr "Ingen konfigurationsindstillinger" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "Begrænsede konfigurationsindstillinger" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "Avancerede konfigurationsindstillinger" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "Fortrolige konfigurationsindstillinger" #: src/webu_html.c msgid "All Cameras" msgstr "Alle kameraer" #: src/webu_html.c msgid "Not running" msgstr "Ikke aktiv" #: src/webu_html.c msgid "Lost connection" msgstr "Tabt forbindelse" #: src/webu_html.c msgid "Paused" msgstr "Sat pÃ¥ pause" #: src/webu_html.c msgid "Active" msgstr "Aktiv" #: src/webu_html.c msgid "Select option" msgstr "Vælg indstilling" #: src/webu_html.c msgid "Save" msgstr "Gemme" #: src/webu_html.c msgid "Pan/Tilt" msgstr "Drejelig / Tilt" #: src/webu_html.c msgid "Absolute Change" msgstr "Absolut ændring" #: src/webu_html.c msgid "Center" msgstr "Center" #: src/webu_html.c msgid "Pan" msgstr "Drejelig" #: src/webu_html.c msgid "Tilt" msgstr "Tilt" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "Ugyldig trÃ¥d specificeret: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "Ugyldig URL til en kameraspecifik port: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "" "URL til trÃ¥d 0 er ikke gyldig, nÃ¥r du bruger kameraspecifikke filer: %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "DÃ¥rlig URL til en kameraspecifik port: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "Billedet kunne ikke streames." #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "Indstillingen ' %s' afskrives. Navn pÃ¥ den nye indstilling er '%s' " motion-release-4.6.0/po/de.po000066400000000000000000003302321452402535500160220ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:39-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "%s nach version %s" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "Unbekannte Konfigurationsoption \" %s\"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "Schreiben der Konfigurationsdatei in %s" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "" "Konfigurationsdatei %s nicht gefunden - Standardeinstellungen werden " "versucht." #: src/conf.c msgid "Error getcwd" msgstr "Fehler getcwd" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "Konfigurationsdatei %s konnte nicht geöffnet werden" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "Ungültiger Dateiname %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "Verarbeitungs-Thread 0 - Konfigurationsdatei %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "Keine zu verarbeitende Konfigurationsdatei mit Standardwerten" #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "Konfigurationsparameter aus allen Dateien schreiben ( %d):" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "Thread %d - Konfigurationsdatei: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s " #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "Die Konfigurationsdatei %s wird verarbeitet" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "Kameraverzeichniskonfiguration %s nicht gefunden" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "Kamera-Konfigurationsdatei %s nicht gefunden" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "Kamera-Konfigurationsdatei %s wird verarbeitet" #: src/conf.c msgid "daemon" msgstr "Daemon" # Configuration Option Hints #: src/conf.c msgid "setup_mode" msgstr "Konfigurations-Modus" #: src/conf.c msgid "pid_file" msgstr "PID-Datei" #: src/conf.c msgid "log_file" msgstr "Logdatei" #: src/conf.c msgid "log_level" msgstr "Protokollebene" #: src/conf.c msgid "log_type" msgstr "Protokolltyp" #: src/conf.c msgid "quiet" msgstr "ruhig" #: src/conf.c msgid "watchdog_tmo" msgstr "Wachhund tmo" #: src/conf.c msgid "watchdog_kill" msgstr "Wachhund töten" #: src/conf.c msgid "native_language" msgstr "Muttersprache" #: src/conf.c msgid "camera_name" msgstr "Kameraname" #: src/conf.c msgid "camera_id" msgstr "Kamera-ID" #: src/conf.c msgid "target_dir" msgstr "Ziel dir" #: src/conf.c msgid "video_device" msgstr "Videogerät" #: src/conf.c msgid "video_params" msgstr "Videoparameter" #: src/conf.c msgid "auto_brightness" msgstr "automatische Helligkeit" #: src/conf.c msgid "tuner_device" msgstr "Tuner-Gerät" #: src/conf.c msgid "roundrobin_frames" msgstr "Roundrobin-Rahmen" #: src/conf.c msgid "roundrobin_skip" msgstr "Roundrobin überspringen" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "Roundrobin Schaltfilter" #: src/conf.c msgid "netcam_url" msgstr "netcam url" #: src/conf.c msgid "netcam_params" msgstr "netcam-Parameter" #: src/conf.c msgid "netcam_high_url" msgstr "Netcam hohe URL" #: src/conf.c msgid "netcam_high_params" msgstr "netcam hohe Parameter" #: src/conf.c msgid "netcam_userpass" msgstr "netcam userpass" #: src/conf.c msgid "mmalcam_name" msgstr "mmalcam name" #: src/conf.c msgid "mmalcam_params" msgstr "mmalcam-Parameter" #: src/conf.c msgid "width" msgstr "Breite" #: src/conf.c msgid "height" msgstr "Höhe" #: src/conf.c msgid "framerate" msgstr "Framerate" #: src/conf.c msgid "minimum_frame_time" msgstr "minimale Bildzeit" #: src/conf.c msgid "rotate" msgstr "drehen" #: src/conf.c msgid "flip_axis" msgstr "Kippachse" #: src/conf.c msgid "locate_motion_mode" msgstr "Bewegungsmodus suchen" #: src/conf.c msgid "locate_motion_style" msgstr "Suchen Sie den Bewegungsstil" #: src/conf.c msgid "text_left" msgstr "Text links" #: src/conf.c msgid "text_right" msgstr "Text richtig" #: src/conf.c msgid "text_changes" msgstr "Textänderungen" #: src/conf.c msgid "text_scale" msgstr "Textskala" #: src/conf.c msgid "text_event" msgstr "Textereignis" #: src/conf.c msgid "emulate_motion" msgstr "Bewegung emulieren" #: src/conf.c msgid "pause" msgstr "Pause" #: src/conf.c msgid "threshold" msgstr "Schwelle" #: src/conf.c msgid "threshold_maximum" msgstr "Schwellenwert Maximum" #: src/conf.c msgid "threshold_tune" msgstr "Schwellenwertabstimmung" #: src/conf.c msgid "noise_level" msgstr "Geräuschpegel" #: src/conf.c msgid "noise_tune" msgstr "Geräuschmelodie" #: src/conf.c msgid "despeckle_filter" msgstr "Entfleckungsfilter" #: src/conf.c msgid "area_detect" msgstr "bereich erkennen" #: src/conf.c msgid "mask_file" msgstr "Maskendatei" #: src/conf.c msgid "mask_privacy" msgstr "Maske Privatsphäre" #: src/conf.c msgid "smart_mask_speed" msgstr "Smart Mask Geschwindigkeit" #: src/conf.c msgid "lightswitch_percent" msgstr "Lichtschalter Prozent" #: src/conf.c msgid "lightswitch_frames" msgstr "Lichtschalterrahmen" #: src/conf.c msgid "minimum_motion_frames" msgstr "Minimum Motion Frames" #: src/conf.c msgid "event_gap" msgstr "Ereignislücke" #: src/conf.c msgid "pre_capture" msgstr "Pre-Capture" #: src/conf.c msgid "post_capture" msgstr "Nacherfassung" #: src/conf.c msgid "on_event_start" msgstr "bei Veranstaltungsbeginn" #: src/conf.c msgid "on_event_end" msgstr "am Ende der Veranstaltung" #: src/conf.c msgid "on_picture_save" msgstr "auf Bild speichern" #: src/conf.c msgid "on_area_detected" msgstr "On-Bereich erkannt" #: src/conf.c msgid "on_motion_detected" msgstr "bei Bewegung erkannt" #: src/conf.c msgid "on_movie_start" msgstr "beim Filmstart" #: src/conf.c msgid "on_movie_end" msgstr "am Ende des Films" #: src/conf.c msgid "on_camera_lost" msgstr "vor der Kamera verloren" #: src/conf.c msgid "on_camera_found" msgstr "vor der Kamera gefunden" #: src/conf.c msgid "picture_output" msgstr "Bildausgabe" #: src/conf.c msgid "picture_output_motion" msgstr "Bildausgabebewegung" #: src/conf.c msgid "picture_type" msgstr "Bildtyp" #: src/conf.c msgid "picture_quality" msgstr "Bildqualität" #: src/conf.c msgid "picture_exif" msgstr "bild exif" #: src/conf.c msgid "picture_filename" msgstr "Bild Dateiname" #: src/conf.c msgid "snapshot_interval" msgstr "Schnappschussintervall" #: src/conf.c msgid "snapshot_filename" msgstr "Snapshot-Dateiname" #: src/conf.c msgid "movie_output" msgstr "Filmausgabe" #: src/conf.c msgid "movie_output_motion" msgstr "Filmausgabebewegung" #: src/conf.c msgid "movie_max_time" msgstr "Film maximale Zeit" #: src/conf.c msgid "movie_bps" msgstr "Film bps" #: src/conf.c msgid "movie_quality" msgstr "Filmqualität" #: src/conf.c msgid "movie_codec" msgstr "Film-Codec" #: src/conf.c msgid "movie_duplicate_frames" msgstr "Film doppelte Bilder" #: src/conf.c msgid "movie_passthrough" msgstr "Film passthrough" #: src/conf.c msgid "movie_filename" msgstr "Filmdateiname" #: src/conf.c msgid "movie_extpipe_use" msgstr "Film Extpipe verwenden" #: src/conf.c msgid "movie_extpipe" msgstr "Film Extpipe" #: src/conf.c msgid "timelapse_interval" msgstr "Zeitrafferintervall" #: src/conf.c msgid "timelapse_mode" msgstr "Zeitraffermodus" #: src/conf.c msgid "timelapse_fps" msgstr "Zeitraffer fps" #: src/conf.c msgid "timelapse_codec" msgstr "Timelapse-Codec" #: src/conf.c msgid "timelapse_filename" msgstr "Zeitraffer Dateiname" #: src/conf.c msgid "video_pipe" msgstr "Videopipe" #: src/conf.c msgid "video_pipe_motion" msgstr "Video-Pipe-Bewegung" #: src/conf.c msgid "webcontrol_port" msgstr "Webcontrol-Port" #: src/conf.c msgid "webcontrol_ipv6" msgstr "webcontrol ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "webcontrol localhost" #: src/conf.c msgid "webcontrol_parms" msgstr "webcontrol parms" #: src/conf.c msgid "webcontrol_interface" msgstr "Webcontrol-Schnittstelle" #: src/conf.c msgid "webcontrol_auth_method" msgstr "webcontrol auth method" #: src/conf.c msgid "webcontrol_authentication" msgstr "Webcontrol-Authentifizierung" #: src/conf.c msgid "webcontrol_tls" msgstr "webcontrol tls" #: src/conf.c msgid "webcontrol_cert" msgstr "webcontrol cert" #: src/conf.c msgid "webcontrol_key" msgstr "Webcontrol-Schlüssel" #: src/conf.c msgid "webcontrol_header_params" msgstr "Webcontrol-Header-Parameter" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "Webcontrol-Sperrminuten" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "Webcontrol-Sperrversuche" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "Webcontrol-Sperre max. ips" #: src/conf.c msgid "stream_port" msgstr "Stream-Port" #: src/conf.c msgid "stream_localhost" msgstr "stream localhost" #: src/conf.c msgid "stream_auth_method" msgstr "Stream-Authentifizierungsmethode" #: src/conf.c msgid "stream_authentication" msgstr "Stream-Authentifizierung" #: src/conf.c msgid "stream_tls" msgstr "Stream tls" #: src/conf.c msgid "stream_header_params" msgstr "Stream-Header-Parameter" #: src/conf.c msgid "stream_preview_scale" msgstr "Stream-Vorschau skalieren" #: src/conf.c msgid "stream_preview_newline" msgstr "Stream Vorschau Newline" #: src/conf.c msgid "stream_preview_method" msgstr "Stream-Vorschau-Methode" #: src/conf.c msgid "stream_quality" msgstr "Stream-Qualität" #: src/conf.c msgid "stream_grey" msgstr "Strom grau" #: src/conf.c msgid "stream_motion" msgstr "Stream-Bewegung" #: src/conf.c msgid "stream_maxrate" msgstr "Stream maxrate" #: src/conf.c msgid "stream_limit" msgstr "Strombegrenzung" #: src/conf.c msgid "database_type" msgstr "Datenbanktyp" #: src/conf.c msgid "database_dbname" msgstr "Datenbank-Datenbankname" #: src/conf.c msgid "database_host" msgstr "Datenbank-Host" #: src/conf.c msgid "database_port" msgstr "Datenbank-Port" #: src/conf.c msgid "database_user" msgstr "Datenbankbenutzer" #: src/conf.c msgid "database_password" msgstr "Datenbankkennwort" #: src/conf.c msgid "database_busy_timeout" msgstr "Zeitlimit für ausgelastete Datenbank" #: src/conf.c msgid "sql_log_picture" msgstr "SQL Log Bild" #: src/conf.c msgid "sql_log_snapshot" msgstr "SQL-Protokoll-Snapshot" #: src/conf.c msgid "sql_log_movie" msgstr "sql log movie" #: src/conf.c msgid "sql_log_timelapse" msgstr "SQL Log Zeitraffer" #: src/conf.c msgid "sql_query_start" msgstr "SQL-Abfrage starten" #: src/conf.c msgid "sql_query_stop" msgstr "SQL-Abfrage zu stoppen" #: src/conf.c msgid "sql_query" msgstr "SQL-Abfrage" #: src/conf.c msgid "track_type" msgstr "Track-Typ" #: src/conf.c msgid "track_auto" msgstr "Track Auto" #: src/conf.c msgid "track_port" msgstr "Port verfolgen" #: src/conf.c msgid "track_motorx" msgstr "motorx verfolgen" #: src/conf.c msgid "track_motorx_reverse" msgstr "motorx rückwärts verfolgen" #: src/conf.c msgid "track_motory" msgstr "Bahnfahrt" #: src/conf.c msgid "track_motory_reverse" msgstr "Track Motory Reverse" #: src/conf.c msgid "track_maxx" msgstr "verfolgen maxx" #: src/conf.c msgid "track_minx" msgstr "Minx verfolgen" #: src/conf.c msgid "track_maxy" msgstr "verfolgen maxy" #: src/conf.c msgid "track_miny" msgstr "Miny verfolgen" #: src/conf.c msgid "track_homex" msgstr "verfolgen homex" #: src/conf.c msgid "track_homey" msgstr "heimelig verfolgen" #: src/conf.c msgid "track_iomojo_id" msgstr "verfolgen iomojo id" #: src/conf.c msgid "track_step_angle_x" msgstr "Spurschrittwinkel x" #: src/conf.c msgid "track_step_angle_y" msgstr "Spurschrittwinkel y" #: src/conf.c msgid "track_move_wait" msgstr "Track verschieben warten" #: src/conf.c msgid "track_speed" msgstr "Bahngeschwindigkeit" #: src/conf.c msgid "track_stepsize" msgstr "Schrittweite verfolgen" #: src/conf.c msgid "track_generic_move" msgstr "generische Bewegung verfolgen" #: src/conf.c msgid "camera" msgstr "Kamera" #: src/conf.c msgid "camera_dir" msgstr "Kamera dir" #: src/dbse.c msgid "Closing MySQL library" msgstr "Schließen der MySQL-Bibliothek" #: src/dbse.c msgid "Closing MariaDB library" msgstr "Schließen der MariaDB-Bibliothek" #: src/dbse.c msgid "Database closed" msgstr "Datenbank geschlossen" #: src/dbse.c msgid "Initializing database" msgstr "Datenbank wird initialisiert" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "" "Es kann keine Verbindung zur MySQL-Datenbank %s auf Host %s mit Benutzer %s " "hergestellt werden" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "MySQL-Fehler war %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "" "Kann keine Verbindung zur MariaDB-Datenbank %s auf Host %s mit Benutzer %s " "herstellen" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "MariaDB-Fehler war %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "Datenbank %s wird geöffnet" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "Die SQLite3-Datenbank %s kann nicht geöffnet werden. Fehler %d : %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "Beschäftigt-Zeitüberschreitung auf %d ms einstellen" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "Festlegen des Zeitlimits für besetzt fehlgeschlagen. Fehler %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "Verbindung zur PostgreSQL-Datenbank ' %s' fehlgeschlagen: %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "Datenbanktyp %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "Ausführen einer MySQL-Abfrage" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "MySQL-Abfrage fehlgeschlagen %s Fehlercode %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "" "Verbindung zur MySQL-Datenbank %s auf Host %s mit MySQL-Fehler des Benutzers " "%s kann nicht wiederhergestellt werdenwar %s" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "Erneute Verbindung zur MySQL-Datenbank '%s' erfolgreich" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "nach erneuter Verbindung MySQL-Abfrage fehlgeschlagen %s Fehlercode %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "Ausführen einer MariaDB-Abfrage" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "MariaDB-Abfrage fehlgeschlagen %s Fehlercode %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "Kann keine Verbindung zur MariaDB-Datenbank %s auf Host %s mit Benutzer %s " "MariaDB wiederherstellenFehler war %s" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "Erneute Verbindung zur MariaDB-Datenbank '%s' erfolgreich" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "" "nach Wiederverbindung der MariaDB-Abfrage fehlgeschlagen %s Fehlercode %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "Wieder mit PostgreSQL-Datenbank '%s' verbunden" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "Ausführen einer PostgreSQL-Abfrage" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "" "Es wird versucht, sich erneut mit der PostgreSQL-Datenbank '%s' zu " "verbinden: %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "PGSQL-Abfrage fehlgeschlagen: [%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "Ausführen von %s" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "SQLite3-Fehler %d : %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "Ignorieren einer leeren SQL-Abfrage" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "Externer Befehl ' %s' kann nicht gestartet werden" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "Externes Kommando ' %s' ausführen" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "Bild in Datei schreiben: %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "Film in Datei schreiben: %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "Bild in Datei gespeichert: %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "Gespeicherter Film in Datei: %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "Fehler beim Einfügen des Bildes in die Videopipe" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "Konnte keinen symbolischen Link erstellen [ %s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "Fehler beim Erstellen des Vorschau-Rohrnamens %d %s" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "Fehler beim Erstellen des Dateinamens base %d %s" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "Fehler beim Erstellen des Vorschaunamens %d %s" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "CLOSING: extpipe file desc %d, Fehlerzustand %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "pclose return: %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "Quell-FPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "Filmpfad: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "Kein Schreibzugriff auf das Zielverzeichnis %s" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "Pfad nicht gefunden, versucht es zu erstellen %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "Fehler beim Zugriff auf Pfad %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "Fehler beim Angeben der Befehlszeile: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "Pipe: %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt->moviefps: %d" #: src/event.c msgid "popen failed" msgstr "Popen scheiterte" #: src/event.c msgid "Using extpipe" msgstr "Extpipe verwenden" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "Fehler beim Schreiben in die Pipe, Statusfehler %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "Pipe %s wurde noch nicht erstellt oder geschlossen " #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "Der ogg-Container wird nicht mehr unterstützt. Wechsel zu mpeg4" #: src/event.c msgid "Running test of the various output formats." msgstr "Laufender Test der verschiedenen Ausgabeformate." #: src/event.c msgid "Error opening context for movie output." msgstr "Fehler beim Öffnen des Kontexts für die Filmausgabe." #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffOpen Open Error beim Erstellen einer (Bewegungs-) Datei [ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "" "Der SWF-Container für Zeitraffer wird nicht mehr unterstützt. Mpg container " "benutzen." #: src/event.c msgid "Timelapse using mpg codec." msgstr "Zeitraffer mit mpg Codec." #: src/event.c msgid "Events will be appended to file" msgstr "Ereignisse werden an die Datei angehängt" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "Timelapse mit MPEG4-Codec." #: src/event.c msgid "Events will be trigger new files" msgstr "Ereignisse lösen neue Dateien aus" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffOpen Open Error beim Erstellen einer (Zeitraffer-) Datei [ %s]" #: src/event.c msgid "Error encoding image" msgstr "Fehler beim Codieren des Bildes" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "Fehler beim Zuweisen des Arbeitsspeichers für den Codec-Namen" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "Die angegebene Bildrate ist für den angegebenen ffmpeg-Filmtyp zu hoch." "Wählen Sie einen anderen ffmpeg-Container oder eine niedrigere Framerate." #: src/ffmpeg.c msgid "Error setting base file name" msgstr "Fehler beim Festlegen des Basisdateinamens" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "Fehler beim Anhängen des Zeitraffers für den Codec %s" #: src/ffmpeg.c msgid "Error setting file name" msgstr "Fehler beim Einstellen des Dateinamens" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "Der Codec-Optionswert %s wird nicht unterstützt" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "Konnte den Codec nicht bekommen" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "Fehler beim Senden des Frames für die Codierung: %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "Empfangspaket über EAGAIN mit -2-Code: %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "Fehler beim Empfang des codierten Paketvideos: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "Fehler beim Codieren des Videos: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "Fehler beim Codieren des Videos" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "" "PTS % Basis PTS % ms Intervall % Zeitbasis %d- %d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "SCHLECHTES TIMING!! Frame übersprungen." #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "" "PTS % Basis PTS % ms Intervall % Zeitbasis %d- %d " "Änderung%d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s Codec vbr / crf / Bitrate: %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "Der bevorzugte Codec %s wurde auf die schwarze Liste gesetzt: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "Codec %s nicht gefunden" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "Codec %s verwenden" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "Stream konnte nicht zugeordnet werden" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "Codec konnte nicht zugeordnet werden!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "Geringe fps. Kodierung von %d Frames in einen %d Frames Container." #: src/ffmpeg.c msgid "Unable to set quality" msgstr "Qualität kann nicht eingestellt werden" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "Gemeldete FPS Unterstützt %d / %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "Codec %s konnte nicht geöffnet werden" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "Kopieren der Decoderparameter fehlgeschlagen !: %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "Rahmen konnte nicht zugeordnet werden" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "konnte Puffer %s nicht zuordnen" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "Fehler beim Öffnen der Datei %s" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "Erlaubnis verweigert. %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "Fehler beim Öffnen der Datei %s" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "Ffmpeg-Header %s konnte nicht geschrieben werden" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "Fehler beim Aufrufen des Entleerungsmodus: %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "Fehler beim Entleeren des Codecs: %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "Fehler beim Schreiben des leeren Videoframes" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "Fehler beim Kodieren des Bildes" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "Fehler beim Schreiben des Videorahmens" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet: %s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "Fehler beim Schreiben des Videorahmens: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "RTSP-Kontext nicht verfügbar." #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "Die RTSP-Kamera ist nicht für den Durchgang bereit." #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "Durchreichemodus aktiviert. Wechsel zum MP4-Container." #: src/ffmpeg.c msgid "Could not get codec!" msgstr "Codec konnte nicht abgerufen werden!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "Codec-Parameter können nicht kopiert werden" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "Pass-Through deaktiviert. ffmpeg zu alt" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "Durchgangsbach geöffnet" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "ffmpeg libavcodec version %d. %d. %d libavformat version %d. %d. %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "av lockmgr register failed ( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "Keine ffmpeg-Funktionalität enthalten" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "Zurücksetzen des av lockmgr-Registers bei Bereinigung fehlgeschlagen" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "Ausgabekontext konnte nicht zugeordnet werden" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "Konnte Durchgang nicht einrichten!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "Stream konnte nicht eingestellt werden" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "Fehler beim Löschen des Codecs" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "Übermäßige Versuche, das gepufferte Paket zu löschen" #: src/ffmpeg.c msgid "Buffered packet" msgstr "Gepuffertes Paket" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s: Der angegebene JPEG-Puffer war zu klein" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "Ungültige JPEG-Bildabmessungen" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "JPEG-Bildgröße %dx %d, JPEG war %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "Unerwartetes Rückrufereignis für Kamerasteuerung empfangen, 0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "" "Eine hohe Bildrate kann Probleme bei der Belichtung von Bildern verursachen" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "" "Wenn die automatische Belichtung nicht funktioniert, versuchen Sie es mit " "einer niedrigeren Bildrate." #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "Fehler beim Erstellen der MMAL-Kamerakomponente %s" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "MMAL-Kamera %s hat keine Ausgangsports" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "Steuerport kann nicht aktiviert werden: Fehler %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "MMAL-Einrichtung ohne Auffüllen fehlgeschlagen" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "Kamera-Videoformat konnte nicht eingestellt werden" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "Kamerakomponente konnte nicht aktiviert werden" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "MMAL-Kamerakomponente erstellt" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "Die Erstellung des MMAL-Kamerapufferpools ist fehlgeschlagen" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "Erstellung der MMAL-Kamerapufferwarteschlange fehlgeschlagen" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "" "Der erforderliche Puffer %d konnte nicht aus der Poolwarteschlange abgerufen " "werden" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "Senden eines Puffers an Port nicht möglich ( %d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "" "MMAL-Kamerathread wird gestartet ... für Kamera ( %s) von %dx %d bei %d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "Kameraparams konnten nicht zugeordnet werden" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "Aktivierung des MMAL-Kameraerfassungsports fehlgeschlagen" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "Start der MMAL-Kameraerfassung fehlgeschlagen" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "MMAL-Kamera bereinigen" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %d kennzeichnet %08x Größe %d / %d bei %08x, Bildgröße = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "Es kann kein Puffer an den Kamera-Videoanschluss zurückgegeben werden" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "Ändern der Größe des Pre-Capture-Puffers auf %d Elemente" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "Prozess-ID-Datei (PID-Datei) entfernt." #: src/motion.c msgid "Error removing pid file" msgstr "Fehler beim Entfernen der PID-Datei" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "Logdatei schließen ( %s)." #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "Bewegung erkannt - Startereignis %d." #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "%d Füllbilder wurden zum Film hinzugefügt" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "Kameratyp kann nicht bestimmt werden (MMAL, Netcam, V4L2, BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "Öffnen der Datenschutzmaskendatei" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "Öffnen der hochauflösenden Datenschutzmaskendatei" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "Fehler beim Öffnen der Maskendatei %s" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "Fehler beim Lesen des Masken-Datenschutzbilds. Maskendatenschutz deaktiviert." #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "Maskendatenschutzdatei \" %s \" geladen." #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "Ungültige Textskala. Angepasst an %d" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "Kamera %d gestartet: Bewegungserkennung %s" #: src/motion.c msgid "Disabled" msgstr "Behindert" #: src/motion.c msgid "Enabled" msgstr "Aktiviert" #: src/motion.c msgid "Pass-through processing disabled." msgstr "Pass-Through-Verarbeitung deaktiviert." #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "Ungültige Konfigurationsdimensionen %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "Verwenden der Standardabmessungen %dx %d" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "Die angeforderte Bildbreite ( %d) ist nicht modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "Anpassen der Breite auf das nächsthöhere Vielfache von 8 ( %d)." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "Die angeforderte Bildhöhe ( %d) ist nicht modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "Anpassen der Höhe auf das nächsthöhere Vielfache von 8 ( %d)." #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "Das ursprüngliche Bild konnte nicht von der Kamera abgerufen werden " #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "" "Die Bewegung verwendet weiterhin die Breite und Höhe der Konfigurationsdatei " "(en)." #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "Motion unterstützt nur width und height modulo 8" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "Die angeforderte Bildbreite ( %d) oder -höhe ( %d) ist nicht modulo 8." #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "Bewegung unterstützt nur Breite und Höhe größer oder gleich 64 %dx %d" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "Substream nicht verfügbar. Bildgrößen nicht modulo 16." #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "" "Das Webp-Bildformat ist nicht verfügbar, es wird kein JPEG-Format verwendet" #: src/motion.c msgid "Error capturing first image" msgstr "Fehler beim Aufnehmen des ersten Bildes" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "Öffnen des Video-Loopback-Geräts für normale Bilder" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "Fehler beim Öffnen des Video-Loopbacks für normale Bilder" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "Video-Loopback-Gerät für Videos öffnen" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "Fehler beim Öffnen der Video-Loopback-Funktion für Videos" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "Fehler beim Lesen des Maskenbildes. Maskenfunktion deaktiviert." #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "Maskendatei \" %s\" geladen." #: src/motion.c msgid "Emulating motion" msgstr "Bewegung nachahmen" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "Bewegung im Bereich %d erkannt." #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "Wiederholen, bis die Verbindung zur Kamera hergestellt ist" #: src/motion.c msgid "Camera has become available." msgstr "Kamera ist verfügbar geworden." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "Motion wird neu gestartet.\n" "Die angeforderte Bildbreite (%d) oder -höhe (%d) ist nicht Modulo 8." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Motion wird neu gestartet.\n" "Motion unterstützt nur Breite und Höhe größer oder gleich 64 %dx%d" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "Motion wird neu gestartet.\n" "Höhe oder Breite hat sich auf der Kamera geändert." #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "Motion wird neu gestartet.\n" "Die hohe Auflösung hat sich auf der Kamera geändert." #: src/motion.c msgid "Video signal re-acquired" msgstr "Videosignal erneut erfasst" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "Schwerwiegender Fehler des Videogeräts - Schließen des Videogeräts" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "" "Starten Sie den Motion-Thread neu, um alle Bildpuffer neu zu initialisieren" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "Videosignal verloren - Graues Bild wird hinzugefügt" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "" "Videosignal immer noch verloren - Es wurde versucht, das Videogerät zu " "schließen" #: src/motion.c msgid "Lightswitch detected" msgstr "Lichtschalter erkannt" #: src/motion.c msgid "Switchfilter detected" msgstr "Schalterfilter erkannt" #: src/motion.c msgid "micro-lightswitch!" msgstr "Mikrolichtschalter!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "Ende des Ereignisses %d" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "Raw changes: %5d - Änderungen nach ' %s': %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr " - Beschriftungen: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "Änderungen: %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr " - Geräuschpegel: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr " - Schwelle: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "Ungültiges Zeitraffermodus-Argument ' %s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%: s Standardmäßig wird der manuelle Zeitraffermodus verwendet" #: src/motion.c msgid "Thread exiting" msgstr "Thread wird beendet" #: src/motion.c msgid "Motion going to daemon mode" msgstr "Motion wechselt in den Daemon-Modus" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "" "Bewegung beenden, Prozess-ID-Datei (PID-Datei) %s kann nicht erstellt werden" #: src/motion.c msgid "Could not change directory" msgstr "Verzeichnis konnte nicht geändert werden" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "Erstellt die Prozess-ID-Datei %s. Prozess-ID ist %d" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "" "Camara-IDs sind nicht eindeutig oder haben Werte über 32.000. Zurückgreifen " "aufThread-Nummern" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2: verfügbar" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2: nicht verfügbar" #: src/motion.c msgid "bktr : available" msgstr "bktr: verfügbar" #: src/motion.c msgid "bktr : not available" msgstr "bktr: nicht verfügbar" #: src/motion.c msgid "webp : available" msgstr "webp: verfügbar" #: src/motion.c msgid "webp : not available" msgstr "webp: nicht verfügbar" #: src/motion.c msgid "mmal : available" msgstr "mmal: verfügbar" #: src/motion.c msgid "mmal : not available" msgstr "mmal: nicht verfügbar" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg: verfügbar" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg: nicht verfügbar" #: src/motion.c msgid "mysql : available" msgstr "MySQL: verfügbar" #: src/motion.c msgid "mysql : not available" msgstr "Mysql: nicht verfügbar" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB: verfügbar" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB: nicht verfügbar" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3: verfügbar" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3: nicht verfügbar" #: src/motion.c msgid "pgsql : available" msgstr "pgsql: verfügbar" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql: nicht verfügbar" #: src/motion.c msgid "nls : available" msgstr "nls: verfügbar" #: src/motion.c msgid "nls : not available" msgstr "nls: nicht verfügbar" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "Verwenden der Standardprotokollstufe ( %s) ( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "Protokollierung in Datei ( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "Bewegung beenden, Protokolldatei %s kann nicht erstellt werden" #: src/motion.c msgid "Logging to syslog" msgstr "Protokollierung in Syslog" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "Motion %s gestartet" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "Standardprotokolltyp ( %s) verwenden" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "Log-Typ ( %s) verwenden Log-Level ( %s)" #: src/motion.c msgid "Motion running as daemon process" msgstr "Motion wird als Daemon-Prozess ausgeführt" #: src/motion.c msgid "Motion running in setup mode." msgstr "Bewegung läuft im Setup-Modus." #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "Kamera-ID: %d stammt von %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "Kamera-ID: %d Kameraname: %s Dienst: %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "Kamera-ID: %d Kameraname: %s Gerät: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "" "Stream-Port-Nummer %d für Thread %d steht im Konflikt mit dem Steuerport" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "Stream-Funktion für Thread %d ist deaktiviert." #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "Stream-Port-Nummer %d für Thread %d steht in Konflikt mit Thread %d" #: src/motion.c msgid "Restarting motion." msgstr "Bewegung neu starten." #: src/motion.c msgid "Motion restarted" msgstr "Die Bewegung wurde neu gestartet" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "" "Thread %d - Watchdog-Timeout. Versuch, einen ordnungsgemäßen Neustart " "durchzuführen" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "Thread %d - Watchdog-Timeout wurde NICHT neu gestartet und beendet!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "Thread %d - Reinigungsfaden." #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "" "DEBUG-1-Threads, auf denen %d Bewegungsthreads mit %d ausgeführt werden, " "beenden %d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "Warten, bis die Threads beendet sind, pid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "Bewegungs-Thread %d neu starten" #: src/motion.c msgid "Threads finished" msgstr "Themen beendet" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "Bewegung wird beendet" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "Ungültige URL. Werte können nicht analysiert werden." #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "Kamerahandler-Thread [ %d] gestartet" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "Schließen des Netcam-Sockets nach Ablauf der Keep-Alive-Zeit (Kamera " "gesendet Feld schließen). EINErneutes Verbinden sollte passieren." #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "Wiedereröffnung der Kamera (kein Streaming)" #: src/netcam.c msgid "camera re-connected" msgstr "Kamera wieder angeschlossen" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "Nicht erkannter Bildheader ( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "Fehler im Header ( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "Kamera wieder öffnen (Streaming)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "Fehler beim Abrufen des JPEG-Bildes" #: src/netcam.c msgid "Trying to re-connect" msgstr "Es wird versucht, eine Verbindung herzustellen" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "Netcam-Kamerahandler: Fertig stellen, beenden" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "Keine Antwort vom Kamerahandler - er muss bereits gestorben sein" #: src/netcam.c msgid "called with no data in buffer" msgstr "ohne Daten im Puffer aufgerufen" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "Netzwerkkamera startet für Kamera ( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "Ungültiger Netcam-Proxy ( %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "Benutzername / Passwort für eine Proxy-URL nicht zulässig" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "Ungültiger Netcam-Dienst ' %s' " #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "Ungültige Netcam-URL für Kamera ( %s)" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "Der Netcam-HTTP-Parameter ' %s' wird in Flags konvertiert: HTTP / 1.0: %s " "HTTP / 1.1: %s Keep-%s lebt." #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "ruft jetzt netcam setup html () auf" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "ruft jetzt netcam setup ftp auf" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "ruft jetzt netcam setup file () auf" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "ruft jetzt netcam setup mjpg () auf" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "Ungültiger Netcam-Dienst '%s' - muss mjpeg, ftp, mjpg oder jpeg sein." #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "Fehler beim Versuch, das erste Bild zu lesen - retval: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "Fehler bei der libjpeg-Dekomprimierung im ersten Frame - aufgeben!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "Breite / Höhe ( %dx %d) muss ein Vielfaches von 8 sein" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "Fehler beim Starten des Kamera-Handler-Threads [ %d]" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "recv fehlgeschlagen in ftp bekommen mehr" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "Serverantwort: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "Senden fehlgeschlagen in FTP Benutzer senden" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "Senden im FTP fehlgeschlagen" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "Senden fehlgeschlagen beim Beenden von FTP" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "gethostbyname ist bei der FTP-Verbindung fehlgeschlagen" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "gethostbyname Adressenkonflikt bei FTP-Verbindung" #: src/netcam_ftp.c msgid "socket failed" msgstr "Socket fehlgeschlagen" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "Verbindung konnte nicht hergestellt werden" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "FTP-Server fragt anonym nach ACCT" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "Einstellung der Socket-Option SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "Senden fehlgeschlagen bei FTP-Verbindung" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "Ungültige Antwort an PASV" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "Fehler beim Herstellen einer Datenverbindung" #: src/netcam_ftp.c msgid "bind failed" msgstr "Binden fehlgeschlagen" #: src/netcam_ftp.c msgid "listen failed" msgstr "Hören fehlgeschlagen" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "Senden fehlgeschlagen in FTP Get Socket" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "akzeptiere in ftp get socket" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "Beim FTP-Lesen ist recv fehlgeschlagen" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "FTP get Socket fehlgeschlagen" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "Fehler beim Senden von TYP I an den FTP-Server" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "fehlerhafte Token-Inhaltslänge, aber Wert %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "Inhaltslänge %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "Inhaltstyp %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "Fehler beim Lesen des Bildkopfes, Streaming-Modus (1). Null-Header." #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "" "Fehler beim Lesen des Bildkopfes, Streaming-Modus (1). Unbekannter Header ' " "%s'" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "Fehler beim Lesen des Bildkopfes (2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "Header nicht JPEG" #: src/netcam_http.c msgid "Content-Length 0" msgstr "Inhaltslänge 0" #: src/netcam_http.c msgid "Found image header record" msgstr "Bildkopfsatz gefunden" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "Fehler beim Senden der Verbindungsanforderung" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "Erster Header empfangen (' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "Fehler beim Lesen des ersten Headers ( %s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "HTTP-Ergebniscode %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "" "Das netcam Keep-Alive-Flag wurde entfernt, da die HTTP-Verbindung offenbar " "geschlossen ist." #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "Nicht-Streaming-Kamera (Keep-Alive-Set)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "Nicht-Streaming-Kamera (Keep-Alive nicht eingestellt)" #: src/netcam_http.c msgid "Streaming camera" msgstr "Streaming-Kamera" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "Grenzzeichenfolge [ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "Grenzzeichenfolge nicht im Header gefunden" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "" "Streaming-Kamera wahrscheinlich mit MJPG-Blöcken, eventuell mit mjpg: //" "netcam url." #: src/netcam_http.c msgid "Unrecognized content type" msgstr "Unbekannter Inhaltstyp" #: src/netcam_http.c msgid "Content-length present" msgstr "Inhaltslänge vorhanden" #: src/netcam_http.c msgid "Content-length 0" msgstr "Inhaltslänge 0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "Conn gefunden: Header schließen (' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "" "Es wurden sowohl der Header \"Connection: Keep-Alive\" als auch der Header " "\"Connection: Close\" empfangen.Bewegung entfernt das Keepalive." #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "" "Es wurden sowohl der Header \"Connection: Keep-Alive\" als auch der Header " "\"Connection: Close\" empfangen.Die Bewegung geht unverändert weiter." #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "Erhielt ein Keep-Alive-Feld in dieser Gruppe von Headern." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "Es wurde kein Header \"Verbindung: Keep-Alive\" oder \"Verbindung: Schließen" "\" empfangen. \n" " Bewegung entfernt das Keepalive." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "Es wurde kein Header \"Verbindung: Keep-Alive\" oder \"Verbindung: Schließen" "\" empfangen. \n" " Die Bewegung geht unverändert weiter." #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "Das Netcam-Keep-Alive-Flag wurde entfernt, da der Header \"Connection: close" "\" empfangen wurde. \n" " Netcam unterstützt Keep-Alive nicht. Die Bewegung wird ohne Keep-Alive " "fortgesetzt." #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "Keep-Alive hat das Ende der Gültigkeitsdauer erreicht. \n" " Motion schließt netcam und setzt Keep-Alive mit einem neuen Socket fort." #: src/netcam_http.c msgid "disconnect" msgstr "trennen" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo () ist fehlgeschlagen ( %s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "Trennen der Netcam (1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "netcam wird getrennt, da Keep-Alive nicht gesetzt ist." #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "" "Ohne Keepalive ist der Versuch, einen Socket zu erstellen, fehlgeschlagen." #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "Ohne Keepalive wurde der neue Socket fd %d erstellt" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "mit Keepalive-Set, ungültiger Socket. Dies könnte das erste Mal sein. " "Ein ... Erstellenneue fehlgeschlagen." #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "" "mit Keepalive-Set, ungültiger Socket. Dies könnte beim ersten Mal ein neuer " "erstellt werdeneine mit fd %d" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "SO ist KEEPALIVE %s" #: src/netcam_http.c msgid "ON" msgstr "AUF" #: src/netcam_http.c msgid "OFF" msgstr "AUS" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "SO KEEPALIVE auf Steckdose setzen." #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "fcntl (1) am Socket" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "fcntl (2) am Socket" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "connect () fehlgeschlagen ( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "netcam trennen (4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "Zeitüberschreitung bei Verbindung ()" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "netcam trennen (2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "getsockopt nach connect" #: src/netcam_http.c msgid "connect returned error" msgstr "Connect gab einen Fehler zurück" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "netcam trennen (3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "Erweitern des Puffers von [ %d / %d] auf [ %d / %d] Byte." #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "" "Potenzielle Trenngrenze - %d Zeichen wurden gelöscht, %d neu positioniert" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "recv () schlägt nach der Grenzzeichenfolge fehl" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "Lassen Sie die Netcam angeschlossen." #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "kurz vor dem Verbindungsaufbau, Uhrzeit # %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "Kamera konnte nicht geöffnet werden - überprüfen Sie Ihre Konfiguration und " "überprüfen Sie, ob die Netzkamera online ist" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "Fehler beim Lesen des ersten Headers - erneuter Versuch" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "Fehler beim Lesen des ersten Kamerakopfes - vorerst aufgegeben" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "Netcam hat Flags: HTTP / 1.0: %s HTTP / 1.1: %s Keep-Alive %s." #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "" "Das Netcam-Keepalive-Flag wurde aufgrund des Proxy-Satzes entfernt. Proxy " "ist nicht kompatibel mitBleib am Leben." #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "Fehler beim Lesen des ersten Stream-Headers - vorerst aufgegeben" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "verbunden, werde Bild lesen." #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "Lesefehler beim erneuten Verbindungsaufbau." #: src/netcam_http.c msgid "lost the cam." msgstr "habe die cam verloren." #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "Nachgefüllter Puffer mit [ %d] Bytes aus dem Netzwerk." #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "Liest [ %d / %d] Header-Bytes." #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "Ungültiger Header empfangen, Verbindung wird wiederhergestellt" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "Liest [ %d / %d] Chunk-Bytes, insgesamt [ %d / %d]" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "Chunk abgeschlossen, Puffer verwendet [ %d] Bytes." #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "Bild vollständig, Puffer verwendet [ %d] Bytes." #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "verbunden, um MJPG-Chunks zu lesen und zu dekodieren." #: src/netcam_http.c msgid "Begin" msgstr "Start" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "stat ( %s) Fehler" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]! = letzte st mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "Wartezeit für neues Dateibild" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "Wartezeit für neues Dateibild " #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "Verarbeiten eines neuen Dateibildes - st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "Fehler beim Öffnen ( %s): %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "Lesefehler ( %s): %d" #: src/netcam_http.c msgid "End" msgstr "Ende" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> Datei-> Pfad %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "Nicht genügend Daten von der Netcam." #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> JPEG-Fehler %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "*** Neue Bildverzögerung erfolgreich ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "JPEG-Fehler %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "Verarbeitung von JPEG-Bildern - Länge des Inhalts %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "Die Breite / Höhe der Kamera stimmt nicht mit dem JPEG-Bild überein - %dx " "%d, JPEG %dx %d erwartetretval %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s: Größe des Paketarrays auf %d geändert" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s: av Kopierpaket: %s, Interrupt: %s" #: src/netcam_rtsp.c msgid "True" msgstr "Wahr" #: src/netcam_rtsp.c msgid "False" msgstr "Falsch" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: Paket mit ungültigen Daten wird ignoriert" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: Rec-Frame-Fehler: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "Paket mit ungültigen Daten wird ignoriert" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "Fehler beim Dekodieren des Pakets: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "%s: Fehler beim Übertragen der decodierten HW in den Systemspeicher" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "Fehler beim Senden des Pakets an den Codec: %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "Fehler beim Dekodieren des Videopakets: Kopieren in den Puffer" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: HW-Geräte: " #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s (verfügbar)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s (nicht implementiert)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s: Netcam-Decoder %s deaktiviert." #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "Vaapi-Pixelformat konnte nicht abgerufen werden" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "Cuda-Pixelformat konnte nicht abgerufen werden" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s: Unterbrochen." #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: Fehlgeschlagen" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s: Decoder %s hat nicht funktioniert." #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "" "%s: Ignorieren und Entfernen des vom Benutzer angeforderten Decoders %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s: Vaapi-Decoder initialisieren" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: Vaapi-HW-Gerät kann nicht gefunden werden" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s: Initialisieren des cuda-Decoders" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: cuda HW-Gerät kann nicht gefunden werden" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s: Initialisieren des Decoders" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s: Decoder %s verwenden" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: Decoder geöffnet" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s: Zeitüberschreitung beim Lesen der Kamera ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s: Zeitüberschreitung der Kamera ( %s)" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "Swsframe kann nicht zugeordnet werden." #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "Swsframe kann nicht zugeordnet werden." #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "Skalierungskontext kann nicht zugeordnet werden." #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "Fehler beim Bestimmen der Bildgröße" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "Fehler beim Zuweisen des Bildes in: %s" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "Fehler beim Zuweisen des Bildausgangs: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "Fehler beim Ändern der Größe / Neuformatierung: %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "Fehler beim Einfügen des Frames in den Ausgabepuffer: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s: Unterbrochen" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: av Leserahmen: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: Übermäßige Versuche, Daten von Kamera %d abzurufen" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "" "%s: Erfassungsrate nicht in den netcam-Parametern angegeben. Verwenden von %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s: Erfassungsrate nicht in den netcam-Parametern angegeben. Bildrate %d . " "verwenden" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "Die Netzwerkkamera sendet Bilder in einem anderen Format" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "größe als in der config angegeben und auch a " #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "anderes Bildformat. Das Bild wird" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "transcodiert zu YUV420P und in die gewünschte Größe" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "in der Konfigurationsdatei. Wenn möglich, ändern Sie netcam auf" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "im YUV420P-Format und in der gewünschten Größe im" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "config, um möglicherweise die CPU-Auslastung zu senken." #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "Größe als in der Konfigurationsdatei angegeben." #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "Das Bild wird in die Größe transkodiert " #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "in der Konfiguration angefordert. Wenn möglich ändern" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "Netcam oder Konfiguration zur Angabe der gleichen Größe" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "um möglicherweise die CPU-Auslastung zu senken." #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "Netcam: %dx %d => Konfiguration: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "Das gesendete Bild wird gesendet " #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "trancodiert zu YUV420P. Wenn möglich netcam wechseln " #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "" "Bildformat auf YUV420P, um möglicherweise die CPU-Auslastung zu senken." #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: Einstellung von rtsp/rtmp" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: Eingabeformat einstellen mjpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: Eingabeformat video4linux2 einstellen" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: Filmdatei einrichten" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s: Einrichtung von %s" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: Option: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "V4l2 über netcam einrichten" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "Datei über netcam einrichten" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "Einrichtung von %s über Netcam" #: src/netcam_rtsp.c msgid "highres" msgstr "hochauflösend" #: src/netcam_rtsp.c msgid "norm" msgstr "Norm" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "%s Stream wird eingerichtet." #: src/netcam_rtsp.c msgid "Unknown" msgstr "Unbekannte" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "Stream zur Weitergabe kopiert" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "Null-Pfad für die Verbindung übergeben" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s: Kamera kann nicht geöffnet werden ( %s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s: Geöffnete Kamera ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s: Stream-Informationen konnten nicht gefunden werden: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s: Codec-Kontext kann nicht geöffnet werden: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s: Die Kamerabildgröße ist ungültig" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s: Frame kann nicht zugeordnet werden." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s: Kopieren des Streams für die Weiterleitung fehlgeschlagen." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s: Erstes Bild konnte nicht gelesen werden" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s: Kamera ( %s) angeschlossen" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s: Netcam-Aufnahmerate beträgt %d." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s: Kameraquelle ist %d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s: Die FPS der Kameraquelle kann nicht bestimmt werden." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s: Die Aufnahmerate ist geringer als die FPS der Kamera." #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s: Es treten Decodierungsfehler auf." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "" "%s: Es wird eine etwas höhere Aufnahmerate als die FPS der Kamera empfohlen." #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s: Verbindung zur Kamera wird wiederhergestellt ...." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s: Die Kamera wurde nicht erneut verbunden." #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s: Überprüft alle 10 Sekunden, ob eine Kamera vorhanden ist." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s: Kamerahandler-Thread [ %d] gestartet" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s: Handler-Schleife beendet." #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s: Fehler beim Starten des Handler-Threads" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s: Es wird auf das erste Bild vom Handler gewartet." #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "RTSP-Kontext kann nicht erstellt werden" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "RTSP-Kontext kann nicht erstellt werden" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "Keine FFmpeg-Unterstützung" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s: Netzwerkkamera wird heruntergefahren." #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s: Keine Antwort vom Handler-Thread." #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "Normale Auflösung: Fahren Sie den Computer vollständig herunter." #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "Hohe Auflösung: Herunterfahren abgeschlossen." #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "Festlegen von EXIF ​​auf Webblock nicht möglich" #: src/picture.c msgid "libwebp version error" msgstr "libwebp Versionsfehler" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "Fehler bei der Zuweisung des libwebp-Bildpuffers" #: src/picture.c msgid "libwebp image compression error" msgstr "libwebp Bildkomprimierungsfehler" #: src/picture.c msgid "unable to assemble webp image" msgstr "Webp-Image kann nicht zusammengestellt werden" #: src/picture.c msgid "unable to save webp image to file" msgstr "Das Webbild kann nicht in einer Datei gespeichert werden" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "Bild kann nicht in Datei %s geschrieben werden - Zugriffsrechte auf " "Zielverzeichnis prüfen \n" "Der Thread wird aufgrund dieses schwerwiegenden Fehlers beendet" #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "Bild kann nicht in Datei %s geschrieben werden" #: src/picture.c msgid "Error getting PGM vars." msgstr "Fehler beim Abrufen der PGM-Variablen." #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "Dies ist keine pgm-Datei, beginnt mit ' %s'" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "Magic %s: Breite %s(%d): Höhe %s(%d): MaxVal: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "Fehler beim Lesen der Bilddaten aus der PGM-Datei" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "" "Die angegebene Maskendatei hat nicht die gleiche Größe wie das Bild von der " "Kamera." #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "" "Es wurde versucht, die Größe des Maskenbilds von %dx %d auf %dx %d zu ändern" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "" "Maskendatei %s kann nicht geschrieben werden - Zugriffsrechte auf " "Zielverzeichnis prüfen" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "Maskendatei %s kann nicht geschrieben werden" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "Fehler beim Schreiben der Standardmaske als PGM-Datei" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "Leere Maske %s erstellen \n" "Bitte bearbeiten Sie diese Datei und führen Sie motion erneut aus, um die " "Maskenfunktion zu aktivieren" #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "Konfigurationsoption \"Drehen\" kein Vielfaches von 90: %d" #: src/track.c msgid "internal error" msgstr "interner Fehler" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "interner Fehler, %hu ist kein bekannter Track-Typ" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "port %s dev fd %i, motor %hu befehl %hu daten %hu" #: src/track.c msgid "Status byte timeout!" msgstr "Statusbyte-Timeout!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "Versuchen Sie, das serielle Gerät %s zu öffnen" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "Serielles Gerät %s kann nicht geöffnet werden" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "Serielles Gerät %s kann nicht initialisiert werden" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "Das serielle Gerät %s wurde geöffnet und initialisiert, fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "Noch kein Gerät %s gestartet, versuche es mit Stepper Center ()" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "Fehler beim Initialisieren des Schrittgeräts auf %s, fd [ %i]." #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "erfolgreich, Gerät gestartet %s, fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "SENDS-Port %s dev fd %i, Motor %hu-Befehl %hu-Daten %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "Befehl return %d" #: src/track.c msgid "Problem opening servo!" msgstr "Problem beim Öffnen des Servos!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d, cent-> y %d, reversex %d, reversey %d manuell %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d Wert außerhalb des Bereichs! ( %d - %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d Wert außerhalb des Bereichs! ( %d - %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "X Versatz %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "X cent-> x %d, cent-> y %d, reversex %d, reversey %d motorx %d daten %d " "befehl%d" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Y Versatz %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Y cent-> x %d, cent-> y %d, reversex %d, reversey %d motory %d data %d befehl" "%d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "X-Versatz %d, Y-Versatz %d, x-Position %d. Y-Position %d, Reversex %d, Trikot" "%d, Schrittweite %d" #: src/track.c msgid "Return byte timeout!" msgstr "Return-Byte-Timeout!" #: src/track.c msgid "Unable to set camera speed" msgstr "Kamerageschwindigkeit kann nicht eingestellt werden" #: src/track.c msgid "succeed" msgstr "gelingen" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "" "Pwc-Kamera konnte nicht in Ausgangsposition zurückgesetzt werden! Grund" #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "fehlgeschlagen VIDIOCPWCMPTGRANGE" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "Fehler beim Schwenken / Neigen der PWC-Kamera! Grund" #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "" "UVC-Kamera konnte nicht in Ausgangsposition zurückgesetzt werden! Grund" #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "UVC-Kamera in Ausgangsposition zurücksetzen" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl querycontrol" #: src/track.c msgid "Getting camera range" msgstr "Kamerabereich abrufen" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "" "EINGANGSPARAM ABS Schwenk min %d, Schwenk max %d, Neigung min %d, Neigung " "max %d " #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "EINGABEPARAMETER ABS X Engel %d, Y Engel %d " #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "Bewegen Sie für SET ABS X %d und Y %d" #: src/track.c msgid "Failed to move UVC camera!" msgstr "Bewegen der UVC-Kamera fehlgeschlagen!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "Gefunden MINMAX = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "Vor ABS Y Angel: x = %d, Y = %d, " #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "Nach ABS Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "" "Für SET REL Schwenk min %d, Schwenk max %d, Neigung min %d, Neigung max %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "Für SET REL Track Pan Angel %d, Track Tilt Angel %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "Für SET REL X %d verschieben, Y %d verschieben" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr " dev %d, addr = %d, control S = %d, Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr " dev %d, addr = %d, control S = %d, Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "Vor REL Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "Nach REL Y Angel: x = %d, Y = %d" #: src/translate.c msgid "Language: English" msgstr "Sprache: Deutsch" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "%llu Bytes Speicher konnten nicht zugeordnet werden!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "" "Warnung! Die Funktion %s versucht, die Größe des Speicherblocks bei %p auf 0 " "Byte zu ändern!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "Die Größe des Speicherblocks konnte bei Offset %p zu %llu Bytes (Funktion " "%s) nicht geändert werden!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "Problem beim Erstellen des Verzeichnisses %s" #: src/util.c #, c-format msgid "creating directory %s" msgstr "Verzeichnis %s wird erstellt" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "Fehler beim Öffnen der Datei %s im Modus %s" #: src/util.c msgid "Error closing file" msgstr "Fehler beim Schließen der Datei" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbeventid} wird nicht unterstützt. Verwenden Sie eventid." #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "ungültiges Schlüsselwort für Formatbezeichner %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "Threadname %s kann nicht festgelegt werden" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "FFMPEG-Version zu alt. Pass-Through-Verarbeitung deaktivieren." #: src/util.c msgid "pass-through enabled." msgstr "Durchleitung aktiviert." #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "Fehler beim Einstellen des Parameters >%s<" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "Geparst: >%s< >%s<" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "Geparst: >geschwärzt< >geschwärzt<" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "Fehler beim Parsen von Parametern nm-Steuerelementen: %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "Fehler beim Parsen von parm vl-Steuerelementen: %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "Fehler beim Einstellen der Temperatur: %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "Fehler beim Analysieren von Steuerelementen: %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "Parsen: %s" #: src/util.c msgid "Parsing: " msgstr "Parsing: " #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "Fehler beim Parsen der Steuerelemente: %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "Fehler: %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "Neue Netcam-Parameter: %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "Neue Netcam-High-Parameter: %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "Neue Videoparameter: %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "Neue Webcontrol-Header-Parameter: %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "Neue Webcontrol-Header-Parameter: " #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "Neue Stream-Header-Parameter: %s" #: src/util.c msgid "New stream_header_params: " msgstr "Neue Stream-Header-Parameter: " #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "Programmierfehler. Unbekanntes Konfigurationselement: %s" #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE Fehler beim Einstellen des Farbtons [ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "zu [ %d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE Fehler beim Abrufen des Farbtons" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT Fehler beim Einstellen der Sättigung [ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT Fehler beim Abrufen der Sättigung" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT Fehler beim Einstellen des Kontrasts [ %d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT Fehler beim Abrufen des Kontrasts" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "METEORSBRIG Helligkeit [ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIG bekommt Helligkeit" #: src/video_bktr.c msgid "Not implemented" msgstr "Nicht implementiert" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "Geräteeingang %d außerhalb des Bereichs (0-4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d ungültig -Trying Composite %d" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "" "BT848SFMT, Das Eingabeformat konnte nicht festgelegt werden. Versuchen Sie " "es mit der Standardeinstellung erneut" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "" "BT848SFMT, Das Eingabeformat konnte ebenfalls nicht voreingestellt werden" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "Die Geometrie konnte nicht festgelegt werden" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "zu [ %d / %d] Norm %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "Ungültige Frequenz [%ld] für Quelleingang [%i]" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "Frequenz [%ld] Quelleingang [%i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "Eingabe setzen [ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "Eingabeformat festlegen [ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "Geometrie festlegen [ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "Frequenz eingestellt (noch nicht implementiert" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "Größenpuffer auf 3x" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "Größenpuffer auf 3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap fehlgeschlagen" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "METEORCAPTUR mit Einzelmethode Fehlererfassung" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "Fehler beim Erfassen mit einer einzelnen Methode" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "Videogerät kann nicht gefunden werden" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "Schließen von Videogerät %s" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "" "Immer noch %d Benutzer von Videogerät %s, daher schließen wir es jetzt nicht" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "Konfigurationsbildbreite ( %d) ist nicht modulo 8" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "Die Höhe des Konfigurationsabbilds ( %d) ist nicht modulo 8" #: src/video_bktr.c msgid "Stopping capture" msgstr "Capture wird gestoppt" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "" "Wiederverwenden von [ %s] Eingaben [ %d, %d] Ändern der Erfassungsmethode " "METEOR CAP SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "" "VIDEO PALETTE YUV420P Einstellung von imgs.size norm und imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "Öffnen Sie das Videogerät %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "Öffnen Sie das Tuner-Gerät %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "Korruptes Bild ... weiter" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "SOI-Position um %d Bytes angepasst." #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "mmalcam cleanup aufrufen" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "Aufrufen von Netcam Cleanup" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "Aufrufen von Netcam RTSP-Bereinigung" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "V4L2-Gerät bereinigen" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "BKTR-Gerät aufräumen" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "Keine Bereinigung von Kamerageräten (MMAL, Netcam, V4L2, BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "MMAL-Cam öffnen" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "MMAL-Kamera konnte nicht geöffnet werden" #: src/video_common.c msgid "Opening Netcam" msgstr "Netcam öffnen" #: src/video_common.c msgid "Netcam failed to open" msgstr "Netcam konnte nicht geöffnet werden" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Netcam RTSP öffnen" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Netcam RTSP konnte nicht geöffnet werden" #: src/video_common.c msgid "Opening V4L2 device" msgstr "Öffnen des V4L2-Geräts" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "V4L2-Gerät konnte nicht geöffnet werden" #: src/video_common.c msgid "Opening BKTR device" msgstr "BKTR Gerät öffnen" #: src/video_common.c msgid "BKTR device failed to open" msgstr "BKTR-Gerät konnte nicht geöffnet werden" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "Kein Kameragerät angegeben (MMAL, Netcam, V4L2, BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "' %s' konnte nicht geöffnet werden" #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "Fehler beim Angeben des Puffers: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "Öffnungspuffer: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "Lesepuffer: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "gefundenes Videogerät ' %s' %d" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "%s als Pipe-Ausgabe geöffnet" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "Das Öffnen von %s als Pipe-Ausgabe ist fehlgeschlagen" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "Ursprüngliche Rohrspezifikationen" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "Vorgeschlagene Rohrspezifikationen" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "Endgültige Rohrspezifikationen" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "Für das Gerät wurden keine Steuerelemente gefunden" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "--------- Steuerelemente ---------" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr " Name und Bereich der V4L2-ID" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "Fehler beim Zurücksetzen des Benutzerwerts" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "Steuerelement %s \"%s\" auf %d gesetzt lassen" #: src/video_v4l2.c msgid "Device not ready" msgstr "Gerät nicht bereit" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "Setzen Sie das Steuerelement \" %s\" auf den Wert %d" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "Setzen des Steuerelements %s \"%s\" auf %d fehlgeschlagen." #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "" "Der Wert der Steueroption %s %s liegt unter dem Minimum. Mindestens %d . " "verwenden" #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "" "Der Wert der %s-Steuerungsoption %s liegt über dem Maximum. Maximale %d . " "verwenden" #: src/video_v4l2.c msgid "control type not supported yet" msgstr "Steuerelementtyp wird noch nicht unterstützt" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "Eingabe %d kann nicht abgefragt werden. VIDIOC ENUMINPUT, wenn Sie einen " "WEBCAM-Änderungseingang verwendenWert in conf um -1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "Name = \" %s\", geben Sie 0x %08X, Status %08x ein" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "Name = \" %s\", - TUNER" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "Name = \" %s\" - KAMERA" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "Fehler beim Auswählen des Eingangs %d VIDIOC S INPUT" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "Das Gerät unterstützt die Angabe der PAL / NTSC-Norm nicht" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "- Videostandard %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "Fehler bei der Auswahl der Standardmethode %d VIDIOC S STD" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "Videostandard auf NTSC eingestellt" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "Videostandard auf SECAM eingestellt" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "Videostandard auf PAL eingestellt" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "Tuner %d VIDIOC G TUNER" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "Tuner %d einstellen" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "freq %ul VIDIOC-HÄUFIGKEIT" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "Setzen Sie die Frequenz auf %ul" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "%c%c%c%c (%dx%d) kann nicht verwendet werden" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "Testpalette %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "Bildgröße %dx%d wird mit Schritt %d überprüft" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "Kein Schrittwert vom Gerät bereitgestellt." #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "Die Breite (%d) muss kleiner sein als die Schrittweite (%d)" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "Die Bildbreite (%d) ist kein Vielfaches der Schrittweite (%d)" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "Unmögliche Bedingung: Breite(%d), Schritt(%d), Pro Schritt(%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "Die Bildbreite wird mit %d Bytes aufgefüllt" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "Anpassen der Auflösung von %ix %i zu %ix %i." #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "Angepasste Auflösung nicht modulo 8." #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "" "Geben Sie eine andere Palette oder Breite / Höhe in der Konfigurationsdatei " "an." #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "Fehler beim Festlegen des Pixelformats." #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "Verwenden der Palette %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "Anpassung an die Breite ( %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "Anpassung an die Höhe ( %d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "" "Der Konfigurationspalettenindex %d ( %s) für %dx %d funktioniert nicht." #: src/video_v4l2.c msgid "Supported palettes:" msgstr "Unterstützte Paletten:" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d - %s (komprimiert: %d) ( %# x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "Ausgewählte Palette %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "Palettenauswahl für Format %s fehlgeschlagen" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "Es konnte kein kompatibles Palettenformat gefunden werden." #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "" "Fehler beim Anfordern der Puffer %d für die Speicherzuordnung. VIDIOC REQBUFS" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "MMAP-Informationen: Frames = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "Nicht genügend Pufferspeicher %d %s< >%s< >%s<" msgstr "Ungültige Aktion angefordert:> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "Muttersprache: on" #: src/webu.c msgid "Native Language : off" msgstr "Muttersprache: Aus" #: src/webu.c msgid "Set the value to null/zero" msgstr "Setzen Sie den Wert auf null / null" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "Ignorieren der Verbindung von: %s" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "Authentifizierung von %s fehlgeschlagen" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "Kein Webcontrol-Benutzer: Pass angegeben" #: src/webu.c msgid "No stream user:pass provided" msgstr "Kein Streambenutzer: Pass angegeben" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "Ungültige Antwort" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "Fehler beim Hinzufügen des Webcontrol-Headers %s %s" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "Fehler beim Hinzufügen des Stream-Headers %s %s" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "Ungültige Methode angefordert: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "Verbindung von: %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "Sendeseite fehlgeschlagen %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "Streambild ist noch nicht fertig" #: src/webu.c msgid "Stream process requested to finish." msgstr "Stream-Prozess zum Abschluss angefordert." #: src/webu.c msgid "Send page failed." msgstr "Seite senden fehlgeschlagen." #: src/webu.c msgid "Basic authentication: available" msgstr "Standardauthentifizierung: verfügbar" #: src/webu.c msgid "Basic authentication: disabled" msgstr "Standardauthentifizierung: deaktiviert" #: src/webu.c msgid "Digest authentication: available" msgstr "Digest-Authentifizierung: verfügbar" #: src/webu.c msgid "Digest authentication: disabled" msgstr "Digest-Authentifizierung: deaktiviert" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd libary zu alt ipv6 deaktiviert" #: src/webu.c msgid "IPV6: available" msgstr "IPV6: verfügbar" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6: deaktiviert" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd libary zu alt SSL / TLS deaktiviert" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS: verfügbar" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS: deaktiviert" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "Fehler beim Lesen der Datei für die SSL / TLS-Unterstützung." #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "SSL / TLS angefordert, aber keine Zertifikatsdatei angegeben. SSL / TLS " "deaktiviert" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "" "SSL / TLS angefordert, aber keine Schlüsseldatei angegeben. SSL / TLS " "deaktiviert" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "Starten von Webcontrol auf Port %d" #: src/webu.c msgid "Unable to start MHD" msgstr "MHD kann nicht gestartet werden" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "Webcontrol auf Port %d gestartet" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "Kamera %d Stream auf Port / Kamera-ID %d / %d gestartet" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "Kamera %d Stream auf Port %d gestartet" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "Starten aller Kamera-Streams auf Port %d" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "Kamera %d wird über Port %d gestartet" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "Stream für Kamera %d konnte nicht gestartet werden" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "Doppelter Port angefordert %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "Ungültige maximale IPs für Webcontrol-Sperre. Einstellung gleich 25." #: src/webu_html.c msgid "Cameras" msgstr "Kameras" #: src/webu_html.c msgid "Camera" msgstr "Kameras" #: src/webu_html.c msgid "All" msgstr "Alle" #: src/webu_html.c msgid "Action" msgstr "Aktion" #: src/webu_html.c msgid "Start Event" msgstr "Starten Sie das Ereignis" #: src/webu_html.c msgid "End Event" msgstr "Beende die Veranstaltung" #: src/webu_html.c msgid "Snapshot" msgstr "Schnappschuss" #: src/webu_html.c msgid "Change Configuration" msgstr "Konfiguration ändern" #: src/webu_html.c msgid "Write Configuration" msgstr "Speichern Sie die Konfiguration" #: src/webu_html.c msgid "Tracking" msgstr "Verfolgen" #: src/webu_html.c msgid "Pause" msgstr "Pause" #: src/webu_html.c msgid "Start" msgstr "Anfang" #: src/webu_html.c msgid "Restart" msgstr "Neustart" #: src/webu_html.c msgid "Quit" msgstr "Verlassen" #: src/webu_html.c msgid "Help" msgstr "Hilfe" #: src/webu_html.c msgid "No Configuration Options" msgstr "Keine Konfigurationsoptionen" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "Begrenzte Konfigurationsoptionen" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "Erweiterte Konfigurationsoptionen" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "Eingeschränkte Konfigurationsoptionen" #: src/webu_html.c msgid "All Cameras" msgstr "Alle Kameras" #: src/webu_html.c msgid "Not running" msgstr "Nicht aktiv" #: src/webu_html.c msgid "Lost connection" msgstr "Verlorene Verbindung" #: src/webu_html.c msgid "Paused" msgstr "Pausiert" #: src/webu_html.c msgid "Active" msgstr "Aktiv" #: src/webu_html.c msgid "Select option" msgstr "Wähle eine Option" #: src/webu_html.c msgid "Save" msgstr "Speichern" #: src/webu_html.c msgid "Pan/Tilt" msgstr "Schwenken/Neigen" #: src/webu_html.c msgid "Absolute Change" msgstr "Absolute Veränderung" #: src/webu_html.c msgid "Center" msgstr "Center" #: src/webu_html.c msgid "Pan" msgstr "Schwenken" #: src/webu_html.c msgid "Tilt" msgstr "Neigen" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "Ungültiger Thread angegeben: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "Ungültige URL für einen kameraspezifischen Port: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "" "Die URL für Thread 0 ist nicht gültig, wenn kameraspezifische Dateien " "verwendet werden: %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "Ungültige URL für einen kameraspezifischen Port: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "Das Bild konnte nicht zum Streaming gebracht werden." #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "Die Option ' %s' wird abgeschrieben. Neuer Optionsname ist '%s'" motion-release-4.6.0/po/es.po000066400000000000000000003333101452402535500160410ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:39-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "%s después de la versión %s" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "Opción de configuración desconocida \" %s \"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "Escribir archivo de configuración en %s" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "" "No se encontró el archivo de configuración %s: se intentan los valores " "predeterminados." #: src/conf.c msgid "Error getcwd" msgstr "Error getcwd" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "no se pudo abrir el archivo de configuración %s" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "Nombre de archivo no válido %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "Procesando hilo 0 - archivo de configuración %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "" "Ningún archivo de configuración para procesar, utilizando valores " "predeterminados" #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "Escribir parámetros de configuración de todos los archivos ( %d):" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "Hilo %d - Archivo de configuración: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s " #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "Procesando archivo de configuración %s" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "No se encontró la configuración del directorio de la cámara %s" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "No se encontró el archivo de configuración de la cámara %s" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "Procesando el archivo de configuración de la cámara %s" #: src/conf.c msgid "daemon" msgstr "demonio" # Configuration Option Hints #: src/conf.c msgid "setup_mode" msgstr "modo de configuración" #: src/conf.c msgid "pid_file" msgstr "archivo pid" #: src/conf.c msgid "log_file" msgstr "archivo de registro" #: src/conf.c msgid "log_level" msgstr "nivel de registro" #: src/conf.c msgid "log_type" msgstr "tipo de registro" #: src/conf.c msgid "quiet" msgstr "tranquilo" #: src/conf.c msgid "watchdog_tmo" msgstr "perro guardián tmo" #: src/conf.c msgid "watchdog_kill" msgstr "perro guardián matar" #: src/conf.c msgid "native_language" msgstr "lengua materna" #: src/conf.c msgid "camera_name" msgstr "nombre de la cámara" #: src/conf.c msgid "camera_id" msgstr "identificación de la cámara" #: src/conf.c msgid "target_dir" msgstr "dir de destino" #: src/conf.c msgid "video_device" msgstr "dispositivo de video" #: src/conf.c msgid "video_params" msgstr "parámetros de video" #: src/conf.c msgid "auto_brightness" msgstr "brillo automático" #: src/conf.c msgid "tuner_device" msgstr "dispositivo sintonizador" #: src/conf.c msgid "roundrobin_frames" msgstr "marcos de roundrobin" #: src/conf.c msgid "roundrobin_skip" msgstr "salto de roundrobin" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "filtro de interruptor de roundrobin" #: src/conf.c msgid "netcam_url" msgstr "url de netcam" #: src/conf.c msgid "netcam_params" msgstr "parámetros de netcam" #: src/conf.c msgid "netcam_high_url" msgstr "url alta de netcam" #: src/conf.c msgid "netcam_high_params" msgstr "netcam high params" #: src/conf.c msgid "netcam_userpass" msgstr "netcam userpass" #: src/conf.c msgid "mmalcam_name" msgstr "nombre de mmalcam" #: src/conf.c msgid "mmalcam_params" msgstr "parámetros de mmalcam" #: src/conf.c msgid "width" msgstr "anchura" #: src/conf.c msgid "height" msgstr "altura" #: src/conf.c msgid "framerate" msgstr "cuadros por segundo" #: src/conf.c msgid "minimum_frame_time" msgstr "tiempo de trama mínimo" #: src/conf.c msgid "rotate" msgstr "girar" #: src/conf.c msgid "flip_axis" msgstr "eje giratorio" #: src/conf.c msgid "locate_motion_mode" msgstr "localizar el modo de movimiento" #: src/conf.c msgid "locate_motion_style" msgstr "localizar estilo de movimiento" #: src/conf.c msgid "text_left" msgstr "texto restante" #: src/conf.c msgid "text_right" msgstr "texto a la derecha" #: src/conf.c msgid "text_changes" msgstr "cambios de texto" #: src/conf.c msgid "text_scale" msgstr "escala de texto" #: src/conf.c msgid "text_event" msgstr "evento de texto" #: src/conf.c msgid "emulate_motion" msgstr "emular movimiento" #: src/conf.c msgid "pause" msgstr "pausa" #: src/conf.c msgid "threshold" msgstr "límite" #: src/conf.c msgid "threshold_maximum" msgstr "umbral máximo" #: src/conf.c msgid "threshold_tune" msgstr "tono de umbral" #: src/conf.c msgid "noise_level" msgstr "nivel de ruido" #: src/conf.c msgid "noise_tune" msgstr "melodía de ruido" #: src/conf.c msgid "despeckle_filter" msgstr "filtro de eliminación de virutas" #: src/conf.c msgid "area_detect" msgstr "detección de área" #: src/conf.c msgid "mask_file" msgstr "archivo de máscara" #: src/conf.c msgid "mask_privacy" msgstr "máscara de privacidad" #: src/conf.c msgid "smart_mask_speed" msgstr "velocidad de máscara inteligente" #: src/conf.c msgid "lightswitch_percent" msgstr "interruptor de luz por ciento" #: src/conf.c msgid "lightswitch_frames" msgstr "marcos de interruptor de luz" #: src/conf.c msgid "minimum_motion_frames" msgstr "marcos mínimos de movimiento" #: src/conf.c msgid "event_gap" msgstr "brecha de eventos" #: src/conf.c msgid "pre_capture" msgstr "pre captura" #: src/conf.c msgid "post_capture" msgstr "post captura" #: src/conf.c msgid "on_event_start" msgstr "al inicio del evento" #: src/conf.c msgid "on_event_end" msgstr "al final del evento" #: src/conf.c msgid "on_picture_save" msgstr "en la imagen guardar" #: src/conf.c msgid "on_area_detected" msgstr "en el área detectada" #: src/conf.c msgid "on_motion_detected" msgstr "en movimiento detectado" #: src/conf.c msgid "on_movie_start" msgstr "en el comienzo de la película" #: src/conf.c msgid "on_movie_end" msgstr "al final de la película" #: src/conf.c msgid "on_camera_lost" msgstr "en cámara perdida" #: src/conf.c msgid "on_camera_found" msgstr "en la cámara encontrada" #: src/conf.c msgid "picture_output" msgstr "salida de imagen" #: src/conf.c msgid "picture_output_motion" msgstr "movimiento de salida de imagen" #: src/conf.c msgid "picture_type" msgstr "tipo de imagen" #: src/conf.c msgid "picture_quality" msgstr "calidad de imagen" #: src/conf.c msgid "picture_exif" msgstr "imagen exif" #: src/conf.c msgid "picture_filename" msgstr "nombre de archivo de imagen" #: src/conf.c msgid "snapshot_interval" msgstr "intervalo de instantánea" #: src/conf.c msgid "snapshot_filename" msgstr "nombre de archivo de instantánea" #: src/conf.c msgid "movie_output" msgstr "salida de película" #: src/conf.c msgid "movie_output_motion" msgstr "movimiento de salida de película" #: src/conf.c msgid "movie_max_time" msgstr "tiempo máximo de película" #: src/conf.c msgid "movie_bps" msgstr "película bps" #: src/conf.c msgid "movie_quality" msgstr "calidad de pelicula" #: src/conf.c msgid "movie_codec" msgstr "códec de película" #: src/conf.c msgid "movie_duplicate_frames" msgstr "fotogramas duplicados de películas" #: src/conf.c msgid "movie_passthrough" msgstr "paso de la película" #: src/conf.c msgid "movie_filename" msgstr "nombre de archivo de la película" #: src/conf.c msgid "movie_extpipe_use" msgstr "uso de la película extpipe" #: src/conf.c msgid "movie_extpipe" msgstr "película extpipe" #: src/conf.c msgid "timelapse_interval" msgstr "intervalo de lapso de tiempo" #: src/conf.c msgid "timelapse_mode" msgstr "modo timelapse" #: src/conf.c msgid "timelapse_fps" msgstr "timelapse fps" #: src/conf.c msgid "timelapse_codec" msgstr "códec timelapse" #: src/conf.c msgid "timelapse_filename" msgstr "timelapse filename" #: src/conf.c msgid "video_pipe" msgstr "tubo de video" #: src/conf.c msgid "video_pipe_motion" msgstr "movimiento de tubo de video" #: src/conf.c msgid "webcontrol_port" msgstr "puerto de control web" #: src/conf.c msgid "webcontrol_ipv6" msgstr "webcontrol ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "webcontrol localhost" #: src/conf.c msgid "webcontrol_parms" msgstr "parques de control web" #: src/conf.c msgid "webcontrol_interface" msgstr "interfaz de control web" #: src/conf.c msgid "webcontrol_auth_method" msgstr "método de autenticación de control web" #: src/conf.c msgid "webcontrol_authentication" msgstr "autenticación de control web" #: src/conf.c msgid "webcontrol_tls" msgstr "webcontrol tls" #: src/conf.c msgid "webcontrol_cert" msgstr "certificado de control web" #: src/conf.c msgid "webcontrol_key" msgstr "clave de control web" #: src/conf.c msgid "webcontrol_header_params" msgstr "parámetros de encabezado de webcontrol" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "minutos de bloqueo de webcontrol" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "intentos de bloqueo de webcontrol" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "bloqueo de webcontrol max ips" #: src/conf.c msgid "stream_port" msgstr "puerto de transmisión" #: src/conf.c msgid "stream_localhost" msgstr "transmitir localhost" #: src/conf.c msgid "stream_auth_method" msgstr "método de autenticación de flujo" #: src/conf.c msgid "stream_authentication" msgstr "autenticación de flujo" #: src/conf.c msgid "stream_tls" msgstr "transmitir tls" #: src/conf.c msgid "stream_header_params" msgstr "parámetros de encabezado de flujo" #: src/conf.c msgid "stream_preview_scale" msgstr "escala de vista previa de transmisión" #: src/conf.c msgid "stream_preview_newline" msgstr "vista previa de transmisión nueva línea" #: src/conf.c msgid "stream_preview_method" msgstr "método de vista previa de flujo" #: src/conf.c msgid "stream_quality" msgstr "calidad de transmisión" #: src/conf.c msgid "stream_grey" msgstr "corriente gris" #: src/conf.c msgid "stream_motion" msgstr "corriente de movimiento" #: src/conf.c msgid "stream_maxrate" msgstr "flujo maxrate" #: src/conf.c msgid "stream_limit" msgstr "límite de flujo" #: src/conf.c msgid "database_type" msgstr "tipo de base de datos" #: src/conf.c msgid "database_dbname" msgstr "nombre de base de datos db" #: src/conf.c msgid "database_host" msgstr "host de base de datos" #: src/conf.c msgid "database_port" msgstr "puerto de base de datos" #: src/conf.c msgid "database_user" msgstr "usuario de la base de datos" #: src/conf.c msgid "database_password" msgstr "contraseña de la base de datos" #: src/conf.c msgid "database_busy_timeout" msgstr "tiempo de espera ocupado de la base de datos" #: src/conf.c msgid "sql_log_picture" msgstr "imagen de registro sql" #: src/conf.c msgid "sql_log_snapshot" msgstr "instantánea de registro de sql" #: src/conf.c msgid "sql_log_movie" msgstr "película de registro sql" #: src/conf.c msgid "sql_log_timelapse" msgstr "lapso de tiempo de registro sql" #: src/conf.c msgid "sql_query_start" msgstr "inicio de consulta sql" #: src/conf.c msgid "sql_query_stop" msgstr "parada de consulta sql" #: src/conf.c msgid "sql_query" msgstr "consulta sql" #: src/conf.c msgid "track_type" msgstr "tipo de pista" #: src/conf.c msgid "track_auto" msgstr "seguimiento automático" #: src/conf.c msgid "track_port" msgstr "rastrear puerto" #: src/conf.c msgid "track_motorx" msgstr "pista motorx" #: src/conf.c msgid "track_motorx_reverse" msgstr "pista motorx marcha atrás" #: src/conf.c msgid "track_motory" msgstr "seguimiento de la motivación" #: src/conf.c msgid "track_motory_reverse" msgstr "seguimiento de la marcha atrás motora" #: src/conf.c msgid "track_maxx" msgstr "seguimiento maxx" #: src/conf.c msgid "track_minx" msgstr "pista minx" #: src/conf.c msgid "track_maxy" msgstr "seguimiento de maxy" #: src/conf.c msgid "track_miny" msgstr "seguimiento miny" #: src/conf.c msgid "track_homex" msgstr "rastrear homex" #: src/conf.c msgid "track_homey" msgstr "seguimiento hogareño" #: src/conf.c msgid "track_iomojo_id" msgstr "rastrear id de iomojo" #: src/conf.c msgid "track_step_angle_x" msgstr "seguimiento de ángulo de paso x" #: src/conf.c msgid "track_step_angle_y" msgstr "seguimiento del ángulo de paso y" #: src/conf.c msgid "track_move_wait" msgstr "seguir mover esperar" #: src/conf.c msgid "track_speed" msgstr "velocidad de seguimiento" #: src/conf.c msgid "track_stepsize" msgstr "seguimiento de tamaño" #: src/conf.c msgid "track_generic_move" msgstr "rastrear movimiento genérico" #: src/conf.c msgid "camera" msgstr "cámara" #: src/conf.c msgid "camera_dir" msgstr "cámara dir" #: src/dbse.c msgid "Closing MySQL library" msgstr "Cerrando la biblioteca MySQL" #: src/dbse.c msgid "Closing MariaDB library" msgstr "Cerrando la biblioteca MariaDB" #: src/dbse.c msgid "Database closed" msgstr "Base de datos cerrada" #: src/dbse.c msgid "Initializing database" msgstr "Inicializando base de datos" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "" "No se puede conectar a la base de datos MySQL %s en el host %s con el " "usuario %s" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "El error de MySQL fue %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "" "No se puede conectar a la base de datos MariaDB %s en el host %s con el " "usuario %s" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "El error de MariaDB fue %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "Abriendo base de datos %s" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "No se puede abrir la base de datos SQLite3 %s. Error %d: %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "Configuración del tiempo de espera ocupado en %d mseg" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "Error al configurar el tiempo de espera ocupado. Error %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "La conexión a la base de datos PostgreSQL ' %s' falló: %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "Tipo de base de datos %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "Ejecutando consulta MySQL" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "Error en la consulta de MySQL %s código de error %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "" "No se puede volver a conectar a la base de datos MySQL %s en el host %s con " "el usuario %s Error de MySQLera %s" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "Reconexión a la base de datos MySQL ' %s' exitosa" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "" "después de la reconexión, la consulta de MySQL falló %s código de error %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "Ejecutando la consulta MariaDB" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "Error en la consulta MariaDB %s código de error %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "No se puede volver a conectar a la base de datos MariaDB %s en el host %s " "con el usuario %s MariaDBel error fue %s" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "Reconexión a la base de datos MariaDB ' %s' exitosa" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "" "después de la reconexión, la consulta MariaDB falló %s código de error %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "Reconectado a la base de datos de PostgreSQL ' %s'" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "Ejecutando una consulta PostgreSQL" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "" "Intentando volver a conectarse a la base de datos de PostgreSQL ' %s': %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "La consulta de PGSQL falló: [%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "Ejecutando %s" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "Error de SQLite3 %d: %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "Ignorando la consulta sql vacía" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "No se puede iniciar el comando externo ' %s'" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "Ejecutando comando externo ' %s'" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "Escribiendo imagen en archivo: %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "Escribiendo película en archivo: %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "Imagen guardada en el archivo: %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "Película guardada en archivo: %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "Error al colocar la imagen en la tubería de video" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "No se pudo crear el enlace simbólico [ %s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "Error al crear el nombre de la tubería de vista previa %d %s" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "Error al crear la base de nombre de archivo %d %s" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "Error al crear el nombre de vista previa %d %s" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "CIERRE: archivo extpipe desc %d, estado de error %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "pclose return: %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "Fuente FPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "ruta de película: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "sin acceso de escritura al directorio de destino %s" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "ruta no encontrada, intentando crearla %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "error al acceder a la ruta %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "Error al especificar la línea de comando: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "tubería: %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt->moviefps: %d" #: src/event.c msgid "popen failed" msgstr "popen falló" #: src/event.c msgid "Using extpipe" msgstr "Usando extpipe" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "Error al escribir en la tubería, error de estado %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "tubería %s no creada o cerrada ya " #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "El contenedor ogg ya no es compatible. Cambiar a mpeg4" #: src/event.c msgid "Running test of the various output formats." msgstr "Ejecución de prueba de los distintos formatos de salida." #: src/event.c msgid "Error opening context for movie output." msgstr "Error al abrir el contexto para la salida de la película." #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffopen error de apertura al crear (movimiento) archivo [ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "" "El contenedor swf para timelapse ya no es compatible. Usando contenedor mpg." #: src/event.c msgid "Timelapse using mpg codec." msgstr "Timelapse usando códec mpg." #: src/event.c msgid "Events will be appended to file" msgstr "Los eventos se agregarán al archivo" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "Timelapse usando el códec mpeg4." #: src/event.c msgid "Events will be trigger new files" msgstr "Los eventos activarán nuevos archivos" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffopen abrir error al crear (timelapse) archivo [ %s]" #: src/event.c msgid "Error encoding image" msgstr "Error al codificar imagen" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "Error al asignar memoria para el nombre del códec" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "La velocidad de fotogramas especificada es demasiado alta para el tipo de " "película ffmpeg especificado.Elija un contenedor de ffmpeg diferente o una " "velocidad de fotogramas más baja." #: src/ffmpeg.c msgid "Error setting base file name" msgstr "Error al establecer el nombre del archivo base" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "Error al establecer timelapse append para el códec %s" #: src/ffmpeg.c msgid "Error setting file name" msgstr "Error al configurar el nombre del archivo" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "el valor de la opción de códec %s no es compatible" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "No se pudo obtener el códec" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "Error al enviar el marco para la codificación: %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "Recibir paquete arrojó EAGAIN devolviendo código -2: %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "Error al recibir el paquete de video codificado: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "Error al codificar video: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "Error al codificar video" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "" "PTS % Base PTS % ms intervalo % base de tiempo %d- %d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "MAL MOMENTO !! Se omitió el marco." #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "" "PTS % Base PTS % intervalo ms % base de tiempo %d- " "%d Cambiar %d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s codec vbr / crf / bit rate: %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "El códec preferido %s ha sido incluido en la lista negra: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "Códec %s no encontrado" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "Usando el códec %s" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "No se pudo asignar la secuencia" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "¡Error al asignar el códec!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "" "Bajo fps. Codificación de% d fotogramas en un contenedor% d fotogramas." #: src/ffmpeg.c msgid "Unable to set quality" msgstr "No se puede establecer la calidad" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "FPS reportados compatibles %d / %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "No se pudo abrir el códec %s" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "¡Error al copiar los parámetros del decodificador !: %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "no se pudo asignar marco" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "no se pudieron asignar buffers %s" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "error al abrir el archivo %s" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "Permiso denegado. %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "Error al abrir el archivo %s" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "No se pudo escribir el encabezado ffmpeg %s" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "Error al ingresar al modo de drenaje: %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "Error al drenar el códec: %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "Error al escribir el fotograma de drenaje del video" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "Error al codificar imagen" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "Error al escribir el cuadro de video" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet: %s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "Error al escribir el cuadro de video: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "El contexto RTSP no está disponible." #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "la cámara rtsp no está lista para pasar." #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "modo de paso habilitado. Cambio a contenedor MP4." #: src/ffmpeg.c msgid "Could not get codec!" msgstr "¡No se pudo obtener el códec!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "No se pueden copiar los parámetros del códec" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "Paso deshabilitado. ffmpeg demasiado viejo" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "Transmisión de paso abierta" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "ffmpeg libavcodec versión %d. %d. %d libavformat versión %d. %d. %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "el registro de bloqueo de av falló ( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "No se incluye la funcionalidad ffmpeg" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "av resetmgr reset reset falló en la limpieza" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "No se pudo asignar el contexto de salida" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "No se pudo configurar passthru!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "No se pudo establecer la transmisión" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "Error al descargar el códec" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "Intentos excesivos de borrar el paquete almacenado" #: src/ffmpeg.c msgid "Buffered packet" msgstr "Paquete tamponado" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s: el buffer jpeg dado era demasiado pequeño" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "Dimensiones de imagen JPEG no válidas" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "Tamaño de imagen JPEG %dx %d, JPEG fue %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "" "Recibió un evento inesperado de devolución de llamada de control de cámara, " "0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "" "Una velocidad de fotogramas alta puede causar problemas con la exposición de " "imágenes" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "" "Si la exposición automática no funciona, pruebe con una velocidad de " "fotogramas más baja." #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "Error al crear el componente de cámara MMAL %s" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "La cámara MMAL %s no tiene puertos de salida" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "No se puede habilitar el puerto de control: error %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "La configuración MMAL sin relleno ha fallado" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "no se pudo establecer el formato de video de la cámara" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "el componente de la cámara no se pudo habilitar" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "Componente de cámara MMAL creado" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "" "Error en la creación de la agrupación de almacenamiento intermedio de la " "cámara MMAL" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "" "La creación de la cola de almacenamiento intermedio de la cámara MMAL falló" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "No se puede obtener un búfer requerido %d de la cola del grupo" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "No se puede enviar un búfer al puerto ( %d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "" "Inicio de subproceso de cámara MMAL ... para cámara ( %s) de %dx %d a %d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "los parámetros de la cámara no se pudieron asignar" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "La activación del puerto de captura de la cámara MMAL falló" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "Error de inicio de captura de cámara MMAL" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "Limpieza de cámara MMAL" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %d indicadores %08x tamaño %d / %d en %08x, img tamaño = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "No se puede devolver un búfer al puerto de video de la cámara" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "Cambiar el tamaño del búfer de captura previa a %d elementos" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "Se eliminó el archivo de identificación del proceso (archivo pid)." #: src/motion.c msgid "Error removing pid file" msgstr "Error al eliminar el archivo pid" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "Archivo de registro de cierre ( %s)." #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "Movimiento detectado: evento de inicio %d." #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "Se agregaron %d fillerframes a la película" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "No se puede determinar el tipo de cámara (MMAL, Netcam, V4L2, BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "Abrir archivo de máscara de privacidad" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "Abrir archivo de máscara de privacidad de alta resolución" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "Error al abrir el archivo de máscara %s" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "Error al leer la imagen de privacidad de la máscara. Función de privacidad " "de máscara deshabilitada." #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "Se ha cargado el archivo de privacidad de la máscara \" %s \"." #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "Escala de texto inválida. Ajustado a %d" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "Cámara %d iniciada: detección de movimiento %s" #: src/motion.c msgid "Disabled" msgstr "Discapacitado" #: src/motion.c msgid "Enabled" msgstr "Habilitado" #: src/motion.c msgid "Pass-through processing disabled." msgstr "Procesamiento de paso deshabilitado." #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "Dimensiones de configuración no válidas %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "Uso de dimensiones predeterminadas %dx %d" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "El ancho de imagen ( %d) solicitado no es el módulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "Ajuste del ancho al siguiente múltiplo superior de 8 ( %d)." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "La altura de la imagen ( %d) solicitada no es el módulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "Ajuste de altura al siguiente múltiplo superior de 8 ( %d)." #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "No se pudo recuperar la imagen inicial de la cámara " #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "" "El movimiento continúa usando el ancho y la altura de los archivos de " "configuración" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "Motion solo admite ancho y alto módulo 8" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "El ancho de imagen ( %d) o la altura ( %d) solicitada no es el módulo 8." #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "El movimiento solo admite un ancho y una altura mayor o igual que 64 %dx %d" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "Substream no disponible. Tamaños de imagen no modulares 16." #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "el formato de imagen webp no está disponible, volviendo a jpeg" #: src/motion.c msgid "Error capturing first image" msgstr "Error al capturar la primera imagen" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "Dispositivo de apertura de video en bucle para imágenes normales" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "Error al abrir el loopback de video para imágenes normales" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "Dispositivo de apertura de video loopback para imágenes en movimiento" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "Error al abrir loopback de video para imágenes en movimiento" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "" "Error al leer la imagen de la máscara. Función de máscara deshabilitada." #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "Archivo de máscara \" %s \" cargado." #: src/motion.c msgid "Emulating motion" msgstr "Emulando movimiento" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "Movimiento en el área %d detectado." #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "Reintentando hasta una conexión exitosa con la cámara" #: src/motion.c msgid "Camera has become available." msgstr "La cámara está disponible." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "Reiniciando movimiento.\n" "El ancho de la imagen (%d) o la altura (%d) solicitada no es módulo 8." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Reiniciando movimiento.\n" "Motion solo admite ancho y alto mayor o igual a 64 %dx%d" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "Reiniciando movimiento.\n" "La altura o el ancho han cambiado en la cámara." #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "Reiniciando movimiento.\n" "La alta resolución ha cambiado en la cámara." #: src/motion.c msgid "Video signal re-acquired" msgstr "Señal de video readquirida" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "Error grave del dispositivo de video: cierre del dispositivo de video" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "" "Reinicio del hilo de movimiento para reinicializar todos los búferes de " "imagen" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "Señal de video perdida - Agregar imagen gris" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "Señal de video aún perdida - Intentando cerrar el dispositivo de video" #: src/motion.c msgid "Lightswitch detected" msgstr "Interruptor de luz detectado" #: src/motion.c msgid "Switchfilter detected" msgstr "Switchfilter detectado" #: src/motion.c msgid "micro-lightswitch!" msgstr "micro-interruptor de luz!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "Fin del evento %d" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "Cambios sin formato: %5d - cambios después de ' %s': %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr " - etiquetas: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "Cambios: %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr " - nivel de ruido: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr " - umbral: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "Argumento de modo timelapse no válido ' %s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%: s Por defecto al modo de lapso de tiempo manual" #: src/motion.c msgid "Thread exiting" msgstr "Hilo saliendo" #: src/motion.c msgid "Motion going to daemon mode" msgstr "El movimiento va al modo demonio" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "" "Salir de movimiento, no se puede crear el archivo de identificación del " "proceso (archivo pid) %s" #: src/motion.c msgid "Could not change directory" msgstr "No se pudo cambiar el directorio" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "" "Se creó el archivo de identificación del proceso %s. La ID del proceso es %d" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "" "Las ID de Camara no son únicas o tienen valores superiores a 32,000. " "Volviendo anúmeros de hilo" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2: disponible" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2: no disponible" #: src/motion.c msgid "bktr : available" msgstr "bktr: disponible" #: src/motion.c msgid "bktr : not available" msgstr "bktr: no disponible" #: src/motion.c msgid "webp : available" msgstr "webp: disponible" #: src/motion.c msgid "webp : not available" msgstr "webp: no disponible" #: src/motion.c msgid "mmal : available" msgstr "mmal: disponible" #: src/motion.c msgid "mmal : not available" msgstr "mmal: no disponible" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg: disponible" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg: no disponible" #: src/motion.c msgid "mysql : available" msgstr "mysql: disponible" #: src/motion.c msgid "mysql : not available" msgstr "mysql: no disponible" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB: disponible" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB: no disponible" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3: disponible" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3: no disponible" #: src/motion.c msgid "pgsql : available" msgstr "pgsql: disponible" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql: no disponible" #: src/motion.c msgid "nls : available" msgstr "nls: disponible" #: src/motion.c msgid "nls : not available" msgstr "nls: no disponible" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "Uso del nivel de registro predeterminado ( %s) ( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "Iniciar sesión en el archivo ( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "Salir de movimiento, no se puede crear el archivo de registro %s" #: src/motion.c msgid "Logging to syslog" msgstr "Iniciando sesión en syslog" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "Motion %s iniciado" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "Uso del tipo de registro predeterminado ( %s)" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "Uso del tipo de registro ( %s) nivel de registro ( %s)" #: src/motion.c msgid "Motion running as daemon process" msgstr "Movimiento en ejecución como proceso demonio" #: src/motion.c msgid "Motion running in setup mode." msgstr "Movimiento en modo de configuración." #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "ID de cámara: %d es de %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "ID de cámara: %d Nombre de cámara: %s Servicio: %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "ID de cámara: %d Nombre de cámara: %s Dispositivo: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "" "El número de puerto de transmisión %d para el hilo %d entra en conflicto con " "el puerto de control" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "La función de transmisión para el hilo %d está deshabilitada." #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "" "El número de puerto de transmisión %d para el hilo %d entra en conflicto con " "el hilo %d" #: src/motion.c msgid "Restarting motion." msgstr "Reinicio de movimiento." #: src/motion.c msgid "Motion restarted" msgstr "Movimiento reiniciado" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "" "Hilo %d - Tiempo de espera de vigilancia. Intentando hacer un reinicio " "elegante" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "Hilo %d - ¡El tiempo de espera de Watchdog NO se reinició, matándolo!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "Hilo %d - Hilo de limpieza." #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "" "DEBUG-1 subprocesos ejecutando %d subprocesos de movimiento ejecutando %d, " "terminar %d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "Esperando que los hilos terminen, pid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "Hilo de movimiento %d reiniciar" #: src/motion.c msgid "Threads finished" msgstr "Hilos terminados" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "Movimiento terminando" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "URL invalida. No se pueden analizar los valores." #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "Se inició el subproceso de controlador de cámara [ %d]" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "Cierre del zócalo de la cámara web cuando el tiempo de Keep-Alive ha " "terminado (la cámara envió el campo Cerrar). UNAla reconexión debería " "suceder." #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "reabrir la cámara (sin transmisión)" #: src/netcam.c msgid "camera re-connected" msgstr "cámara reconectada" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "Encabezado de imagen no reconocido ( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "Error en el encabezado ( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "reabrir cámara (transmisión)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "Error al obtener la imagen JPEG" #: src/netcam.c msgid "Trying to re-connect" msgstr "Intentando reconectar" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "controlador de cámara netcam: conjunto finalizado, salir" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "No hay respuesta del manejador de la cámara: ya debe haber muerto" #: src/netcam.c msgid "called with no data in buffer" msgstr "llamado sin datos en el búfer" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "Cámara de red a partir de cámara ( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "Netcam proxy no válido ( %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "Nombre de usuario / contraseña no permitidos en una URL proxy" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "Servicio de cámara web no válido ' %s' " #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "URL de netcam no válida para cámara ( %s)" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "El parámetro http de Netcam ' %s' se convierte en banderas: HTTP / 1.0: %s " "HTTP / 1.1: %s Keep-Vivo %s." #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "ahora llamando a netcam setup html ()" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "ahora llamando a ftp de configuración de netcam" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "ahora llamando al archivo de configuración de netcam ()" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "ahora llamando a netcam setup mjpg ()" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "Servicio de netcam no válido ' %s': debe ser mjpeg, ftp, mjpg o jpeg." #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "Error al intentar leer la primera imagen - retval: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "error de descompresión de libjpeg en el primer fotograma: ¡rendirse!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "Ancho / alto ( %dx %d) deben ser múltiplos de 8" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "Error al iniciar el subproceso del controlador de la cámara [ %d]" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "recv falló en ftp obtener más" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "Respuesta del servidor: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "error de envío en el usuario de envío ftp" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "falló el envío en ftp send passwd" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "envío fallido en ftp salir" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "gethostbyname falló en la conexión ftp" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "la dirección gethostbyname no coincide en ftp connect" #: src/netcam_ftp.c msgid "socket failed" msgstr "socket fallido" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "Error al crear una conexión" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "Servidor FTP que solicita ACCT en anónimo" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "configurando la opción de socket SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "envío fallido en ftp obtener conexión" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "Respuesta inválida a PASV" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "Error al crear una conexión de datos" #: src/netcam_ftp.c msgid "bind failed" msgstr "enlace fallido" #: src/netcam_ftp.c msgid "listen failed" msgstr "escucha fallido" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "envío fallido en ftp get socket" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "aceptar en ftp get socket" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "recv falló en la lectura de ftp" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "ftp get socket falló" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "Error al enviar TYPE I al servidor ftp" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "token mal formado Contenido-Longitud pero valor %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "Contenido-Longitud %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "Tipos de contenido %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "" "Error al leer el encabezado de la imagen, modo de transmisión (1). " "Encabezado nulo." #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "" "Error al leer el encabezado de la imagen, modo de transmisión (1). " "Encabezado desconocido ' %s'" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "Error al leer el encabezado de la imagen (2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "Encabezado no JPEG" #: src/netcam_http.c msgid "Content-Length 0" msgstr "Longitud del contenido 0" #: src/netcam_http.c msgid "Found image header record" msgstr "Registro de encabezado de imagen encontrado" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "Error al enviar la solicitud 'conectar'" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "Recibió el primer encabezado (' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "Error al leer el primer encabezado ( %s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "Código de resultado HTTP %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "" "Se eliminó el indicador de Netcam Keep-Alive debido a una aparente conexión " "HTTP cerrada." #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "Cámara sin transmisión (conjunto para mantener vivo)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "Cámara sin transmisión (mantener vivo no configurado)" #: src/netcam_http.c msgid "Streaming camera" msgstr "Cámara de streaming" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "Cadena de límite [ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "Cadena de límite no encontrada en el encabezado" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "" "Cámara de transmisión probablemente usando bloques MJPG, considere usar " "mjpg: //netcam url." #: src/netcam_http.c msgid "Unrecognized content type" msgstr "Tipo de contenido no reconocido" #: src/netcam_http.c msgid "Content-length present" msgstr "Presente de longitud de contenido" #: src/netcam_http.c msgid "Content-length 0" msgstr "Longitud del contenido 0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "Conexión encontrada: cerrar encabezado (' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "" "Se recibió el encabezado 'Connection: Keep-Alive' y 'Connection: close'.El " "movimiento elimina keepalive." #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "" "Se recibió el encabezado 'Connection: Keep-Alive' y 'Connection: close'.El " "movimiento continúa sin cambios." #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "Recibió un campo Keep-Alive en este conjunto de encabezados." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "No se recibió el encabezado 'Conexión: Keep-Alive' ni 'Conexión: cerrar'. \n" " El movimiento elimina keepalive." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "No se recibió el encabezado 'Conexión: Keep-Alive' ni 'Conexión: cerrar'. \n" " El movimiento continúa sin cambios." #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "Se eliminó el indicador de Netcam Keep-Alive porque se recibió el encabezado " "'Conexión: cerrar'. \n" " Netcam no es compatible con Keep-Alive. El movimiento continúa en no-Keep-" "Alive." #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "Keep-Alive ha llegado al final del período válido. \n" " Motion cerrará netcam, luego reanudará Keep-Alive con un nuevo socket." #: src/netcam_http.c msgid "disconnect" msgstr "desconectar" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo () falló ( %s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "desconectar netcam (1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "desconectando netcam ya que no se ha establecido mantener vivo." #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "sin keepalive, el intento de crear un socket falló." #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "sin keepalive, se creó un nuevo socket fd %d" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "con keepalive establecido, socket no válido. Esta podría ser la primera vez. " "Creando unEl nuevo falló." #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "" "con keepalive establecido, socket no válido. Esto podría ser la primera vez, " "creó un nuevouno con fd %d" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "SO KEEPALIVE es %s" #: src/netcam_http.c msgid "ON" msgstr "EN" #: src/netcam_http.c msgid "OFF" msgstr "APAGADO" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "SO KEEPALIVE establecido en el zócalo." #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "fcntl (1) en el zócalo" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "fcntl (2) en el zócalo" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "connect () falló ( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "desconectar netcam (4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "tiempo de espera en connect ()" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "desconectar netcam (2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "getsockopt después de conectar" #: src/netcam_http.c msgid "connect returned error" msgstr "conectar error devuelto" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "desconectar netcam (3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "expandir el búfer de [ %d / %d] a [ %d / %d] bytes." #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "Límite de división potencial: %d caracteres enjuagados, %d reubicados" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "recv () falla después de la cadena de límite" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "dejando netcam conectada." #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "a punto de intentar conectarse, tiempo # %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "Error al abrir la cámara: verifique su configuración y que la cámara de red " "esté en línea" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "Error al leer el primer encabezado - reintentando" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "" "No se pudo leer el primer encabezado de la cámara, renunciando por ahora" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "Netcam tiene banderas: HTTP / 1.0: %s HTTP / 1.1: %s Keep-Alive %s." #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "" "Se eliminó el indicador de netcam keepalive debido al conjunto de proxy. El " "proxy es incompatible conMantener viva." #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "" "No se pudo leer el encabezado de la primera secuencia; por ahora, desistir" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "conectado, pasando a leer la imagen." #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "Error de lectura al intentar volver a conectar." #: src/netcam_http.c msgid "lost the cam." msgstr "perdí la cámara." #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "Relleno de búfer con [ %d] bytes de la red." #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "Lea los bytes del encabezado [ %d / %d]." #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "Encabezado no válido recibido, reconectando" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "Leer [ %d / %d] bytes de fragmento, [ %d / %d] total" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "Trozo completo, el búfer usó [ %d] bytes." #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "Imagen completa, el búfer utilizó [ %d] bytes." #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "conectado, pasando a leer y decodificar fragmentos MJPG." #: src/netcam_http.c msgid "Begin" msgstr "Empezar" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "error de stat ( %s)" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]! = last st mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "esperando nuevo tiempo de espera de imagen de archivo" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "retrasar la espera de una nueva imagen de archivo " #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "procesamiento de nueva imagen de archivo - st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "error de apertura ( %s): %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "error de lectura ( %s): %d" #: src/netcam_http.c msgid "End" msgstr "Fin" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> archivo-> ruta %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "No hay suficientes datos de netcam." #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> error de jpeg %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "*** nuevo retraso de foto exitoso ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "jpeg error %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "procesamiento de imagen jpeg - longitud del contenido %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "El ancho / alto de la cámara no coincide con la imagen JPEG: %dx %d " "esperado, JPEG %dx %dretval %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s: matriz de paquetes redimensionada a %d" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s: paquete de copia av: %s, interrupción: %s" #: src/netcam_rtsp.c msgid "True" msgstr "Cierto" #: src/netcam_rtsp.c msgid "False" msgstr "Falso" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: ignorando el paquete con datos no válidos" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: Error de cuadro de grabación: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "Ignorando el paquete con datos no válidos" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "Error al decodificar el paquete: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "%s: Error al transferir HW decodificado a la memoria del sistema" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "Error al enviar el paquete al códec: %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "Error al decodificar el paquete de video: copiando al búfer" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: Dispositivos HW: " #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s (disponible)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s (no implementado)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s: descodificador de netcam %s deshabilitado." #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "No se pudo obtener el formato vaapi pix" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "No se pudo obtener el formato cuda pix" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s: interrumpido." #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: fallido" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s: el decodificador %s no funcionó." #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "" "%s: ignorando y eliminando el decodificador solicitado por el usuario %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s: inicializando el decodificador vaapi" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: no se puede encontrar el dispositivo vaapi hw" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s: Inicializando el decodificador cuda" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: no se puede encontrar el dispositivo cuda hw" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s: Inicializando decodificador" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s: uso del decodificador %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: decodificador abierto" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s: tiempo de espera de lectura de cámara ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s: se agotó el tiempo de espera de la cámara ( %s)" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "No se puede asignar swsframe en." #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "No se puede asignar swsframe out." #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "No se puede asignar el contexto de escala." #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "Error al determinar el tamaño del marco" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "Error al asignar imagen en: %s" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "Error al asignar la imagen: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "Error al cambiar el tamaño / formatear: %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "Error al colocar el marco en el búfer de salida: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s: interrumpido" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: av fotograma de lectura: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: Intentos excesivos de obtener datos de la cámara %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "" "%s: tasa de captura no especificada en los parámetros de netcam. Usando %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s: tasa de captura no especificada en los parámetros de netcam. Usando " "framerate %d" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "La cámara de red está enviando imágenes en un lugar diferente" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "tamaño que se especifica en la configuración y también un " #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "formato de imagen diferente La imagen está siendo" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "transcodificado a YUV420P y en el tamaño solicitado" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "en el archivo de configuración. Si es posible, cambie netcam a" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "estar en formato YUV420P y el tamaño solicitado en el" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "config para posiblemente reducir el uso de la CPU." #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "tamaño que el especificado en el archivo de configuración." #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "La imagen se está transcodificando al tamaño " #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "solicitado en la configuración. Si es posible, cambie" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "netcam o configuración para indicar el mismo tamaño" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "para posiblemente reducir el uso de la CPU." #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "Netcam: %dx %d => Configuración: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "La imagen enviada está siendo " #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "transcodificado a YUV420P. Si es posible cambie netcam " #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "formato de imagen a YUV420P para posiblemente reducir el uso de CPU." #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: Configuración de rtsp / rtmp" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: configuración del formato de entrada mjpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: Configuración del formato de entrada video4linux2" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: configurando archivo de película" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s: configurando %s" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: opción: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "Configuración de v4l2 a través de netcam" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "Configuración de archivo a través de netcam" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "Configurando %s a través de netcam" #: src/netcam_rtsp.c msgid "highres" msgstr "alta resolución" #: src/netcam_rtsp.c msgid "norm" msgstr "norma" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "Configurando %s stream." #: src/netcam_rtsp.c msgid "Unknown" msgstr "Desconocido" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "Stream copiado para pasar" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "Camino nulo pasado para conectar" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s: no se puede abrir la cámara ( %s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s: cámara abierta ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s: no se puede encontrar la información de la transmisión: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s: no se puede abrir el contexto del códec: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s: el tamaño de la imagen de la cámara no es válido" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s: no se puede asignar el marco." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s: no se pudo copiar la transmisión para la transferencia." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s: no se pudo leer la primera imagen" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s: cámara ( %s) conectada" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s: la tasa de captura de Netcam es %d." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s: la fuente de la cámara es %d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s: No se puede determinar el FPS de origen de la cámara." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s: la tasa de captura es menor que los FPS de la cámara." #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s: se producirán errores de decodificación." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "" "%s: se recomienda una velocidad de captura ligeramente superior a los FPS de " "la cámara." #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s: Reconectando con la cámara ..." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s: la cámara no se volvió a conectar." #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s: Verificando la cámara cada 10 segundos." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s: Comenzó el subproceso del controlador de la cámara [ %d]" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s: bucle del controlador terminado." #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s: error al iniciar el subproceso del controlador" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s: esperando la primera imagen del controlador." #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "incapaz de crear contexto rtsp" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "incapaz de crear contexto alto rtsp" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "Sin soporte FFmpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s: apagando la cámara de red." #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s: no hay respuesta del subproceso del controlador." #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "Resolución normal: cierre completo." #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "Alta resolución: cierre completo." #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "No se puede establecer establecer EXIF ​​en un fragmento webp" #: src/picture.c msgid "libwebp version error" msgstr "error de versión de libwebp" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "error de asignación de búfer de imagen libwebp" #: src/picture.c msgid "libwebp image compression error" msgstr "error de compresión de imagen libwebp" #: src/picture.c msgid "unable to assemble webp image" msgstr "incapaz de ensamblar la imagen webp" #: src/picture.c msgid "unable to save webp image to file" msgstr "no se puede guardar la imagen webp en el archivo" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "No se puede escribir la imagen en el archivo %s: verifique los derechos de " "acceso al directorio de destino \n" "El hilo va a terminar debido a este error fatal" #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "No se puede escribir la imagen en el archivo %s" #: src/picture.c msgid "Error getting PGM vars." msgstr "Error al obtener las variables PGM." #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "Este no es un archivo pgm, comienza con ' %s'" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "Mágico %s: Ancho %s(%d): Alto %s(%d): MaxVal: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "Error al leer los datos de imagen del archivo pgm" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "" "El archivo de máscara especificado no tiene el mismo tamaño que la imagen de " "la cámara." #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "" "Intentando cambiar el tamaño de la imagen de máscara de %dx %d a %dx %d" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "" "no se puede escribir el archivo de máscara %s - verifique los derechos de " "acceso al directorio de destino" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "no se puede escribir el archivo de máscara %s" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "Error al escribir la máscara predeterminada como archivo pgm" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "Creando una máscara vacía %s \n" "Edite este archivo y vuelva a ejecutar el movimiento para habilitar la " "función de máscara" #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "La opción de configuración \"rotar \" no es un múltiplo de 90: %d" #: src/track.c msgid "internal error" msgstr "error interno" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "error interno, %hu no es un tipo de pista conocido" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "puerto %s dev fd %i, motor %hu comando %hu data %hu" #: src/track.c msgid "Status byte timeout!" msgstr "Byte de estado de tiempo de espera!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "Intenta abrir el dispositivo serie %s" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "No se puede abrir el dispositivo serie %s" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "No se puede inicializar el dispositivo serie %s" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "Dispositivo serie %s abierto e inicialización, fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "Todavía no se inició el dispositivo %s, probando stepper center ()" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "no se pudo inicializar el dispositivo paso a paso en %s, fd [ %i]." #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "éxito, dispositivo iniciado %s, fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "ENVIOS puerto %s dev fd %i, motor %hu comando %hu data %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "Comando return %d" #: src/track.c msgid "Problem opening servo!" msgstr "Problema al abrir el servo!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d, cent-> y %d, reversex %d, reversey %d manual %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d valor fuera de rango! ( %d - %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d valor fuera de rango! ( %d - %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "X offset %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "X cent-> x %d, cent-> y %d, reversex %d, reversey %d motorx %d data %d " "comando %d" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Y offset %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Y cent-> x %d, cent-> y %d, reversex %d, reversey %d motory %d data %d " "comando %d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "X-offset %d, Y-offset %d, x-position %d. posición y %d, reversex %d, reversey" "%d, tamaño de paso %d" #: src/track.c msgid "Return byte timeout!" msgstr "Tiempo de espera de byte de retorno!" #: src/track.c msgid "Unable to set camera speed" msgstr "No se puede establecer la velocidad de la cámara" #: src/track.c msgid "succeed" msgstr "tener éxito" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "¡Error al restablecer la cámara pwc a la posición inicial! Razón" #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "fallido VIDIOCPWCMPTGRANGE" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "¡Error al mover / inclinar la cámara pwc! Razón" #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "¡Error al restablecer la cámara UVC a la posición inicial! Razón" #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "Resetear la cámara UVC a la posición inicial" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl querycontrol" #: src/track.c msgid "Getting camera range" msgstr "Obtener alcance de la cámara" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "" "ENTRADA PARAM ABS pan mín. %d, pan máx. %d, inclinación mín. %d, inclinación " "máx. %d " #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "PARAM ENTRADA ABS X Angel %d, Y Angel %d " #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "Para SET ABS mover X %d, mover Y %d" #: src/track.c msgid "Failed to move UVC camera!" msgstr "¡Error al mover la cámara UVC!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "MINMAX encontrado = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "Antes de ABS Y Angel: x = %d, Y = %d, " #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "Después de ABS Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "Para SET REL pan min %d, pan max %d, tilt min %d, tilt max %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "Para SET REL track pan Angel %d, track tilt Angel %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "Para SET REL mover X %d, mover Y %d" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr " dev %d, addr = %d, control S = %d, Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr " dev %d, addr = %d, control S = %d, Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "Antes de REL Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "Después de REL Y Angel: x = %d, Y = %d" #: src/translate.c msgid "Language: English" msgstr "Idioma: Español" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "¡No se pudo asignar %llu bytes de memoria!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "" "¡Advertencia! ¡La función %s intenta cambiar el tamaño del bloque de memoria " "en %p a 0 bytes!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "¡No se pudo cambiar el tamaño del bloque de memoria en el desplazamiento %p " "a %llu bytes (función %s)!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "Problema al crear el directorio %s" #: src/util.c #, c-format msgid "creating directory %s" msgstr "creando el directorio %s" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "Error al abrir el archivo %s con el modo %s" #: src/util.c msgid "Error closing file" msgstr "Error al cerrar archivo" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbeventid} no es compatible. Usar id. de evento." #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "palabra clave de especificador de formato no válido %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "No se puede establecer el nombre del hilo %s" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "" "La versión de FFMPEG es demasiado antigua. Deshabilitar el procesamiento de " "paso." #: src/util.c msgid "pass-through enabled." msgstr "transferencia habilitada." #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "Error al configurar el parámetro> %s <" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "Analizado:> %s <> %s <" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "Analizado:> redactado <> redactado <" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "Error al analizar los controles parm nm: %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "Error al analizar los controles de parm vl: %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "Error al configurar la temperatura: %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "Error al analizar los controles: %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "Análisis: %s" #: src/util.c msgid "Parsing: " msgstr "Análisis: " #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "Error al analizar los controles: %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "Error: %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "Nuevos parámetros de netcam: %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "Nuevos parámetros altos de netcam: %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "Nuevos parámetros de video: %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "Nuevos parámetros de encabezado de control web: %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "Nuevos parámetros de encabezado de webcontrol: " #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "Nuevos parámetros de encabezado de transmisión: %s" #: src/util.c msgid "New stream_header_params: " msgstr "Nuevos parámetros de encabezado de transmisión: " #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "Error de programación. Elemento de configuración desconocido: %s" #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE Error al establecer el tono [ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "a [ %d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE Error al obtener tono" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT Error al establecer la saturación [ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT Error al obtener la saturación" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT Error al establecer el contraste [ %d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT Error al obtener contraste" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "METEORSBRIG brillo [ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIG obteniendo brillo" #: src/video_bktr.c msgid "Not implemented" msgstr "No se ha implementado" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "Entrada de dispositivo %d fuera de rango (0-4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d inválido - Intentando compuesto %d" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "" "BT848SFMT, no se pudo establecer el formato de entrada, intente nuevamente " "con el valor predeterminado" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "BT848SFMT, no se pudo establecer el formato de entrada por defecto" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "No se pudo establecer la geometría" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "a [ %d / %d] Norma %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "Frecuencia no válida [ %ld] para la entrada de fuente [ %i]" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "Frecuencia [ %ld] Entrada de fuente [ %i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "establecer entrada [ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "establecer formato de entrada [ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "establecer geometría [ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "Conjunto de frecuencias (aún no implementado" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "Dimensionar el búfer a 3x" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "Dimensionar el búfer a 3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap falló" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "METEORCAPTUR utilizando un solo método Captura de errores" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "Error al capturar usando un método único" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "No se puede encontrar el dispositivo de video" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "Dispositivo de video de cierre %s" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "" "Todavía %d usuarios del dispositivo de video %s, por lo que no lo cerramos " "ahora" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "ancho de imagen de configuración ( %d) no es módulo 8" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "la altura de la imagen de configuración ( %d) no es el módulo 8" #: src/video_bktr.c msgid "Stopping capture" msgstr "Deteniendo la captura" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "" "Reutilizando [ %s] entradas [ %d, %d] Cambiar el método de captura METEOR " "CAP SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "PALETA DE VIDEO YUV420P configurando imgs.size norm y imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "dispositivo de video abierto %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "dispositivo sintonizador abierto %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "Imagen corrupta ... continuar" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "Posición de SOI ajustada por %d bytes." #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "llamando a la limpieza de mmalcam" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "llamada limpieza de netcam" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "llamando a netcam rtsp cleanup" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "Limpieza del dispositivo V4L2" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "Limpieza del dispositivo BKTR" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "Sin limpieza del dispositivo de la cámara (MMAL, Netcam, V4L2, BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "Apertura de la cámara MMAL" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "La cámara MMAL no se pudo abrir" #: src/video_common.c msgid "Opening Netcam" msgstr "Abriendo Netcam" #: src/video_common.c msgid "Netcam failed to open" msgstr "Netcam no se pudo abrir" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Abriendo Netcam RTSP" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Netcam RTSP no pudo abrirse" #: src/video_common.c msgid "Opening V4L2 device" msgstr "Apertura del dispositivo V4L2" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "El dispositivo V4L2 no pudo abrirse" #: src/video_common.c msgid "Opening BKTR device" msgstr "Apertura del dispositivo BKTR" #: src/video_common.c msgid "BKTR device failed to open" msgstr "El dispositivo BKTR no pudo abrirse" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "" "No se especificó ningún dispositivo de cámara (MMAL, Netcam, V4L2, BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "Error al abrir ' %s'" #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "Error al especificar el búfer: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "Tampón de apertura: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "Tampón de lectura: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "dispositivo de video encontrado ' %s' %d" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "Abierto %s como salida de tubería" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "Abriendo %s cuando la salida de la tubería falló" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "Especificaciones de tubería originales" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "Especificaciones de tubería propuestas" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "Especificaciones finales de la tubería" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "No se encontraron controles para el dispositivo" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "--------- Controles ---------" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr " Nombre y rango de identificación de V4L2" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "Error al restablecer el valor del usuario" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "Dejando el control %s \"%s\" establecido en %d" #: src/video_v4l2.c msgid "Device not ready" msgstr "Dispositivo no listo" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "Establezca el control \" %s \" en el valor %d" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "No se pudo establecer el control %s \"%s\" en %d." #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "" "El valor de la opción de control %s %s está por debajo del mínimo. Usando un " "mínimo de %d" #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "" "El valor de la opción de control %s %s está por encima del máximo. Usando el " "máximo %d" #: src/video_v4l2.c msgid "control type not supported yet" msgstr "tipo de control aún no compatible" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "No se puede consultar la entrada %d. ENTRADA VIDIOC, si usa una entrada de " "cambio WEBCAMvalor en conf por -1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "Nombre = \" %s \", escriba 0x %08X, estado %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "Nombre = \" %s \", - SINTONIZADOR" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "Nombre = \" %s \" - CÃMARA" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "Error al seleccionar la entrada %d ENTRADA VIDIOC" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "El dispositivo no admite la especificación de la norma PAL / NTSC" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "- estándar de video %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "Error al seleccionar el método estándar %d VIDIOC S STD" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "Estándar de video configurado en NTSC" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "Estándar de video configurado en SECAM" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "Estándar de video configurado en PAL" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "sintonizador %d SINTONIZADOR VIDIOC G" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "Establecer sintonizador %d" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "frecuencia %ul FRECUENCIA VIDIOC" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "Establecer frecuencia en %ul" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "No se puede usar %c%c%c%c (%dx%d)" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "Paleta de prueba %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "Comprobación del tamaño de imagen %dx%d con zancada %d" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "No se proporciona ningún valor de zancada desde el dispositivo." #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "El ancho (%d) debe ser menor que el paso (%d)" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "El ancho de la imagen (%d) no es múltiplo del paso (%d)" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "Condición imposible: Ancho (%d), Zancada (%d), Por zancada (%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "El ancho de la imagen se rellenará %d bytes" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "Ajuste de la resolución de %ix %i a %ix %i." #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "Resolución ajustada no módulo 8." #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "" "Especifique diferentes paletas o ancho / alto en el archivo de configuración." #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "Error al configurar el formato de píxeles." #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "Uso de la paleta %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "Ajuste al ancho ( %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "Ajuste a la altura ( %d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "" "El índice de la paleta de configuración %d ( %s) para %dx %d no funciona." #: src/video_v4l2.c msgid "Supported palettes:" msgstr "Paletas compatibles:" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d - %s (comprimido: %d) ( %# x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "Paleta seleccionada %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "Error en la selección de paleta para el formato %s" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "No se puede encontrar un formato de paleta compatible." #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "Error al solicitar buffers %d para el mapa de memoria. VIDIOC REQBUFS" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "información de mmap: marcos = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "Memoria de búfer insuficiente %d %s< >%s< >%s<" msgstr "Acción solicitada no válida:> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "Idioma nativo: en" #: src/webu.c msgid "Native Language : off" msgstr "Idioma nativo: off" #: src/webu.c msgid "Set the value to null/zero" msgstr "Establezca el valor en nulo / cero" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "Ignorando la conexión de: %s" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "Autenticación fallida de %s" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "Ningún usuario de control web: pase proporcionado" #: src/webu.c msgid "No stream user:pass provided" msgstr "Sin usuario de transmisión: pase proporcionado" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "Respuesta invalida" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "Error al agregar el encabezado de control web %s %s" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "Error al agregar el encabezado de la transmisión %s %s" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "Método no válido solicitado: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "Conexión desde: %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "la página de envío falló %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "La imagen de la transmisión aún no está lista" #: src/webu.c msgid "Stream process requested to finish." msgstr "Se solicitó finalizar el proceso de transmisión." #: src/webu.c msgid "Send page failed." msgstr "Error al enviar la página." #: src/webu.c msgid "Basic authentication: available" msgstr "Autenticación básica: disponible" #: src/webu.c msgid "Basic authentication: disabled" msgstr "Autenticación básica: deshabilitada" #: src/webu.c msgid "Digest authentication: available" msgstr "Autenticación implícita: disponible" #: src/webu.c msgid "Digest authentication: disabled" msgstr "Autenticación implícita: deshabilitada" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd libary demasiado viejo ipv6 deshabilitado" #: src/webu.c msgid "IPV6: available" msgstr "IPV6: disponible" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6: deshabilitado" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd libary SSL / TLS demasiado viejo deshabilitado" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS: disponible" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS: deshabilitado" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "Error al leer el archivo para el soporte SSL / TLS." #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "Se requiere SSL / TLS pero no se proporciona un archivo cert. SSL / TLS " "deshabilitado" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "" "SSL / TLS solicitado pero no se proporciona ningún archivo de clave. SSL / " "TLS deshabilitado" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "Inicio de webcontrol en el puerto %d" #: src/webu.c msgid "Unable to start MHD" msgstr "No se puede iniciar MHD" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "Se inició webcontrol en el puerto %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "" "Se inició la transmisión de la cámara %d en el puerto / identificación de la " "cámara %d / %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "Se inició la transmisión de la cámara %d en el puerto %d" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "Inicio de todas las transmisiones de cámara en el puerto %d" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "Iniciando la transmisión de la cámara %d en el puerto %d" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "No se puede iniciar la transmisión para la cámara %d" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "Puerto duplicado solicitado %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "Bloqueo de webcontrol no válido max ips. Ajuste igual a 25." #: src/webu_html.c msgid "Cameras" msgstr "Cámaras" #: src/webu_html.c msgid "Camera" msgstr "Cámara" #: src/webu_html.c msgid "All" msgstr "Todas" #: src/webu_html.c msgid "Action" msgstr "Acción" #: src/webu_html.c msgid "Start Event" msgstr "Evento de inicio" #: src/webu_html.c msgid "End Event" msgstr "Evento final" #: src/webu_html.c msgid "Snapshot" msgstr "Instantánea" #: src/webu_html.c msgid "Change Configuration" msgstr "Cambiar Configuración" #: src/webu_html.c msgid "Write Configuration" msgstr "Configuración de Escritura" #: src/webu_html.c msgid "Tracking" msgstr "Rastreo" #: src/webu_html.c msgid "Pause" msgstr "Pausa" #: src/webu_html.c msgid "Start" msgstr "Comienzo" #: src/webu_html.c msgid "Restart" msgstr "Reiniciar" #: src/webu_html.c msgid "Quit" msgstr "Dejar" #: src/webu_html.c msgid "Help" msgstr "Ayuda" #: src/webu_html.c msgid "No Configuration Options" msgstr "Sin opciones de configuración" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "Opciones de configuración limitadas" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "Opciones de configuración avanzada" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "Opciones de configuración restringida" #: src/webu_html.c msgid "All Cameras" msgstr "Todas Cámaras" #: src/webu_html.c msgid "Not running" msgstr "No activo" #: src/webu_html.c msgid "Lost connection" msgstr "Conexión perdida" #: src/webu_html.c msgid "Paused" msgstr "En pausa" #: src/webu_html.c msgid "Active" msgstr "Activo" #: src/webu_html.c msgid "Select option" msgstr "Seleccionar opción" #: src/webu_html.c msgid "Save" msgstr "Salvar" #: src/webu_html.c msgid "Pan/Tilt" msgstr "Girar/Inclinación" #: src/webu_html.c msgid "Absolute Change" msgstr "Cambio Absoluto" #: src/webu_html.c msgid "Center" msgstr "Centro" #: src/webu_html.c msgid "Pan" msgstr "Girar" #: src/webu_html.c msgid "Tilt" msgstr "Inclinación" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "Hilo especificado no válido: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "URL no válida para un puerto específico de la cámara: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "" "La URL del hilo 0 no es válida cuando se usan archivos específicos de la " "cámara .: %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "URL incorrecta para un puerto específico de la cámara: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "No se pudo obtener la imagen para transmitir." #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "La opción ' %s' se deprecia. El nuevo nombre de la opción es '%s'" motion-release-4.6.0/po/fi.po000066400000000000000000003237011452402535500160330ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:39-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "%s version %s jälkeen" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "Tuntematon asetusvaihtoehto \" %s \"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "Konfigurointitiedoston kirjoittaminen tiedostoon %s" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "Määritä tiedostoa %s ei löydy - yritetään oletusasetuksia." #: src/conf.c msgid "Error getcwd" msgstr "Virhe getcwd" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "%s-tiedostoa ei voitu avata" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "Virheellinen tiedostonimi %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "Käsittelylanka 0 - konfigurointitiedosto %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "Ei prosessoitavaa konfigurointitiedostoa oletusarvojen avulla" #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "Kokoonpanoparametrien kirjoittaminen kaikista tiedostoista ( %d):" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "Ketju %d - Konfigurointitiedosto: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s " #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "Prosessoidaan konfigurointitiedostoa %s" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "Kamerahakemistokonfiguraatiota %s ei löydy" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "Kameran konfigurointitiedostoa %s ei löydy" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "Käsitellään kameran konfigurointitiedostoa %s" #: src/conf.c msgid "daemon" msgstr "demoni" #: src/conf.c msgid "setup_mode" msgstr "asetustila" #: src/conf.c msgid "pid_file" msgstr "pid-tiedosto" #: src/conf.c msgid "log_file" msgstr "loki tiedosto" #: src/conf.c msgid "log_level" msgstr "lokitaso" #: src/conf.c msgid "log_type" msgstr "lokityyppi" #: src/conf.c msgid "quiet" msgstr "hiljainen" #: src/conf.c msgid "watchdog_tmo" msgstr "vahtikoira tmo" #: src/conf.c msgid "watchdog_kill" msgstr "vahtikoira tappaa" #: src/conf.c msgid "native_language" msgstr "äidinkieli" #: src/conf.c msgid "camera_name" msgstr "kameran nimi" #: src/conf.c msgid "camera_id" msgstr "kameran tunnus" #: src/conf.c msgid "target_dir" msgstr "kohdeohjaaja" #: src/conf.c msgid "video_device" msgstr "videolaite" #: src/conf.c msgid "video_params" msgstr "videopalvelut" #: src/conf.c msgid "auto_brightness" msgstr "automaattinen kirkkaus" #: src/conf.c msgid "tuner_device" msgstr "viritin laite" #: src/conf.c msgid "roundrobin_frames" msgstr "pyöreän rivin kehykset" #: src/conf.c msgid "roundrobin_skip" msgstr "pyöreä satama" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "pyöreärobinisuodatin" #: src/conf.c msgid "netcam_url" msgstr "netcam url" #: src/conf.c msgid "netcam_params" msgstr "netcam -avustajat" #: src/conf.c msgid "netcam_high_url" msgstr "netcam korkea url" #: src/conf.c msgid "netcam_high_params" msgstr "netcam high params" #: src/conf.c msgid "netcam_userpass" msgstr "netcam userpass" #: src/conf.c msgid "mmalcam_name" msgstr "mmalcam nimi" #: src/conf.c msgid "mmalcam_params" msgstr "mmalcam -avustajat" #: src/conf.c msgid "width" msgstr "leveys" #: src/conf.c msgid "height" msgstr "korkeus" #: src/conf.c msgid "framerate" msgstr "ruudunpäivitysnopeus" #: src/conf.c msgid "minimum_frame_time" msgstr "vähimmäiskuvausaika" #: src/conf.c msgid "rotate" msgstr "kiertää" #: src/conf.c msgid "flip_axis" msgstr "kääntöakseli" #: src/conf.c msgid "locate_motion_mode" msgstr "paikantaa liiketila" #: src/conf.c msgid "locate_motion_style" msgstr "paikantaa liiketyyli" #: src/conf.c msgid "text_left" msgstr "teksti jäljellä" #: src/conf.c msgid "text_right" msgstr "teksti oikein" #: src/conf.c msgid "text_changes" msgstr "tekstin muutokset" #: src/conf.c msgid "text_scale" msgstr "tekstiasteikko" #: src/conf.c msgid "text_event" msgstr "tekstitapahtuma" #: src/conf.c msgid "emulate_motion" msgstr "jäljitellä liikettä" #: src/conf.c msgid "pause" msgstr "tauko" #: src/conf.c msgid "threshold" msgstr "kynnys" #: src/conf.c msgid "threshold_maximum" msgstr "kynnyksen enimmäismäärä" #: src/conf.c msgid "threshold_tune" msgstr "kynnyksen viritys" #: src/conf.c msgid "noise_level" msgstr "melutaso" #: src/conf.c msgid "noise_tune" msgstr "meluääni" #: src/conf.c msgid "despeckle_filter" msgstr "tuhoamissuodatin" #: src/conf.c msgid "area_detect" msgstr "alueen havaitseminen" #: src/conf.c msgid "mask_file" msgstr "peitetiedosto" #: src/conf.c msgid "mask_privacy" msgstr "naamio yksityisyyttä" #: src/conf.c msgid "smart_mask_speed" msgstr "älykäs naamion nopeus" #: src/conf.c msgid "lightswitch_percent" msgstr "valonkytkinprosentti" #: src/conf.c msgid "lightswitch_frames" msgstr "valokytkinkehykset" #: src/conf.c msgid "minimum_motion_frames" msgstr "vähimmäisliikekehykset" #: src/conf.c msgid "event_gap" msgstr "tapahtumakuilu" #: src/conf.c msgid "pre_capture" msgstr "esikaappaus" #: src/conf.c msgid "post_capture" msgstr "sieppauksen jälkeen" #: src/conf.c msgid "on_event_start" msgstr "tapahtuman alkaessa" #: src/conf.c msgid "on_event_end" msgstr "tapahtuman lopussa" #: src/conf.c msgid "on_picture_save" msgstr "kuvassa tallenna" #: src/conf.c msgid "on_area_detected" msgstr "havaitulla alueella" #: src/conf.c msgid "on_motion_detected" msgstr "liikkeessä havaittu" #: src/conf.c msgid "on_movie_start" msgstr "elokuvan alkaessa" #: src/conf.c msgid "on_movie_end" msgstr "elokuvan lopussa" #: src/conf.c msgid "on_camera_lost" msgstr "kamerassa kadonnut" #: src/conf.c msgid "on_camera_found" msgstr "kamerasta löytyi" #: src/conf.c msgid "picture_output" msgstr "kuvan lähtö" #: src/conf.c msgid "picture_output_motion" msgstr "kuvan lähtöliike" #: src/conf.c msgid "picture_type" msgstr "kuvatyyppi" #: src/conf.c msgid "picture_quality" msgstr "kuvanlaatu" #: src/conf.c msgid "picture_exif" msgstr "kuva exif" #: src/conf.c msgid "picture_filename" msgstr "kuvatiedostonimi" #: src/conf.c msgid "snapshot_interval" msgstr "tilannekuvaväli" #: src/conf.c msgid "snapshot_filename" msgstr "tilannekuvan tiedostonimi" #: src/conf.c msgid "movie_output" msgstr "elokuvan lähtö" #: src/conf.c msgid "movie_output_motion" msgstr "elokuvan lähtöliike" #: src/conf.c msgid "movie_max_time" msgstr "elokuvan enimmäisaika" #: src/conf.c msgid "movie_bps" msgstr "elokuvan bps" #: src/conf.c msgid "movie_quality" msgstr "elokuvan laatu" #: src/conf.c msgid "movie_codec" msgstr "elokuvakoodekki" #: src/conf.c msgid "movie_duplicate_frames" msgstr "elokuvan kaksoiskappaleet" #: src/conf.c msgid "movie_passthrough" msgstr "elokuvan passthrough" #: src/conf.c msgid "movie_filename" msgstr "elokuvan tiedostonimi" #: src/conf.c msgid "movie_extpipe_use" msgstr "elokuvan loppukäyttö" #: src/conf.c msgid "movie_extpipe" msgstr "elokuvan loppu" #: src/conf.c msgid "timelapse_interval" msgstr "Aikaväli" #: src/conf.c msgid "timelapse_mode" msgstr "aikakatkaisutila" #: src/conf.c msgid "timelapse_fps" msgstr "timelapse fps" #: src/conf.c msgid "timelapse_codec" msgstr "timelapse-koodekki" #: src/conf.c msgid "timelapse_filename" msgstr "timelapse-tiedostonimi" #: src/conf.c msgid "video_pipe" msgstr "videoputki" #: src/conf.c msgid "video_pipe_motion" msgstr "videoputken liike" #: src/conf.c msgid "webcontrol_port" msgstr "web-ohjausportti" #: src/conf.c msgid "webcontrol_ipv6" msgstr "webcontrol ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "webcontrol localhost" #: src/conf.c msgid "webcontrol_parms" msgstr "verkkokontrolliparms" #: src/conf.c msgid "webcontrol_interface" msgstr "web-käyttöliittymä" #: src/conf.c msgid "webcontrol_auth_method" msgstr "webcontrol auth -menetelmä" #: src/conf.c msgid "webcontrol_authentication" msgstr "webcontrol-todennus" #: src/conf.c msgid "webcontrol_tls" msgstr "webcontrol tls" #: src/conf.c msgid "webcontrol_cert" msgstr "webcontrol -sertifikaatti" #: src/conf.c msgid "webcontrol_key" msgstr "web-avain" #: src/conf.c msgid "webcontrol_header_params" msgstr "webcontrol -otsikon parametrit" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "webcontrol -lukituksen minuutit" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "webcontrol -lukitusyritykset" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "webcontrol -lukon maksimi ips" #: src/conf.c msgid "stream_port" msgstr "stream-portti" #: src/conf.c msgid "stream_localhost" msgstr "stream localhost" #: src/conf.c msgid "stream_auth_method" msgstr "stream auth -menetelmä" #: src/conf.c msgid "stream_authentication" msgstr "suoratodennus" #: src/conf.c msgid "stream_tls" msgstr "stream tls" #: src/conf.c msgid "stream_header_params" msgstr "stream header params" #: src/conf.c msgid "stream_preview_scale" msgstr "stream-esikatselukuva" #: src/conf.c msgid "stream_preview_newline" msgstr "stream esikatselu newline" #: src/conf.c msgid "stream_preview_method" msgstr "stream-esikatselutapa" #: src/conf.c msgid "stream_quality" msgstr "streamin laatu" #: src/conf.c msgid "stream_grey" msgstr "stream harmaa" #: src/conf.c msgid "stream_motion" msgstr "stream motion" #: src/conf.c msgid "stream_maxrate" msgstr "suoravirta maks" #: src/conf.c msgid "stream_limit" msgstr "virtaraja" #: src/conf.c msgid "database_type" msgstr "tietokantatyyppi" #: src/conf.c msgid "database_dbname" msgstr "tietokannan dbname" #: src/conf.c msgid "database_host" msgstr "tietokannan isäntä" #: src/conf.c msgid "database_port" msgstr "tietokantaportti" #: src/conf.c msgid "database_user" msgstr "tietokannan käyttäjä" #: src/conf.c msgid "database_password" msgstr "tietokannan salasana" #: src/conf.c msgid "database_busy_timeout" msgstr "tietokannan varattu aikakatkaisu" #: src/conf.c msgid "sql_log_picture" msgstr "SQL lokikuva" #: src/conf.c msgid "sql_log_snapshot" msgstr "SQL-lokin tilannekuva" #: src/conf.c msgid "sql_log_movie" msgstr "SQL log -elokuva" #: src/conf.c msgid "sql_log_timelapse" msgstr "SQL-lokien aikataulu" #: src/conf.c msgid "sql_query_start" msgstr "SQL-kyselyn aloitus" #: src/conf.c msgid "sql_query_stop" msgstr "SQL kysely lopettaa" #: src/conf.c msgid "sql_query" msgstr "SQL-kysely" #: src/conf.c msgid "track_type" msgstr "raidan tyyppi" #: src/conf.c msgid "track_auto" msgstr "seurata auto" #: src/conf.c msgid "track_port" msgstr "seurata porttia" #: src/conf.c msgid "track_motorx" msgstr "seurata motorx" #: src/conf.c msgid "track_motorx_reverse" msgstr "seurata moottorin taaksepäin" #: src/conf.c msgid "track_motory" msgstr "radan motiivi" #: src/conf.c msgid "track_motory_reverse" msgstr "radan motory reverse" #: src/conf.c msgid "track_maxx" msgstr "seurata maxx" #: src/conf.c msgid "track_minx" msgstr "seurata minx" #: src/conf.c msgid "track_maxy" msgstr "seurata maxy" #: src/conf.c msgid "track_miny" msgstr "seurata minia" #: src/conf.c msgid "track_homex" msgstr "seurata homex" #: src/conf.c msgid "track_homey" msgstr "seurata kodikas" #: src/conf.c msgid "track_iomojo_id" msgstr "seurata iomojo id" #: src/conf.c msgid "track_step_angle_x" msgstr "seurata askelkulmaa x" #: src/conf.c msgid "track_step_angle_y" msgstr "seurata askelkulmaa y" #: src/conf.c msgid "track_move_wait" msgstr "radan siirto odota" #: src/conf.c msgid "track_speed" msgstr "radan nopeus" #: src/conf.c msgid "track_stepsize" msgstr "seurata asteikkoa" #: src/conf.c msgid "track_generic_move" msgstr "seurata yleistä liikettä" #: src/conf.c msgid "camera" msgstr "kamera" #: src/conf.c msgid "camera_dir" msgstr "kameraohjaus" #: src/dbse.c msgid "Closing MySQL library" msgstr "MySQL -kirjaston sulkeminen" #: src/dbse.c msgid "Closing MariaDB library" msgstr "MariaDB -kirjasto suljetaan" #: src/dbse.c msgid "Database closed" msgstr "Tietokanta suljettu" #: src/dbse.c msgid "Initializing database" msgstr "Tietokannan alustaminen" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "" "Isäntä %s -sovelluksessa ei voi muodostaa yhteyttä MySQL-tietokantaan %s " "käyttäjän %s kanssa" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "MySQL-virhe oli %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "" "Ei voi muodostaa yhteyttä MariaDB -tietokantaan %s isännällä %s käyttäjän %s " "kanssa" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "MariaDB -virhe oli %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "Avataan tietokanta %s" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "SQLite3-tietokantaa %s ei voi avata. Virhe %d : %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "Varattu aikakatkaisuksi asetetaan %d ms" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "Varattu aikakatkaisun asettaminen epäonnistui. Virhe %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "Yhteys PostgreSQL-tietokantaan ' %s' epäonnistui: %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "Tietokantatyyppi %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "MySQL -kyselyn suorittaminen" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "MySQL -kysely epäonnistui %s -virhekoodi %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error was " "%s" msgstr "" "Isäntä %s: n MySQL-tietokantaan %s ei voida muodostaa yhteyttä käyttäjän %s " "MySQL -virheen kanssaoli %s" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "Yhteyden muodostaminen uudelleen MySQL-tietokantaan%s onnistuu" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "" "uudelleen yhteyden muodostamisen jälkeen MySQL-kysely epäonnistui %s " "virhekoodi %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "Suoritetaan MariaDB -kysely" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "MariaDB -kysely epäonnistui %s -virhekoodi %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB error " "was %s" msgstr "" "Yhteyttä MariaDB -tietokantaan %s ei voi muodostaa uudelleen palvelimella %s " "käyttäjän %s MariaDB kanssavirhe oli %s" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "Yhteyden muodostaminen uudelleen MariaDB-tietokantaan '%s' onnistui" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "" "yhteyden muodostamisen jälkeen MariaDB-kysely epäonnistui %s -virhekoodi %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "Yhdistetty uudelleen PostgreSQL-tietokantaan '%s'" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "Suoritetaan PostgreSQL -kysely" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "Yritetään muodostaa uudelleen yhteys PostgreSQL -tietokantaan ' %s': %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "PGSQL-kysely epäonnistui: [%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "Suoritetaan %s" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "SQLite3-virhe %d : %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "Tyhjän sql-kyselyn huomioiminen" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "Ulkoista komentoa ' %s' ei voida käynnistää" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "Suoritetaan ulkoinen komento ' %s'" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "Kirjoitetaan kuvaa tiedostoon: %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "Kirjoitetaan elokuvaa tiedostoon: %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "Kuva tallennettu tiedostoon: %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "Elokuva tallennettu tiedostoon: %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "Kuvan sijoittaminen videoputkeen epäonnistui" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "Symbolista linkkiä ei voitu luoda [ %s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "Esikatseluputken nimen %d %s luomisessa tapahtui virhe" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "Virhe luotaessa tiedostokantaa %d %s" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "Esikatselunimen %d %s luomisessa tapahtui virhe" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "SULJEMINEN: poistetaan tiedosto desc %d, virhetila %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "pclose tuotto: %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "Lähde FPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "elokuvarata: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "ei kirjoitusoikeutta kohdehakemistoon %s" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "polkua ei löydy, yritetään luoda sitä %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "virhe pääsypolulle %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "Virhe määritettäessä komentorivi: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "putki: %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt->moviefps: %d" #: src/event.c msgid "popen failed" msgstr "popen epäonnistui" #: src/event.c msgid "Using extpipe" msgstr "Extpipe-käyttö" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "Virhe kirjoitettaessa putkessa, tilavirhe %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "putkea %s ei ole luotu tai suljettu jo" #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "Ogg-säilöä ei enää tueta. Vaihtaminen mpeg4: ksi" #: src/event.c msgid "Running test of the various output formats." msgstr "Eri tulostusmuotojen ajokoe." #: src/event.c msgid "Error opening context for movie output." msgstr "Virhe avaamalla konteksti elokuvalähdölle." #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffopen avoin virhe luotaessa (liike) tiedosto [ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "Aikakatkaisun swf-säilöä ei enää tueta. Mpg-säilön käyttäminen." #: src/event.c msgid "Timelapse using mpg codec." msgstr "Aikaväli mpg-koodekin avulla." #: src/event.c msgid "Events will be appended to file" msgstr "Tapahtumat liitetään tiedostoon" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "Aikaväli mpeg4-koodekin avulla." #: src/event.c msgid "Events will be trigger new files" msgstr "Tapahtumat laukaisevat uusia tiedostoja" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffopen avoin virhe luotaessa (timelapse) tiedosto [ %s]" #: src/event.c msgid "Error encoding image" msgstr "Virhe kuvan koodauksessa" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "Muistin varaaminen koodekin nimelle epäonnistui" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "Määritetty ruudunopeus on liian korkea määritettyä ffmpeg-elokuvatyyppiä " "varten.Valitse toinen ffmpeg-säilö tai alempi kehysnopeus." #: src/ffmpeg.c msgid "Error setting base file name" msgstr "Virhe perustiedoston nimen asettamisessa" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "Virhe asetettaessa timelapse -liitettä koodekille %s" #: src/ffmpeg.c msgid "Error setting file name" msgstr "Virhe tiedostonimen asettamisessa" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "koodekin vaihtoehdon arvoa %s ei tueta" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "Koodekkia ei voitu saada" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "Virhe lähetyskehyksessä koodausta varten: %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "Vastaanotettu paketti heitti EAGAIN: n palauttaen -2-koodin: %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "Virhe vastaanotettaessa koodattua pakettivideota: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "Virhe videon koodauksessa: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "Virhe videon koodauksessa" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "PTS % perus PTS % ms-aika % aikabaasi %d- %d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "HUONO AJOITUS!! Kehys ohitettu." #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change %d" msgstr "" "PTS % perus PTS % ms-aika % aikabaasi %d- %d Muuta%d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s koodekki vbr / crf / bittinopeus: %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "Haluttu koodekki %s on mustassa listassa: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "Koodekki %s ei löytynyt" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "Käytetään koodekkia %s" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "Streamia ei voitu allokoida" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "Koodekin allokointi epäonnistui!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "Matala fps. %d-kehyksen koodaus %d-kehykseen." #: src/ffmpeg.c msgid "Unable to set quality" msgstr "Laatua ei voida asettaa" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "Raportoitu FPS tuettu %d / %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "Codec %s ei voitu avata" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "Dekooderin parametrien kopiointi epäonnistui !: %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "ei voitu allokoida kehystä" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "puskureita %s ei voitu allokoida" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "virhe avaamalla tiedosto %s" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "Lupa kielletty. %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "Virhe tiedoston %s avaamisessa" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "Ffmpeg-otsikkoa %s ei voitu kirjoittaa" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "Virhe siirtyessään tyhjennystilaan: %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "Virhe tyhjennettäessä koodekkia: %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "Virhe videon tyhjennyskuvaa kirjoitettaessa" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "Virhe kuvan koodauksessa" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "Virhe videokehystä kirjoitettaessa" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet: %s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "Virhe videokehystä kirjoitettaessa: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "RTSP-konteksti ei ole käytettävissä." #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "rtsp-kamera ei ole valmis läpikulkua varten." #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "läpivientitila käytössä. Vaihtaminen MP4-säilöön." #: src/ffmpeg.c msgid "Could not get codec!" msgstr "Koodekkia ei voitu saada!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "Koodekkiparametreja ei voi kopioida" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "Läpäisy estetty. ffmpeg liian vanha" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "Läpivirta avattiin" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "ffmpeg libavcodec-versio %d. %d. %d libavformat-versio %d. %d. %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "av lockmgr -rekisteröinti epäonnistui ( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "Ei ffmpeg-toimintoa mukana" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "av lockmgr -rekisterin nollaus epäonnistui puhdistuksen yhteydessä" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "Tulostekontekstia ei voitu allokoida" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "Passthrun asennus epäonnistui!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "Streamia ei voitu asettaa" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "Virhe huuhtelemalla koodekkia" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "Liialliset yritykset puskuroidun paketin tyhjentämiseksi" #: src/ffmpeg.c msgid "Buffered packet" msgstr "Puskuroitu paketti" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s: Annettu jpeg-puskuri oli liian pieni" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "Virheelliset JPEG-kuvan mitat" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "JPEG-kuvan koko %dx %d, JPEG oli %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "" "Vastaanotettu odottamaton kameran ohjauksen takaisinsoitto-tapahtuma, 0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "Suuri kuvanopeus voi aiheuttaa ongelmia kuvien valotuksessa" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "Jos automaattinen valotus ei toimi, kokeile pienempää kuvanopeutta." #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "MMAL-kamerakomponentin luominen epäonnistui %s" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "MMAL-kameralla %s ei ole lähtöportteja" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "Ohjausporttia ei voi ottaa käyttöön: virhe %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "MMAL no-poltin asennus epäonnistui" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "kameran videoformaattia ei voitu asettaa" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "kamerakomponenttia ei voitu ottaa käyttöön" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "MMAL-kamerakomponentti luotu" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "MMAL-kameran puskurialtaan luominen epäonnistui" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "MMAL-kamerapuskurijonojen luonti epäonnistui" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "Vaadittua puskuria %d ei voida saada poolijonoon" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "Puskuria ei voi lähettää porttiin ( %d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "MMAL Kameralanka alkaa ... kameralle ( %s) %dx %d nopeudella %d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "kameraparameareja ei voitu allokoida" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "MMAL-kameran sieppausportti ei ole onnistunut" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "MMAL-kameran sieppauksen aloitus epäonnistui" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "MMAL-kameran puhdistus" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %d liput %08x koko %d / %d %08x, img size = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "Puskuria ei voida palauttaa kameran videoporttiin" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "Esikaappauspuskurin koon muuttaminen %d kohteeksi" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "Poistettu prosessin id-tiedosto (pid-tiedosto)." #: src/motion.c msgid "Error removing pid file" msgstr "PID-tiedoston poistamisessa tapahtui virhe" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "Lokitiedoston sulkeminen ( %s)." #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "Liike havaittu - alkava tapahtuma %d." #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "Lisätty %d täytekehystä elokuvaan" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "Kameratyyppiä ei voida määrittää (MMAL, Netcam, V4L2, BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "Yksityisyysmaskitiedoston avaaminen" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "Korkean resoluution yksityisyysmaskitiedoston avaaminen" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "Virhe avaamalla maskitiedosto %s" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "Maskin tietosuojakuvan lukeminen epäonnistui. Naamion yksityisyysominaisuus " "poistettu käytöstä." #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "Naamio tietosuojatiedosto \" %s \" ladattu." #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "Virheellinen tekstiasteikko. Oikaistu %d: ksi" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "Kamera %d aloitettu: liiketunnistus %s" #: src/motion.c msgid "Disabled" msgstr "Liikuntarajoitteinen" #: src/motion.c msgid "Enabled" msgstr "käytössä" #: src/motion.c msgid "Pass-through processing disabled." msgstr "Läpivientikäsittely on poistettu käytöstä." #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "Virheelliset kokoonpanon mitat %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "Oletusmittojen %dx %d käyttäminen" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "Pyydetty kuvan leveys ( %d) ei ole modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "Säädetään leveys seuraavaan suurempaan 8: n kerrannaiseen ( %d)." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "Pyydetty kuvan korkeus ( %d) ei ole modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "Säädetään korkeus seuraavaan suurempaan 8: n kerrannaiseen ( %d)." #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "Alkukuvaa ei voitu noutaa kamerasta" #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "Liike jatkaa leveyden ja korkeuden käyttöä konfigurointitiedostoista" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "Liike tukee vain leveyttä ja korkeutta modulo 8" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "Pyydetty kuvan leveys ( %d) tai korkeus ( %d) ei ole modulo 8." #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "Liike tukee vain leveyttä ja korkeutta, joka on vähintään 64 %dx %d" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "Substream ei ole käytettävissä. Kuvakoko ei modulo 16." #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "" "webp-kuvatiedostomuoto ei ole käytettävissä, jpeg-tiedostoon palaaminen " "epäonnistui" #: src/motion.c msgid "Error capturing first image" msgstr "Virhe ensimmäisen kuvan kaappaamisessa" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "Videosilmukkalaitteen avaaminen normaalille kuvalle" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "Normaalien kuvien videosilmukka ei avautunut" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "Videosilmukkalaitteen avaaminen elokuvia varten" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "Elokuvien videon silmukan palautus epäonnistui" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "Maskikuvan lukeminen epäonnistui. Naamioominaisuus poistettu käytöstä." #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "Maskotiedosto \" %s \" ladattu." #: src/motion.c msgid "Emulating motion" msgstr "Jäljittelevä liike" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "Alueella %d havaittu liike." #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "Yritä uudelleen, kunnes onnistunut yhteys kameraan" #: src/motion.c msgid "Camera has become available." msgstr "Kamera on tullut saataville." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "Aloitetaan liikettä uudelleen.\n" "Pyydetty kuvan leveys (%d) tai korkeus (%d) ei ole modulo 8." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Aloitetaan liikettä uudelleen.\n" "Liike tukee vain leveyttä ja korkeutta, joka on suurempi tai yhtä suuri kuin 64 %dx%d" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "Aloitetaan liikettä uudelleen.\n" "Kameran korkeus tai leveys on muuttunut." #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "Aloitetaan liikettä uudelleen.\n" "Kameran korkea resoluutio on muuttunut." #: src/motion.c msgid "Video signal re-acquired" msgstr "Videosignaali hankittiin uudelleen" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "Videolaitteen kohtalokas virhe - videolaitteen sulkeminen" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "" "Käynnistä Motion-ketju uudelleen kaikkien kuvapuskurien uudelleenalustamiseksi" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "Videosignaali menetetty - Harmaan kuvan lisääminen" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "Videosignaali edelleen menetetty - Yritetään sulkea videolaite" #: src/motion.c msgid "Lightswitch detected" msgstr "Valokytkin havaittu" #: src/motion.c msgid "Switchfilter detected" msgstr "Kytkinsuodatin havaittu" #: src/motion.c msgid "micro-lightswitch!" msgstr "mikro-LightSwitch!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "Tapahtuman loppu %d" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "Raaka muutokset: %5d - muutokset ' %s': n jälkeen: %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr "- tarrat: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "Muutokset: %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr "- melutaso: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr "- kynnys: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "Virheellinen timelapse-moodin argumentti ' %s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%: s Oletusarvo manuaaliseen timelapse-tilaan" #: src/motion.c msgid "Thread exiting" msgstr "Ketju poistuu" #: src/motion.c msgid "Motion going to daemon mode" msgstr "Liike menee daemon-tilaan" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "Lopeta liike, ei voi luoda prosessin id-tiedostoa (pid-tiedosto) %s" #: src/motion.c msgid "Could not change directory" msgstr "Hakemistoa ei voitu muuttaa" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "Luotu prosessin tunnistiedosto %s. Prosessin tunnus on %d" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to thread " "numbers" msgstr "" "Camara-tunnukset eivät ole ainutlaatuisia tai niiden arvo on yli 32 000. Palaa " "takaisinsäie numeroita" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2: saatavana" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2: ei saatavilla" #: src/motion.c msgid "bktr : available" msgstr "bktr: saatavana" #: src/motion.c msgid "bktr : not available" msgstr "bktr: ei saatavilla" #: src/motion.c msgid "webp : available" msgstr "webp: saatavana" #: src/motion.c msgid "webp : not available" msgstr "webp: ei saatavilla" #: src/motion.c msgid "mmal : available" msgstr "mmal: saatavana" #: src/motion.c msgid "mmal : not available" msgstr "mmal: ei saatavilla" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg: saatavana" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg: ei saatavilla" #: src/motion.c msgid "mysql : available" msgstr "mysql: saatavana" #: src/motion.c msgid "mysql : not available" msgstr "mysql: ei saatavilla" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB: saatavana" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB: ei saatavilla" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3: saatavana" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3: ei saatavilla" #: src/motion.c msgid "pgsql : available" msgstr "pgsql: saatavana" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql: ei saatavilla" #: src/motion.c msgid "nls : available" msgstr "Nls: saatavana" #: src/motion.c msgid "nls : not available" msgstr "nls: ei saatavilla" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "Oletusloki-tason käyttäminen ( %s) ( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "Kirjataan tiedostoon ( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "Poistu liikkeestä, lokitiedostoa %s ei voi luoda" #: src/motion.c msgid "Logging to syslog" msgstr "Kirjautuminen lokiin" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "Liike %s aloitettu" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "Oletuslokin tyypin käyttäminen ( %s)" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "Lokityypin ( %s) lokitason käyttäminen ( %s)" #: src/motion.c msgid "Motion running as daemon process" msgstr "Liike käynnissä daemon-prosessina" #: src/motion.c msgid "Motion running in setup mode." msgstr "Liike käynnissä asetustilassa." #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "Kameran tunnus: %d on lähtökohdasta %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "Kameran tunnus: %d Kameran nimi: %s Palvelu: %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "Kameran tunnus: %d Kameran nimi: %s Laite: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "" "Suoratoiston portin numero %d lankalle %d on ristiriidassa ohjausportin kanssa" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "Sivun %d suoratoisto-ominaisuus on poistettu käytöstä." #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "Stream-porttinumero %d lankalle %d on ristiriidassa langan %d kanssa" #: src/motion.c msgid "Restarting motion." msgstr "Käynnistä liike uudelleen." #: src/motion.c msgid "Motion restarted" msgstr "Liike käynnistettiin uudelleen" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "" "Ketju %d - vahtikoiran aikakatkaisu. Yritetään tehdä siro uusi käynnistys" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "" "Ketju %d - Vahtikoiran aikakatkaisu EI käynnistynyt uudelleen tappaen sen!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "Kierre %d - Puhdistuslanka." #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "" "DEBUG-1-ketjut, jotka kulkevat %d liiketalieet, jotka kulkevat %d, lopeta %d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "Odottaa, että ketjut valmistuvat, pid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "Liikelanka %d käynnistyy uudelleen" #: src/motion.c msgid "Threads finished" msgstr "Langat valmis" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "Liike päättyy" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "Virheellinen URL. Arvoja ei voi jäsentää." #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "Kameran käsittelijän lanka [ %d] alkoi" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "Netcam-pistorasian sulkeminen Keep-Alive-ajan ollessa lopussa (kamera " "lähetetty Sulje kenttä).uudelleenyhteyden pitäisi tapahtua." #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "kameran avaaminen uudelleen (ei suoratoisto)" #: src/netcam.c msgid "camera re-connected" msgstr "kamera kytketty uudelleen" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "Tunnistamaton kuvan otsikko ( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "Virhe otsikossa ( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "kameran avaaminen uudelleen (suoratoisto)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "Virhe haettaessa jpeg-kuvaa" #: src/netcam.c msgid "Trying to re-connect" msgstr "Yritetään muodostaa uudelleen yhteys" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "netcam-kamerankäsittelylaite: viimeistely, poistuminen" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "Ei vastausta kameran käsittelijältä - sen on oltava jo kuollut" #: src/netcam.c msgid "called with no data in buffer" msgstr "kutsutaan ilman tietoja puskurissa" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "Verkkokamera käynnistyy kameralle ( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "Virheellinen netcam-välityspalvelin ( %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "" "Käyttäjätunnusta / salasanaa ei sallita välityspalvelimen URL-osoitteessa" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "Virheellinen netcam-palvelu ' %s'" #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "Virheellinen netcam-URL-osoite kameralle ( %s)" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "Netcam http -parametri ' %s' muunnetaan lippuiksi: HTTP / 1.0: %s HTTP / 1.1: " "%s Keep-Elossa %s." #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "soitetaan nyt netcam setup html ()" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "soitetaan nyt netcam setup ftp: lle" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "soitetaan nyt netcam-asetustiedostoon ()" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "soitetaan nyt netcam setup mjpg ()" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "" "Virheellinen verkkokamerapalvelu '%s' - sen on oltava mjpeg, ftp, mjpg tai " "jpeg." #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "Ensimmäisen kuvan lukeminen epäonnistui - viimeistely: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "libjpeg-puristusvirhe ensimmäisessä kehyksessä - luopuminen!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "Leveyden / korkeuden ( %dx %d) on oltava 8-kertaisia" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "Virhe käynnistettäessä kamerankäsittelylankaa [ %d]" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "recv epäonnistui ftp saada enemmän" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "Palvelimen vastaus: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "lähetys epäonnistui ftp-käyttäjän lähettämisessä" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "lähetä epäonnistui ftp lähetä passwd" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "lähetys epäonnistui ftp lopettaa" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "gethostbyname epäonnistui ftp-yhteyden muodostamisessa" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "gethostbyname-osoitteen yhteensopimattomuus ftp connectissä" #: src/netcam_ftp.c msgid "socket failed" msgstr "pistorasia epäonnistui" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "Yhteyden luominen epäonnistui" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "FTP-palvelin, joka pyytää ACCT: tä nimettömästi" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "asetusliitäntävaihtoehto SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "lähetys epäonnistui ftp-muodossa" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "Virheellinen vastaus PASV: lle" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "Tietoyhteyden luominen epäonnistui" #: src/netcam_ftp.c msgid "bind failed" msgstr "sidonta epäonnistui" #: src/netcam_ftp.c msgid "listen failed" msgstr "kuuntelu epäonnistui" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "lähetys epäonnistui ftp get socket" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "hyväksyä ftp get -liitäntään" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "recv epäonnistui ftp-lukemissa" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "ftp get socket epäonnistui" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "Virhe lähettäessä TYPE I ftp-palvelimelle" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "väärin muotoiltu tunnuksen sisältöpituus, mutta arvo %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "Sisällön pituus %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "Sisältötyyppi %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "Virhe kuvan otsakkeen lukemisessa, suoratoistotila (1). Null otsikko." #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "" "Virhe kuvan otsakkeen lukemisessa, suoratoistotila (1). Tuntematon otsikko ' " "%s'" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "Virhe kuvan otsikon lukemisessa (2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "Otsikko ei JPEG" #: src/netcam_http.c msgid "Content-Length 0" msgstr "Sisällön pituus 0" #: src/netcam_http.c msgid "Found image header record" msgstr "Löytyi kuvan otsikkotietue" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "Virhe lähetettäessä yhteyspyyntöä" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "Vastaanotettu ensimmäinen otsikko (' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "Virhe luettaessa ensimmäistä otsikkoa ( %s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "HTTP-tuloskoodi %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "" "Netcam Keep-Alive -lippu poistettiin ilmeisen suljetun HTTP-yhteyden vuoksi." #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "Ei suoratoistokamera (pidä hengissä)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "Ei suoratoistokamera (pysyä hengissä ei ole asetettu)" #: src/netcam_http.c msgid "Streaming camera" msgstr "Virtakamera" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "Rajamerkkijono [ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "Rajamerkkijonoa ei löydy otsikosta" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// netcam_url." msgstr "" "Suoratoistokamera, joka todennäköisesti käyttää MJPG-lohkoja, harkitse mjpg: //" "netcam url." #: src/netcam_http.c msgid "Unrecognized content type" msgstr "Tunnistamaton sisältötyyppi" #: src/netcam_http.c msgid "Content-length present" msgstr "Sisältöpituus läsnä" #: src/netcam_http.c msgid "Content-length 0" msgstr "Sisällön pituus 0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "Löydetty Conn: sulje otsikko (' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. Motion " "removes keepalive." msgstr "" "Sekä 'Yhteys: Pidä elossa' ja 'Yhteys: sulje' -otsikko vastaanotettu.Liike " "poistaa pitävyyden." #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. Motion " "continues unchanged." msgstr "" "Sekä 'Yhteys: Pidä elossa' ja 'Yhteys: sulje' -otsikko vastaanotettu.Liike " "jatkuu ennallaan." #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "Vastaanotti Keep-Alive -kentän tähän otsikkokokoelmaan." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "Otsikkoa 'Yhteys: Pidä elävänä' eikä 'Yhteys: sulje' otsikkoa ei ole " "vastaanotettu. \n" " Liike poistaa pitävyyden." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "Otsikkoa 'Yhteys: Pidä elävänä' eikä 'Yhteys: sulje' otsikkoa ei ole " "vastaanotettu. \n" " Liike jatkuu ennallaan." #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "Netcam Keep-Alive -lippu poistettu, koska 'Yhteys: sulje' -otsikko on " "vastaanotettu. \n" " Netcam ei tue Keep-Alive-ohjelmaa. Liike jatkuu ei-säilyä-elossa." #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "Keep-Alive on saavuttanut voimassa olevan ajanjakson lopun. \n" " Motion sulkee netcamin, jatkaa sitten Keep-Alive -sovellusta uudella " "pistorasialla." #: src/netcam_http.c msgid "disconnect" msgstr "katkaista" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo () epäonnistui ( %s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "verkkokameran irrottaminen (1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "verkkokameran irrottaminen, koska hengissä pysymistä ei ole asetettu." #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "yrittämättä luoda pistorasiaa epäonnistuneesti ilman pidättävyyttä." #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "ilman jatkuvuutta, uusi pistorasia luotiin fd %d" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "Pidä kiinni, väärä pistorasia. Tämä voi olla ensimmäinen kerta. Luominenuusi " "epäonnistui." #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new one " "with fd %d" msgstr "" "Pidä kiinni, virheellinen pistorasia. Tämä saattaa olla ensimmäinen kerta, " "luonut uudenyksi fd %d kanssa" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "Joten KEEPALIVE on %s" #: src/netcam_http.c msgid "ON" msgstr "PÄÄLLÄ" #: src/netcam_http.c msgid "OFF" msgstr "POIS PÄÄLTÄ" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "SO KEEPALIVE asetettu pistorasiaan." #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "fcntl (1) pistorasiassa" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "fcntl (2) pistorasiassa" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "yhdistäminen () epäonnistui ( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "verkkokameran irrottaminen (4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "yhteyden aikakatkaisu ()" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "verkkokameran irrottaminen (2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "saa yhteyden muodostamisen jälkeen" #: src/netcam_http.c msgid "connect returned error" msgstr "yhteyden palautusvirhe" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "verkkokameran irrottaminen (3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "laajennetaan puskuri [ %d / %d] - [ %d / %d] tavuihin." #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "Mahdollinen jakoraja - %d merkkiä tyhjennetty, %d asetettu uudelleen" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "recv () epäonnistuu rajoitusjonon jälkeen" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "jättäen netcam-yhteyden." #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "yrittää muodostaa yhteyttä, aika # %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "Kameran avaaminen epäonnistui - tarkista kokoonpanosi ja että netcamera on " "verkossa" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "Ensimmäisen otsikon lukemisessa tapahtui virhe - yritetään uudelleen" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "Kameran ensimmäistä otsikkoa ei luettu - luopuminen toistaiseksi" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "Netcamilla on liput: HTTP / 1.0: %s HTTP / 1.1: %s Keep-Alive %s." #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with Keep-" "Alive." msgstr "" "Poistettu netcam-säilytyslippu välityspalvelimen asettaman vuoksi. Proxy ei " "ole yhteensopiva verkkotunnuksen kanssaPitää hengissä." #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "" "Ensimmäisen streamin otsikon lukeminen epäonnistui - luopuminen toistaiseksi" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "kytketty, lukemassa kuvaa." #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "Lue virhe, yritetään muodostaa uudelleen yhteyttä .." #: src/netcam_http.c msgid "lost the cam." msgstr "kadonnut nokan." #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "Täytetty puskuri [ %d] tavua verkosta." #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "Lue [ %d / %d] otsikkotavut." #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "Virheellinen otsikko vastaanotettu, yhteys muodostetaan uudelleen" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "Lue [ %d / %d] chunk-tavua, [ %d / %d] yhteensä" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "Palattu, puskurissa käytetty [ %d] tavua." #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "Kuva valmis, puskuria käytetty [ %d] tavua." #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "kytketty, lukemassa ja dekoodaamassa MJPG-paloja." #: src/netcam_http.c msgid "Begin" msgstr "Alkaa" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "stat ( %s) virhe" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]! = viimeinen st mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "odottaa uuden tiedoston kuvan aikakatkaisua" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "viivytä uuden tiedoston kuvan odottamista" #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "uuden tiedostokuvan käsittely - st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "avoin ( %s) virhe: %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "luku ( %s) virhe: %d" #: src/netcam_http.c msgid "End" msgstr "pää" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> tiedosto-> polku %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "Ei tarpeeksi tietoa netcamista." #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> jpeg-virhe %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "*** uusi kuvaviive onnistunut ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "jpeg-virhe %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "käsittely jpeg-kuvaa - sisällön pituus %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "Kameran leveyden / korkeuden epäsuhta JPEG-kuvan kanssa - odotettu %dx %d, " "JPEG %dx %dtaajuus %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s: Koko muutettu pakettiryhmäksi %d" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s: av kopiopaketti: %s, keskeytä: %s" #: src/netcam_rtsp.c msgid "True" msgstr "Totta" #: src/netcam_rtsp.c msgid "False" msgstr "Väärä" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: Ohitetaan virheellistä dataa sisältävä paketti" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: Tallennuskehyksen virhe: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "Väärällä tiedolla olevan paketin ohittaminen" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "Virhe paketin dekoodauksessa: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "%s: Virhe siirrettäessä HW -dekoodattu järjestelmämuistiin" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "Virhe paketin lähettämisessä koodekkiin: %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "Virhe videopaketin dekoodauksessa: Kopioidaan puskuriin" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: HW -laitteet:" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s (saatavilla)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s (ei toteutettu)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s: verkkokameran dekooderi %s poistettu käytöstä." #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "Vaapi pix -muodon hakeminen epäonnistui" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "Cuda pix -muodon hakeminen epäonnistui" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s: Keskeytetty." #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: epäonnistui" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s: Dekooderi %s ei toiminut." #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "%s: Käyttäjän pyytämä dekooderi %s ohitetaan ja poistetaan" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s: Vaapi -dekooderin alustaminen" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: Vaapi hw -laitetta ei löydy" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s: Alustetaan cuda -dekooderia" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: cuda hw -laitetta ei löydy" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s: Alustetaan dekooderia" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s: Dekooderin %s käyttäminen" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: Dekooderi avattu" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s: Kameran lukema ( %s) aikakatkaistiin" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s: Kameran ( %s) aikakatkaisu" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "Kehystä ei voi allokoida." #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "Kehystä ei voi jakaa." #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "Skaalauskontekstin varaaminen epäonnistui." #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "Virhe määritettäessä kehyksen kokoa ulos" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "Virhe kuvan allokoinnissa: %s" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "Virhe kuvan allokoinnissa: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "Virhe koon muuttamisessa / alustamisessa: %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "Virhe asetettaessa kehystä lähtöpuskuriin: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s: Keskeytetty" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: av lukukehys: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: Liiallinen yritys yrittää saada tietoja kamerasta %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "" "%s: sieppausnopeutta ei ole määritetty verkkokameran parametreissa. " "Käyttämällä %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s: sieppausnopeutta ei ole määritetty verkkokameran parametreissa. Käytetään " "kehysnopeutta %d" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "Verkkokamera lähettää kuvia erilaisina" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "koko kuin määritetty konfiguraatiossa ja myös a" #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "erilainen kuvamuoto. Kuva on" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "koodattu YUV420P: lle ja haluttuun kokoon" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "konfigurointitiedostossa. Jos mahdollista, muuta netcam-tilaksi" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "olla YUV420P-muodossa ja koko vaadittu" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "config mahdollisesti vähentää prosessorin käyttöä." #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "koko kuin määritystiedostossa määritetty." #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "Kuva muutetaan kooksi" #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "pyydetään kokoonpanossa. Muuta mahdollisuuksien mukaan" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "netcam tai kokoonpano osoittamaan saman koon" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "mahdollisesti vähentää suorittimen käyttöä." #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "Netcam: %dx %d => Config: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "Lähetetty kuva on" #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "koodattu YUV420P: lle. Muuta netcamia jos mahdollista" #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "kuvaformaatti YUV420P: een mahdollisesti vähentää suorittimen käyttöä." #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: asetus rtsp/rtmp" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: syöttömuodon asettaminen mjpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: tulomuodon asetus video4linux2" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: Elokuvatiedoston määrittäminen" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s: Määritetään %s" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: vaihtoehto: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "V4l2: n määrittäminen netcamilla" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "Tiedoston asettaminen netcamin kautta" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "Määritetään %s verkkokameran kautta" #: src/netcam_rtsp.c msgid "highres" msgstr "korkearesoluutio" #: src/netcam_rtsp.c msgid "norm" msgstr "normi" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "%s-virran määrittäminen." #: src/netcam_rtsp.c msgid "Unknown" msgstr "Tuntematon" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "Stream kopioitu läpikulkua varten" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "Null polku kulunut yhteyden muodostamiseksi" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s: Kameraa ei voi avata ( %s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s: avattu kamera ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s: stream-tietoja ei löydy: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s: koodekkikontekstin avaaminen epäonnistui: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s: Kameran kuvan koko on virheellinen" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s: Kehystä ei voida allokoida." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s: streamin kopiointi epäonnistui." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s: Ensimmäisen kuvan lukeminen epäonnistui" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s: Kamera ( %s) kytketty" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s: Netcam -kaappausnopeus on %d." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s: Kameran lähde on %d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s: Kameran lähteen FPS: ää ei voida määrittää." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s: kuvausnopeus on pienempi kuin kameran FPS." #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s: Dekoodausvirheitä esiintyy." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "%s: kuvausnopeus on hieman suurempi kuin kameran FPS." #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s: Yhdistetään uudelleen kameraan ...." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s: Kamera ei muodostanut yhteyttä uudelleen." #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s: Tarkista kamera 10 sekunnin välein." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s: Kameran käsittelijälanka [ %d] alkoi" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s: Käsittelijän silmukka valmis." #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s: Virhe käynnistettäessä käsittelijän ketjua" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s: Odotetaan ensimmäistä kuvaa käsittelijältä." #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "ei voi luoda rtsp-kontekstia" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "ei voi luoda rtsp-korkeaa kontekstia" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "Ei FFmpeg -tukea" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s: Verkkokameran sammuttaminen." #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s: Ei vastausta käsittelijän säiettä." #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "Normaali resoluutio: Sammuta." #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "Korkea resoluutio: Sammuta." #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "Ei voida asettaa asettaa EXIF-arvoa webp-kappaleeseen" #: src/picture.c msgid "libwebp version error" msgstr "libwebp-version virhe" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "libwebp-kuvapuskurin allokointivirhe" #: src/picture.c msgid "libwebp image compression error" msgstr "libwebp-kuvan pakkausvirhe" #: src/picture.c msgid "unable to assemble webp image" msgstr "ei voi koota webp-kuvaa" #: src/picture.c msgid "unable to save webp image to file" msgstr "Webp-kuvaa ei voi tallentaa tiedostoon" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "Kuvaa ei voi kirjoittaa tiedostoon %s - tarkista käyttöoikeudet " "kohdehakemistoon \n" "Ketju loppuu tämän kohtalokkaan virheen vuoksi" #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "Kuvaa ei voi kirjoittaa tiedostoon %s" #: src/picture.c msgid "Error getting PGM vars." msgstr "Virhe haettaessa PGM vars." #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "Tämä ei ole pgm-tiedosto, alkaa ' %s'" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "Magic %s: Leveys %s(%d): Korkeus %s(%d): MaxVal: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "Kuvatietojen lukeminen epäonnistui pgm-tiedostosta" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "" "Määritetty maskitiedosto ei ole samankokoinen kuin kamerasta tuleva kuva." #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "Yritetään muuttaa maskin kuvan kokoa %dx %d - %dx %d" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "" "ei voi kirjoittaa maskitiedostoa %s - tarkista kohdehakemiston käyttöoikeudet" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "maskitiedostoa %s ei voi kirjoittaa" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "Oletusmaskin kirjoittaminen epäonnistui pgm-tiedostona" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "Luodaan tyhjä maski %s \n" "Muokkaa tätä tiedostoa ja suorita liike uudelleen, jotta maskiominaisuus " "otetaan käyttöön" #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "Konfigurointivaihtoehto \"kiertäminen \" ei ole 90: n monikerta: %d" #: src/track.c msgid "internal error" msgstr "sisäinen virhe" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "sisäinen virhe, %hu ei ole tunnettu raidatyyppi" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "portti %s dev fd %i, moottori %hu komento %hu data %hu" #: src/track.c msgid "Status byte timeout!" msgstr "Tilatavun aikakatkaisu!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "Yritä avata sarjalaite %s" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "Sarjalaitetta %s ei voitu avata" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "Sarjalaitetta %s ei voi alustaa" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "Avattu sarjalaite %s ja alustaa, fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "Laitetta %s ei ole vielä käynnistetty, yritetään stepper-keskustaa ()" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "epäonnistui asettamaan askellaitetta %s, fd [ %i]." #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "onnistunut, laite käynnistyi %s, fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "LÄHETÄ portti %s dev fd %i, moottori %hu komento %hu data %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "Komennon palautus %d" #: src/track.c msgid "Problem opening servo!" msgstr "Ongelma servon avaamisessa!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d, cent-> y %d, käänteinen %d, käänteinen %d manuaalinen %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d arvo alueen ulkopuolella! ( %d - %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d arvo alueen ulkopuolella! ( %d - %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "X-siirto %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command %d" msgstr "" "X cent-> x %d, cent-> y %d, käänteinen %d, käänteinen %d motorx %d data %d " "komento%d" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Y siirtymä %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command %d" msgstr "" "Y cent-> x %d, cent-> y %d, käänteinen %d, käänteinen %d motiivi %d data %d " "komento%d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "X-siirtymä %d, Y-siirtymä %d, x-sijainti %d. y-asema %d, käänteinen %d, " "käänteinen%d, asteikko %d" #: src/track.c msgid "Return byte timeout!" msgstr "Palauta tavu aikakatkaisu!" #: src/track.c msgid "Unable to set camera speed" msgstr "Kameran nopeutta ei voida asettaa" #: src/track.c msgid "succeed" msgstr "menestyä" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "Pwc-kameran nollaus lähtöasentoon epäonnistui! Syy" #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "epäonnistui VIDIOCPWCMPTGRANGE" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "Pwc-kameran panorointi / kallistaminen epäonnistui! Syy" #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "UVC-kameran nollaus lähtöasentoon epäonnistui! Syy" #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "UVC-kameran palauttaminen lähtöasentoon" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl kyselykontrolli" #: src/track.c msgid "Getting camera range" msgstr "Kameran valikoiman saaminen" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "" "INPUT PARAM ABS panorointi min %d, pannu max %d, kallistus min %d, kallistus " "max %d" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "INPUT PARAM ABS X Angel %d, Y Angel %d" #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "SET ABS -liikkeessä siirrä X %d, siirrä Y %d" #: src/track.c msgid "Failed to move UVC camera!" msgstr "UVC-kameran siirtäminen epäonnistui!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "Löydetty MINMAX = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "Ennen ABS Y Angel: x = %d, Y = %d," #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "ABS Y Angelin jälkeen: x = %d, Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "" "SET REL -pannulla min %d, pannulla max %d, kallistus min %d, kallistus max %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "Aseta SET REL -raidan enkeli %d, raidan kallistus enkeli %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "Aseta SET REL X %d, siirrä Y %d" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, kontrolli S = %d, Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, kontrolli S = %d, Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "Ennen REL Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "REL Y: n jälkeen: x = %d, Y = %d" #: src/translate.c msgid "Language: English" msgstr "Kieli: englanti" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "%llu-tavua muistia ei voitu varata!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "Varoitus! Toiminto %s yrittää muuttaa muistimuistion %p arvoksi 0 tavua!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "Muistilohkon kokoa ei voitu muuttaa siirtymään %p %llu-tavuihin (funktio %s)!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "Ongelma hakemiston %s luomisessa" #: src/util.c #, c-format msgid "creating directory %s" msgstr "luomalla hakemistoa %s" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "Virhe avaamalla tiedostoa %s tilassa %s" #: src/util.c msgid "Error closing file" msgstr "Virhe tiedoston sulkemisessa" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbeventid} ei ole tuettu. Käytä eventid." #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "virheellinen muotoa määrittelevä avainsana %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "Langan nimeä %s ei voitu asettaa" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "FFMPEG-versio on liian vanha. Läpäisykäsittelyn poistaminen käytöstä." #: src/util.c msgid "pass-through enabled." msgstr "läpivienti käytössä." #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "Virhe asetettaessa parm>%s <" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "Jäsennetyt:>%s <>%s <" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "Jäsennetty:> muokattu <> muokattu <" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "Virhe jäsennettäessä parm nm -ohjaimia: %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "Virhe jäsennettäessä parm vl -ohjaimia: %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "Virhe lämpötilan asettamisessa: %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "Virhe ohjainten korjaamisessa: %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "Jäsennys: %s" #: src/util.c msgid "Parsing: " msgstr "Jäsennys: " #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "Virhe jäsennettäessä ohjaimia: %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "Virhe: %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "Uudet verkkokameran parametrit: %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "Uusi verkkokameran korkea parametri: %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "Uudet videoparametrit: %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "Uudet webcontrol -otsikon parametrit: %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "Uudet webcontrol -otsikon parametrit: " #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "Striimin ylätunnisteen uudet parametrit: %s" #: src/util.c msgid "New stream_header_params: " msgstr "Uudet streamin otsikon parametrit: " #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "Ohjelmointivirhe. Tuntematon määrityskohde: %s " #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE Virhe värisävyn asettamisessa [ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "- [ %d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE Virhe värisävyssä" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT Virhe kylläisyyden asettamisessa [ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT Virhe värikylläisyydessä" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT Virhe kontrastin asettamisessa [ %d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT Virhe kontrastin saavuttamisessa" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "METEORSBRIG-kirkkaus [ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIG saadaan kirkkautta" #: src/video_bktr.c msgid "Not implemented" msgstr "Ei toteutettu" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "Laitetulo %d alueen ulkopuolella (0–4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d virheellinen - Koostumuksen %d kokeilu" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "" "BT848SFMT, Syöttömuotoa ei voitu asettaa, yritä uudelleen oletusasetuksella" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "BT848SFMT, Syöttömuotoa ei voitu asettaa oletusarvoksi" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "Geometriaa ei voitu asettaa" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "- [ %d / %d] Normi %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "Virheellinen taajuus [%ld] lähdetulolle [%i]" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "Taajuus [%ld] Lähdetulo [%i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "aseta tulo [ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "aseta syöttömuoto [ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "asetettu geometria [ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "Taajuus asetettu (ei vielä toteutettu" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "Puskurin mitoitus 3x: ksi" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "Puskurin mitoitus 3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap epäonnistui" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "METEORCAPTUR käyttäen yhtä menetelmää Virhe kaappaamisessa" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "Virhe kaappaamisessa yhdellä menetelmällä" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "Videolaitetta ei löydy" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "Videolaitteen %s sulkeminen" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "Vielä %d videolaitteen %s käyttäjää, joten emme sulje sitä nyt" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "konfig. kuvan leveys ( %d) ei ole modulo 8" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "konfig. kuvan korkeus ( %d) ei ole modulo 8" #: src/video_bktr.c msgid "Stopping capture" msgstr "Kaappauksen lopettaminen" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "" "[ %s] -tulojen uudelleenkäyttö [ %d, %d] Vaihda sieppaustapa METEOR CAP SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "VIDEO PALETTE YUV420P -asetus imgs.size norm ja imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "avaa videolaite %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "avoin viritinlaite %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "Vioittunut kuva ... jatka" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "SOI-asema säädetään %d tavulla." #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "kutsutaan mmalcam-siivousta" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "kutsutaan netcam-siivousta" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "kutsutaan netcam rtsp -puhdistusta" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "V4L2-laitteen puhdistaminen" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "BKTR-laitteen puhdistaminen" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "Ei kameralaitteen puhdistusta (MMAL, Netcam, V4L2, BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "MMAL-kameran avaaminen" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "MMAL-kamera ei avautunut" #: src/video_common.c msgid "Opening Netcam" msgstr "Netcamin avaaminen" #: src/video_common.c msgid "Netcam failed to open" msgstr "Netcam ei avautunut" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Netcam RTSP: n avaaminen" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Netcam RTSP ei avautunut" #: src/video_common.c msgid "Opening V4L2 device" msgstr "V4L2-laitteen avaaminen" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "V4L2-laite ei avautunut" #: src/video_common.c msgid "Opening BKTR device" msgstr "BKTR-laitteen avaaminen" #: src/video_common.c msgid "BKTR device failed to open" msgstr "BKTR-laite ei avautunut" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "Kameralaitetta ei ole määritetty (MMAL, Netcam, V4L2, BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "%s\": n avaaminen epäonnistu" #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "Puskurin määrittämisessä tapahtui virhe: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "Avauspuskuri: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "Lue puskuri: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "löydetty videolaite ' %s' %d" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "Avattu %s putken ulostulona" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "%s: n avaaminen putken lähtönä epäonnistui" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "Alkuperäiset putken tekniset tiedot" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "Ehdotetut putken tekniset tiedot" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "Lopulliset putken tekniset tiedot" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "Laitteelle ei löytynyt säätimiä" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "--------- Controls ---------" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr "V4L2-tunnuksen nimi ja alue" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "Virhe nollattaessa käyttäjäarvoa" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "Jätetään ohjausobjektin %s \"%s\" arvoksi %d" #: src/video_v4l2.c msgid "Device not ready" msgstr "Laite ei ole valmis" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "Aseta ohjaus \" %s \" arvoon %d" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "Säätimen %s \"%s\" asettaminen arvoon %d epäonnistui." #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "" "%s -valintavaihtoehdon arvo %s on pienempi kuin minimi. Käyttämällä vähintään " "%d " #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "" "%s -ohjausvaihtoehdon arvo %s on maksimiarvon yläpuolella. Käytetään enintään " "%d " #: src/video_v4l2.c msgid "control type not supported yet" msgstr "ohjaustyyppiä ei tueta vielä" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "Syöttöä %d ei voida kysyä. VIDIOC ENUMINPUT, jos käytät WEBCAM-muutostuloaarvo " "suhdeluvulla -1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "Nimi = \" %s \", kirjoita 0x %08X, tila %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "Nimi = \" %s \", - TUNER" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "Nimi = \" %s \" - KAMERA" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "Virhe valittaessa tuloa %d VIDIOC S INPUT" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "Laite ei tue PAL / NTSC-normin määrittämistä" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "- videostandardi %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "Virhe valitessa standardimenetelmää %d VIDIOC S STD" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "Videostandardiksi asetettu NTSC" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "Videostandardiksi asetettu SECAM" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "Videon vakioasetus on PAL" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "viritin %d VIDIOC G TUNER" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "Aseta viritin %d" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "Freq %ul VIDIOK-SIVUUS" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "Aseta taajuudeksi %ul" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "Ei voida käyttää %c%c%c%c (%dx%d)" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "Testauspaletti %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "Tarkistetaan kuvan kokoa %dx%d askeleella %d" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "Laitteesta ei ole annettu askelarvoa." #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "Leveyden (%d) on oltava pienempi kuin askel (%d)" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "Kuvan leveys (%d) ei ole askeleen (%d) monikerta" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "Mahdoton ehto: Leveys (%d), askel (%d), askelta kohti (%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "Kuvan leveys täytetään %d tavua" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "Resoluution säätäminen arvosta %ix %i arvoon %ix %i." #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "Oikaistu resoluutio ei modulo 8." #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "Määritä konfigurointitiedostossa eri paletti tai leveys / korkeus." #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "Virhe pikselimuodon asettamisessa." #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "Käyttämällä palettia %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "Säätö leveyteen ( %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "Säätö korkeuteen ( %d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "Asetuspaletti-hakemisto %d (%s) %dx%d: lle ei toimi." #: src/video_v4l2.c msgid "Supported palettes:" msgstr "Tuetut paletit:" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d - %s (pakattu: %d) ( %# x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "Valittu paletti %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "Paletin valinta epäonnistui muodossa %s" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "Yhteensopivaa paletin muotoa ei löydy." #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "Virhe pyytäessä puskureita %d muistikartalle. VIDIOK-TARKASTUKSET" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "mmap-tiedot: kehykset = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "Puskurimuisti ei riitä %d %s< >%s< >%s<" msgstr "Virheellinen toimenpide pyydetty:> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "Äidinkieli: päällä" #: src/webu.c msgid "Native Language : off" msgstr "Äidinkieli: pois päältä" #: src/webu.c msgid "Set the value to null/zero" msgstr "Aseta arvoksi nolla / nolla" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "Ohitetaan yhteys kohteesta: %s" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "Epäonnistunut todennus kohteelta %s" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "Ei webcontrol-käyttäjää: pass annettu" #: src/webu.c msgid "No stream user:pass provided" msgstr "Ei stream-käyttäjää: pass annettu" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "Virheellinen vastaus" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "Virhe lisättäessä webcontrol -otsikkoa %s %s" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "Virhe lisättäessä streamin otsikkoa %s %s" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "Pyydetty virheellinen menetelmä: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "Yhteys: %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "lähetys sivu epäonnistui %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "Stream -kuva ei ole vielä valmis" #: src/webu.c msgid "Stream process requested to finish." msgstr "Suoratoistoprosessi pyydettiin loppuun." #: src/webu.c msgid "Send page failed." msgstr "Sivun lähettäminen epäonnistui." #: src/webu.c msgid "Basic authentication: available" msgstr "Perustodennus: saatavana" #: src/webu.c msgid "Basic authentication: disabled" msgstr "Perustodennus: poistettu käytöstä" #: src/webu.c msgid "Digest authentication: available" msgstr "Digest-todennus: saatavana" #: src/webu.c msgid "Digest authentication: disabled" msgstr "Digest-todennus: poistettu käytöstä" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd libary liian vanha ipv6 poistettu käytöstä" #: src/webu.c msgid "IPV6: available" msgstr "IPV6: saatavana" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6: poistettu käytöstä" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd libary liian vanha SSL / TLS poistettu käytöstä" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS: saatavana" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS: poistettu käytöstä" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "Virhe luettaessa tiedostoa SSL / TLS-tuelle." #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "SSL / TLS pyydetty, mutta sertifikaattitiedostoa ei toimitettu. SSL / TLS " "poistettu käytöstä" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "" "SSL / TLS pyydetty, mutta avaintiedostoa ei toimitettu. SSL / TLS poistettu " "käytöstä" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "Web-ohjauksen käynnistäminen portissa %d" #: src/webu.c msgid "Unable to start MHD" msgstr "MHD: tä ei voi käynnistää" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "Aloitti verkkohallinnan portissa %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "Aloitettu kameran %d virta portissa / kameran tunnus %d / %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "Aloitettu kameran %d virta portissa %d" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "Kaikkien kameravirtojen käynnistäminen portissa %d" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "Kameran %d käynnistysvirta portissa %d" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "Kameran %d suoratoistoa ei voi aloittaa" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "Päällekkäinen portti pyydettiin %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "Virheellinen webcontrol -lukituksen enimmäisnopeus. Asetus on 25. " #: src/webu_html.c msgid "Cameras" msgstr "Kamerat" #: src/webu_html.c msgid "Camera" msgstr "Kamera" #: src/webu_html.c msgid "All" msgstr "Kaikki" #: src/webu_html.c msgid "Action" msgstr "Toiminta" #: src/webu_html.c msgid "Start Event" msgstr "Aloita tapahtuma" #: src/webu_html.c msgid "End Event" msgstr "Lopeta tapahtuma" #: src/webu_html.c msgid "Snapshot" msgstr "Snapshot" #: src/webu_html.c msgid "Change Configuration" msgstr "Muuta kokoonpanoa" #: src/webu_html.c msgid "Write Configuration" msgstr "Kirjoita kokoonpano" #: src/webu_html.c msgid "Tracking" msgstr "Seuranta" #: src/webu_html.c msgid "Pause" msgstr "Keskeytä" #: src/webu_html.c msgid "Start" msgstr "Alkaa" #: src/webu_html.c msgid "Restart" msgstr "Uudelleenkäynnistää" #: src/webu_html.c msgid "Quit" msgstr "Lopeta" #: src/webu_html.c msgid "Help" msgstr "Auta" #: src/webu_html.c msgid "No Configuration Options" msgstr "Ei kokoonpanoasetuksia" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "Rajoitetut määritys vaihtoehdot" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "Lisäasetukset" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "Luottamukselliset asetukset" #: src/webu_html.c msgid "All Cameras" msgstr "Kaikki kamerat" #: src/webu_html.c msgid "Not running" msgstr "ei aktiivinen" #: src/webu_html.c msgid "Lost connection" msgstr "Yhteys menetetty" #: src/webu_html.c msgid "Paused" msgstr "tauota" #: src/webu_html.c msgid "Active" msgstr "aktiivinen" #: src/webu_html.c msgid "Select option" msgstr "Valitse vaihtoehto" #: src/webu_html.c msgid "Save" msgstr "Tallentaa" #: src/webu_html.c msgid "Pan/Tilt" msgstr "kääntää / kallistaa" #: src/webu_html.c msgid "Absolute Change" msgstr "Absoluuttinen muutos" #: src/webu_html.c msgid "Center" msgstr "Keskus" #: src/webu_html.c msgid "Pan" msgstr "kääntää" #: src/webu_html.c msgid "Tilt" msgstr "kallistaa" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "Virheellinen säike määritetty: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "Virheellinen URL-osoite kamerakohtaiselle portille: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "" "Langan 0 URL-osoite ei kelpaa, kun käytetään kamerakohtaisia ​​tiedostoja .: %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "Virheellinen URL-osoite kamerakohtaiselle portille: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "Kuvan suoratoisto ei onnistunut." #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "' %s' -vaihtoehto on poistettu. Uuden vaihtoehdon nimi on '%s' " motion-release-4.6.0/po/fr.po000066400000000000000000003350661452402535500160530ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:34-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "%s après la version %s" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "Option de configuration \"%s\" inconnue " #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "Ecriture du fichier de configuration sur %s" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "" "Fichier de configuration %s non trouvé - essaie les valeurs par défault." #: src/conf.c msgid "Error getcwd" msgstr "Erreur getcwd" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "ne peut pas ouvrir le fichier de configuration %s" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "Nom de fichier invalide %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "Traitement tread 0 - fichier de configuration %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "" "Pas de fichier de configuration à traiter, utilisation des valeurs par " "défault" #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "" "Ecriture des paramètres de configuration depuis tous les fichiers (%d):" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "Thread %d - Fichier de configuration: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s " #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "Traitement du fichier de configuration %s" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "Répertoire de caméra config %s introuvable" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "Fichier de configuration de l'appareil photo %s introuvable" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "Traitement du fichier de configuration camera %s" #: src/conf.c msgid "daemon" msgstr "démon" #: src/conf.c msgid "setup_mode" msgstr "Mode de configuration" #: src/conf.c msgid "pid_file" msgstr "fichier pid" #: src/conf.c msgid "log_file" msgstr "fichier journal" #: src/conf.c msgid "log_level" msgstr "niveau de journalisation" #: src/conf.c msgid "log_type" msgstr "type de journal" #: src/conf.c msgid "quiet" msgstr "silencieux" #: src/conf.c msgid "watchdog_tmo" msgstr "chien de garde tmo" #: src/conf.c msgid "watchdog_kill" msgstr "chien de garde tuer" #: src/conf.c msgid "native_language" msgstr "langue maternelle" #: src/conf.c msgid "camera_name" msgstr "nom de la caméra" #: src/conf.c msgid "camera_id" msgstr "identifiant de la caméra" #: src/conf.c msgid "target_dir" msgstr "répertoire cible" #: src/conf.c msgid "video_device" msgstr "appareil vidéo" #: src/conf.c msgid "video_params" msgstr "paramètres vidéo" #: src/conf.c msgid "auto_brightness" msgstr "Luminosité automatique" #: src/conf.c msgid "tuner_device" msgstr "appareil tuner" #: src/conf.c msgid "roundrobin_frames" msgstr "cadres roundrobin" #: src/conf.c msgid "roundrobin_skip" msgstr "roundrobin skip" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "filtre commutateur roundrobin" #: src/conf.c msgid "netcam_url" msgstr "URL netcam" #: src/conf.c msgid "netcam_params" msgstr "paramètres netcam" #: src/conf.c msgid "netcam_high_url" msgstr "URL haute netcam" #: src/conf.c msgid "netcam_high_params" msgstr "netcam paramètres élevés" #: src/conf.c msgid "netcam_userpass" msgstr "netcam userpass" #: src/conf.c msgid "mmalcam_name" msgstr "nom mmalcam" #: src/conf.c msgid "mmalcam_params" msgstr "paramètres mmalcam" #: src/conf.c msgid "width" msgstr "largeur" #: src/conf.c msgid "height" msgstr "la taille" #: src/conf.c msgid "framerate" msgstr "framerate" #: src/conf.c msgid "minimum_frame_time" msgstr "temps de trame minimum" #: src/conf.c msgid "rotate" msgstr "tourner" #: src/conf.c msgid "flip_axis" msgstr "axe de retournement" #: src/conf.c msgid "locate_motion_mode" msgstr "localiser le mode mouvement" #: src/conf.c msgid "locate_motion_style" msgstr "localiser le style de mouvement" #: src/conf.c msgid "text_left" msgstr "texte à gauche" #: src/conf.c msgid "text_right" msgstr "texte droit" #: src/conf.c msgid "text_changes" msgstr "changements de texte" #: src/conf.c msgid "text_scale" msgstr "échelle de texte" #: src/conf.c msgid "text_event" msgstr "événement de texte" #: src/conf.c msgid "emulate_motion" msgstr "émuler le mouvement" #: src/conf.c msgid "pause" msgstr "pause" #: src/conf.c msgid "threshold" msgstr "seuil" #: src/conf.c msgid "threshold_maximum" msgstr "seuil maximum" #: src/conf.c msgid "threshold_tune" msgstr "mélodie de seuil" #: src/conf.c msgid "noise_level" msgstr "niveau de bruit" #: src/conf.c msgid "noise_tune" msgstr "mélodie de bruit" #: src/conf.c msgid "despeckle_filter" msgstr "filtre anti-taches" #: src/conf.c msgid "area_detect" msgstr "détection de zone" #: src/conf.c msgid "mask_file" msgstr "fichier de masque" #: src/conf.c msgid "mask_privacy" msgstr "masque la vie privée" #: src/conf.c msgid "smart_mask_speed" msgstr "masque intelligent vitesse" #: src/conf.c msgid "lightswitch_percent" msgstr "commutateur de lumière pour cent" #: src/conf.c msgid "lightswitch_frames" msgstr "cadres de commutation de lumière" #: src/conf.c msgid "minimum_motion_frames" msgstr "images de mouvement minimum" #: src/conf.c msgid "event_gap" msgstr "écart d'événement" #: src/conf.c msgid "pre_capture" msgstr "pré capture" #: src/conf.c msgid "post_capture" msgstr "post capture" #: src/conf.c msgid "on_event_start" msgstr "au début de l'événement" #: src/conf.c msgid "on_event_end" msgstr "à la fin de l'événement" #: src/conf.c msgid "on_picture_save" msgstr "sur la sauvegarde de l'image" #: src/conf.c msgid "on_area_detected" msgstr "sur la zone détectée" #: src/conf.c msgid "on_motion_detected" msgstr "en mouvement détecté" #: src/conf.c msgid "on_movie_start" msgstr "au début du film" #: src/conf.c msgid "on_movie_end" msgstr "à la fin du film" #: src/conf.c msgid "on_camera_lost" msgstr "à la caméra perdu" #: src/conf.c msgid "on_camera_found" msgstr "à la caméra trouvé" #: src/conf.c msgid "picture_output" msgstr "sortie d'image" #: src/conf.c msgid "picture_output_motion" msgstr "mouvement de sortie d'image" #: src/conf.c msgid "picture_type" msgstr "type d'image" #: src/conf.c msgid "picture_quality" msgstr "qualité de l'image" #: src/conf.c msgid "picture_exif" msgstr "photo exif" #: src/conf.c msgid "picture_filename" msgstr "image nom de fichier" #: src/conf.c msgid "snapshot_interval" msgstr "intervalle d'instantané" #: src/conf.c msgid "snapshot_filename" msgstr "nom de fichier instantané" #: src/conf.c msgid "movie_output" msgstr "sortie de film" #: src/conf.c msgid "movie_output_motion" msgstr "mouvement de sortie de film" #: src/conf.c msgid "movie_max_time" msgstr "temps maximum de film" #: src/conf.c msgid "movie_bps" msgstr "film bps" #: src/conf.c msgid "movie_quality" msgstr "qualité du film" #: src/conf.c msgid "movie_codec" msgstr "codec de film" #: src/conf.c msgid "movie_duplicate_frames" msgstr "doublons de film" #: src/conf.c msgid "movie_passthrough" msgstr "passthrough de film" #: src/conf.c msgid "movie_filename" msgstr "Nom du film" #: src/conf.c msgid "movie_extpipe_use" msgstr "utilisation de film extpipe" #: src/conf.c msgid "movie_extpipe" msgstr "film extpipe" #: src/conf.c msgid "timelapse_interval" msgstr "intervalle de temps" #: src/conf.c msgid "timelapse_mode" msgstr "mode timelapse" #: src/conf.c msgid "timelapse_fps" msgstr "timelapse fps" #: src/conf.c msgid "timelapse_codec" msgstr "codec timelapse" #: src/conf.c msgid "timelapse_filename" msgstr "nom de fichier timelapse" #: src/conf.c msgid "video_pipe" msgstr "pipe vidéo" #: src/conf.c msgid "video_pipe_motion" msgstr "mouvement du tuyau vidéo" #: src/conf.c msgid "webcontrol_port" msgstr "port de contrôle Web" #: src/conf.c msgid "webcontrol_ipv6" msgstr "webcontrol ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "webcontrol localhost" #: src/conf.c msgid "webcontrol_parms" msgstr "WebControl Parms" #: src/conf.c msgid "webcontrol_interface" msgstr "interface webcontrol" #: src/conf.c msgid "webcontrol_auth_method" msgstr "méthode d'authentification Webcontrol" #: src/conf.c msgid "webcontrol_authentication" msgstr "authentification webcontrol" #: src/conf.c msgid "webcontrol_tls" msgstr "webcontrol tls" #: src/conf.c msgid "webcontrol_cert" msgstr "webcontrol cert" #: src/conf.c msgid "webcontrol_key" msgstr "clé de contrôle Web" #: src/conf.c msgid "webcontrol_header_params" msgstr "paramètres d'en-tête webcontrol" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "minutes de verrouillage du contrôle Web" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "tentatives de verrouillage de webcontrol" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "ips max de verrouillage webcontrol" #: src/conf.c msgid "stream_port" msgstr "port de flux" #: src/conf.c msgid "stream_localhost" msgstr "flux localhost" #: src/conf.c msgid "stream_auth_method" msgstr "méthode d'authentification de flux" #: src/conf.c msgid "stream_authentication" msgstr "authentification par flux" #: src/conf.c msgid "stream_tls" msgstr "flux tls" #: src/conf.c msgid "stream_header_params" msgstr "paramètres d'en-tête de flux" #: src/conf.c msgid "stream_preview_scale" msgstr "échelle de prévisualisation de flux" #: src/conf.c msgid "stream_preview_newline" msgstr "aperçu de flux newline" #: src/conf.c msgid "stream_preview_method" msgstr "méthode de prévisualisation de flux" #: src/conf.c msgid "stream_quality" msgstr "qualité du flux" #: src/conf.c msgid "stream_grey" msgstr "gris de ruisseau" #: src/conf.c msgid "stream_motion" msgstr "mouvement de flux" #: src/conf.c msgid "stream_maxrate" msgstr "flux maxrate" #: src/conf.c msgid "stream_limit" msgstr "limite de flux" #: src/conf.c msgid "database_type" msgstr "type de base de données" #: src/conf.c msgid "database_dbname" msgstr "base de données" #: src/conf.c msgid "database_host" msgstr "hôte de base de données" #: src/conf.c msgid "database_port" msgstr "port de base de données" #: src/conf.c msgid "database_user" msgstr "utilisateur de base de données" #: src/conf.c msgid "database_password" msgstr "mot de passe de base de données" #: src/conf.c msgid "database_busy_timeout" msgstr "délai d'attente de la base de données occupé" #: src/conf.c msgid "sql_log_picture" msgstr "image de journal SQL" #: src/conf.c msgid "sql_log_snapshot" msgstr "capture instantanée de journal SQL" #: src/conf.c msgid "sql_log_movie" msgstr "film de journal sql" #: src/conf.c msgid "sql_log_timelapse" msgstr "journal SQL timelapse" #: src/conf.c msgid "sql_query_start" msgstr "début de requête SQL" #: src/conf.c msgid "sql_query_stop" msgstr "stop requête SQL" #: src/conf.c msgid "sql_query" msgstr "requête SQL" #: src/conf.c msgid "track_type" msgstr "type de piste" #: src/conf.c msgid "track_auto" msgstr "piste automatique" #: src/conf.c msgid "track_port" msgstr "suivre le port" #: src/conf.c msgid "track_motorx" msgstr "piste motorx" #: src/conf.c msgid "track_motorx_reverse" msgstr "suivre motorx reverse" #: src/conf.c msgid "track_motory" msgstr "piste motory" #: src/conf.c msgid "track_motory_reverse" msgstr "piste motory reverse" #: src/conf.c msgid "track_maxx" msgstr "suivre maxx" #: src/conf.c msgid "track_minx" msgstr "piste minx" #: src/conf.c msgid "track_maxy" msgstr "suivre maxy" #: src/conf.c msgid "track_miny" msgstr "piste miny" #: src/conf.c msgid "track_homex" msgstr "suivre homex" #: src/conf.c msgid "track_homey" msgstr "piste intime" #: src/conf.c msgid "track_iomojo_id" msgstr "suivre l'identifiant iomojo" #: src/conf.c msgid "track_step_angle_x" msgstr "suivre l'angle de pas x" #: src/conf.c msgid "track_step_angle_y" msgstr "suivre l'angle de pas y" #: src/conf.c msgid "track_move_wait" msgstr "suivre le mouvement attendre" #: src/conf.c msgid "track_speed" msgstr "vitesse de la piste" #: src/conf.c msgid "track_stepsize" msgstr "suivre pas à pas" #: src/conf.c msgid "track_generic_move" msgstr "suivre le mouvement générique" #: src/conf.c msgid "camera" msgstr "caméra" #: src/conf.c msgid "camera_dir" msgstr "caméra dir" #: src/dbse.c msgid "Closing MySQL library" msgstr "Fermeture de la bibliothèque MySQL" #: src/dbse.c msgid "Closing MariaDB library" msgstr "Fermeture de la bibliothèque MariaDB" #: src/dbse.c msgid "Database closed" msgstr "Base de données fermée" #: src/dbse.c msgid "Initializing database" msgstr "Initialisation de la base de données" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "" "Impossible de se connecter à la base de données MySQL %s sur l'hôte %s avec " "l'utilisateur %s" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "Erreur MySQL était %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "" "Impossible de se connecter à la base de données MariaDB %s sur l'hôte %s " "avec l'utilisateur %s" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "L'erreur MariaDB était %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "Ouverture de la base de données %s" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "Impossible d'ouvrir la base de données SQLite3 %s. Erreur %d : %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "Définition du délai d'occupation à %d ms" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "La définition du délai d'occupation a échoué. Erreur %d :%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "La connexion à la base de données PostgreSQL '%s' à échouée : %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "Type de base de données %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "Exécuter une requête MySQL" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "Échec de la requête MySQL %s code d'erreur %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "" "Impossible de se reconnecter à la base de données MySQL %s sur l'hôte %s " "avec l'erreur MySQL de l'utilisateur %sétait %s" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "Reconnexion à la base de données MySQL '%s' réussie" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "après reconnexion, la requête MySQL a échoué %s code d'erreur %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "Exécuter une requête MariaDB" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "Échec de la requête MariaDB %s code d'erreur %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "Impossible de se reconnecter à la base de données MariaDB %s sur l'hôte %s " "avec l'utilisateur %s MariaDBl'erreur était %s" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "Reconnexion à la base de données MariaDB '%s' réussie" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "après reconnexion, la requête MariaDB a échoué %s code d'erreur %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "Reconnecté à la base de données PostgreSQL '%s'" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "Exécuter une requête PostgreSQL" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "Tentative de reconnexion à la base de données PostgreSQL '%s' : %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "Échec de la requête PGSQL: [%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "Exécution de %s" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "Erreur SQLite3 %d : %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "Ignorer la requête sql vide" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "Impossible d'exécuter la commande externe '%s'" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "Exécution de la commande externe '%s'" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "Écriture de l'image dans le fichier : %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "Écriture du film dans un fichier : %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "Image enregistrée dans le fichier : %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "Film enregistré dans un fichier : %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "Impossible de mettre l'image dans le conduit video" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "Ne peut pas créer le lien symbolique [%s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "Erreur lors de la création du nom du canal d'aperçu %d %s" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "Erreur lors de la création de la base de noms de fichiers %d %s" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "Erreur lors de la création du nom de l'aperçu %d %s" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "FERMETURE: fichier extpipe desc %d, état d'erreur %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "pclose return: %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "Source FPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "Moviepath: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "pas de droit d'écriture dans le dossier cible %s" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "chemin non trouvé, essaye de le créer %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "erreur lors de l'accès au chemin %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "Erreur lors de la spécification de la ligne de commande: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "tuyau: %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt-> moviefps: %d" #: src/event.c msgid "popen failed" msgstr "échec de popen" #: src/event.c msgid "Using extpipe" msgstr "Utilise extpipe" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "Erreur lors de l'écriture dans le pipe, erreur %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "pipe %s non créé ou déjà fermé " #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "Le conteneur ogg n'est plus pris en charge. Passer à mpeg4" #: src/event.c msgid "Running test of the various output formats." msgstr "Test en cours des différents formats de sortie." #: src/event.c msgid "Error opening context for movie output." msgstr "Erreur lors de l'ouverture du contexte pour la sortie du film." #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "" "Erreur d'ouverture de ffopen lors de la création du fichier (mouvement) [ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "" "Le conteneur swf pour timelapse n'est plus pris en charge. Utiliser un " "conteneur mpg." #: src/event.c msgid "Timelapse using mpg codec." msgstr "Timelapse utilise le codec mpg." #: src/event.c msgid "Events will be appended to file" msgstr "Les évènements seront ajouté au fichier" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "Timelapse utilise le codec mpeg4." #: src/event.c msgid "Events will be trigger new files" msgstr "Les événements seront déclencher de nouveaux fichiers" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "erreur ffopen_open lors de la création du fichier (timelapse) [%s]" #: src/event.c msgid "Error encoding image" msgstr "Erreur lors de l'encodage de l'image" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "Impossible d'allouer de la mémoire pour le nom du codec" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "Choisissez un conteneur ffmpeg différent ou une fréquence d'image plus basse." #: src/ffmpeg.c msgid "Error setting base file name" msgstr "Erreur lors de la définition du nom du fichier de base" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "Erreur lors de la configuration de timelapse append pour le codec %s" #: src/ffmpeg.c msgid "Error setting file name" msgstr "Erreur lors de la définition du nom de fichier" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "la valeur %s pour l'option codec n'est pas supportée" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "Impossible de récupérer le codec" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "Erreur d'envoi du cadre pour l'encodage: %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "Le paquet reçu a été renvoyé par EAGAIN et renvoyait le code -2: %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "Erreur lors de la réception de la vidéo en paquets codés: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "Erreur d’encodage de la vidéo: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "Erreur d'encodage de la vidéo" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "" "PTS % PTS de base % intervalle ms % base de temps " "%d- %d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "MAUVAIS TIMING!! Cadre sauté." #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "" "PTS % de base PTS % ms intervalle % base de temps %d-" "%d %d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s codec vbr / crf / débit: %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "Le codec préféré %s a été mis sur liste noire: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "Codec %s non trouvé" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "Utilisation du codec %s" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "Impossible d'allouer le flux" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "Échec d'attribution du codec!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "Fps faibles. Encodage de %d images dans un conteneur d'images %d." #: src/ffmpeg.c msgid "Unable to set quality" msgstr "Impossible de définir la qualité" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "FPS signalé pris en charge %d / %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "Impossible d'ouvrir le codec %s" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "Échec de la copie des paramètres du décodeur !: %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "ne pouvait pas allouer cadre" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "impossible d'allouer des tampons %s" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "erreur d'ouverture du fichier %s" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "Permission refusée. %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "Erreur lors de l'ouverture du fichier %s" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "Impossible d'écrire l'en-tête ffmpeg %s" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "Erreur lors de l’entrée en mode vidange: %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "Erreur de vidage du codec: %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "Erreur d'écriture d'une image vidéo épuisante" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "Erreur lors du codage de l'image" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "Erreur lors de l'écriture d'une image vidéo" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet:%s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "Erreur lors de l'écriture de l'image vidéo: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "Contexte RTSP non disponible." #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "La caméra RTSP n'est pas prête pour le passage." #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "mode de transmission activé. Passage au conteneur MP4." #: src/ffmpeg.c msgid "Could not get codec!" msgstr "Impossible d'obtenir le codec!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "Impossible de copier les paramètres du codec" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "Pass-through désactivé. ffmpeg trop vieux" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "Flux d'intercommunication ouvert" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "" "ffmpeg version de libavcodec %d. %d. %d version de libavformat %d. %d. %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "v lockmgr register failed ( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "Aucune fonctionnalité ffmpeg incluse" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "la réinitialisation du registre av lockmgr a échoué lors du nettoyage" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "Impossible d'allouer le contexte de sortie" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "Impossible de configurer le passthru!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "Impossible de définir le flux" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "Erreur de vidage du codec" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "Tentatives excessives d'effacer le paquet en mémoire tampon" #: src/ffmpeg.c msgid "Buffered packet" msgstr "Paquet tamponné" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s: le tampon jpeg étant trop petit" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "Dimensions de l'image JPEG non valides" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "Taille de l'image JPEG %dx %d, JPEG était de %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "" "Réception d'un événement de rappel de contrôle de caméra inattendu, 0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "" "Une fréquence d'images élevée peut entraîner des problèmes d'exposition des " "images" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "" "Si l'exposition automatique ne fonctionne pas, essayez une cadence d'images " "plus faible." #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "Impossible de créer le composant de caméra MMAL %s" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "La caméra MMAL %s n'a pas de ports de sortie" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "Impossible d'activer le port de contrôle: erreur %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "La configuration sans remplissage de MMAL a échoué" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "le format vidéo de la caméra n'a pas pu être défini" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "composant de la caméra n'a pas pu être activé" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "Composant caméra MMAL créé" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "La création du pool de mémoire tampon de la caméra MMAL a échoué" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "" "La création de la file d'attente de la mémoire tampon de la caméra MMAL a " "échoué" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "Impossible d'obtenir un tampon requis %d de la file d'attente du pool" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "Impossible d'envoyer un tampon au port ( %d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "" "MMAL Filetage de la caméra commençant ... pour la caméra ( %s) de %dx %d à " "%d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "paramètres de caméra ne pouvaient pas être attribués" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "Échec de l'activation du port de capture de caméra MMAL" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "Échec de la capture de la caméra MMAL" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "MMAL nettoyage de la caméra" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %d drapeaux %08x taille %d / %d à %08x, img taille = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "Impossible de renvoyer un tampon sur le port vidéo de la caméra" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "Redimensionnement du tampon de pré-capture en %d éléments" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "Fichier d'ID de processus supprimé (fichier pid)." #: src/motion.c msgid "Error removing pid file" msgstr "Erreur lors de la suppression du fichier pid" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "Fermeture du fichier journal ( %s)." #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "Mouvement détecté - événement de démarrage %d." #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "Ajout de %d cadres de remplissage dans le film" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "Impossible de déterminer le type de caméra (MMAL, Netcam, V4L2, BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "Ouverture du fichier de masque de confidentialité" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "Ouverture d'un fichier de masque de confidentialité haute résolution" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "Erreur lors de l'ouverture du fichier de masque %s" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "Échec de lecture de l'image de confidentialité du masque. La fonctionnalité " "de confidentialité du masque est désactivée." #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "Le fichier de confidentialité du masque \" %s \" a été chargé." #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "Echelle de texte invalide. Ajusté à %d" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "Caméra %d démarrée: détection de mouvement %s" #: src/motion.c msgid "Disabled" msgstr "désactivé" #: src/motion.c msgid "Enabled" msgstr "Activée" #: src/motion.c msgid "Pass-through processing disabled." msgstr "Traitement d'intercommunication désactivé." #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "Dimensions de configuration non valides %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "Utilisation des dimensions par défaut %dx %d" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "La largeur de l'image ( %d) demandée n'est pas modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "Ajuster la largeur au multiple de 8 immédiatement supérieur ( %d)." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "La hauteur de l'image ( %d) demandée n'est pas modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "Ajuster la hauteur au multiple de 8 immédiatement supérieur ( %d)." #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "Impossible de récupérer l'image initiale de la caméra" #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "" "Le mouvement continue en utilisant la largeur et la hauteur des fichiers de " "configuration" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "Motion ne prend en charge que la largeur et la hauteur modulo 8" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "La largeur ( %d) ou la hauteur ( %d) de l’image demandée n’est pas modulo 8." #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Motion ne prend en charge que les largeurs et les hauteurs supérieures ou " "égales à 64 %dx %d" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "Sous-flux non disponible. Tailles d'image non modulo 16." #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "Le format d'image Webp n'est pas disponible, échouant en jpeg" #: src/motion.c msgid "Error capturing first image" msgstr "Erreur lors de la capture de la première image" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "Ouverture d'un périphérique de bouclage vidéo pour des images normales" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "Impossible d'ouvrir la boucle vidéo pour les images normales" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "Dispositif d'ouverture de boucle vidéo pour images animées" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "Impossible d'ouvrir la boucle vidéo pour les images animées" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "" "Impossible de lire l'image du masque. La fonctionnalité de masque est " "désactivée." #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "Le fichier de masque \" %s \" est chargé." #: src/motion.c msgid "Emulating motion" msgstr "Mouvement d'émulation" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "Mouvement dans la zone %d détecté." #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "Réessayer jusqu'à la connexion avec l'appareil photo" #: src/motion.c msgid "Camera has become available." msgstr "La caméra est devenue disponible." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "Redémarrage de Motion.\n" "La largeur (%d) ou la hauteur (%d) de l'image demandée n'est pas modulo 8." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Redémarrage de Motion.\n" "Motion ne prend en charge que la largeur et la hauteur supérieures ou égales à 64 %dx%d" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "Redémarrage de Motion.\n" "La hauteur ou la largeur a changé sur l'appareil photo." #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "Redémarrage de Motion.\n" "La haute résolution a changé sur l'appareil photo." #: src/motion.c msgid "Video signal re-acquired" msgstr "Signal vidéo ré-acquis" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "Erreur fatale du périphérique vidéo - Fermeture du périphérique vidéo" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "" "Redémarrage du thread Motion pour réinitialiser tous les tampons d'image" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "Signal vidéo perdu - Ajout d'une image grise" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "" "Le signal vidéo est toujours perdu - Tentative de fermer le périphérique " "vidéo" #: src/motion.c msgid "Lightswitch detected" msgstr "Lightswitch détecté" #: src/motion.c msgid "Switchfilter detected" msgstr "Switchfilter détecté" #: src/motion.c msgid "micro-lightswitch!" msgstr "micro-interrupteur!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "Fin de l'événement %d" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "Changements bruts: %5d - changements après ' %s': %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr "- étiquettes: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "Changements: %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr "- niveau de bruit: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr "- seuil: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "Argument de mode timelapse non valide ' %s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%: s Par défaut en mode timelapse manuel" #: src/motion.c msgid "Thread exiting" msgstr "Fil sortant" #: src/motion.c msgid "Motion going to daemon mode" msgstr "Mouvement en mode démon" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "" "Quitter le mouvement, impossible de créer un fichier d’identification de " "processus (fichier pid) %s" #: src/motion.c msgid "Could not change directory" msgstr "Impossible de changer de répertoire" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "" "Fichier d'identification de processus créé %s. l'ID de processus est %d" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "" "Les identifiants Camara ne sont pas uniques ou ont une valeur supérieure à " "32,000. Retomber surnuméros de fil" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2: disponible" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2: non disponible" #: src/motion.c msgid "bktr : available" msgstr "bktr: disponible" #: src/motion.c msgid "bktr : not available" msgstr "bktr: non disponible" #: src/motion.c msgid "webp : available" msgstr "webp: disponible" #: src/motion.c msgid "webp : not available" msgstr "webp: non disponible" #: src/motion.c msgid "mmal : available" msgstr "mmal: disponible" #: src/motion.c msgid "mmal : not available" msgstr "mmal: non disponible" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg: disponible" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg: non disponible" #: src/motion.c msgid "mysql : available" msgstr "mysql: disponible" #: src/motion.c msgid "mysql : not available" msgstr "mysql: non disponible" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB: disponible" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB: non disponible" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3: disponible" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3: non disponible" #: src/motion.c msgid "pgsql : available" msgstr "pgsql: disponible" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql: non disponible" #: src/motion.c msgid "nls : available" msgstr "nls: disponible" #: src/motion.c msgid "nls : not available" msgstr "nls: non disponible" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "Utilisation du niveau de journalisation par défaut ( %s) ( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "Enregistrement dans un fichier ( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "Quitter le mouvement, impossible de créer le fichier journal %s" #: src/motion.c msgid "Logging to syslog" msgstr "Se connecter à syslog" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "Motion% s démarré" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "Utilisation du type de journal par défaut ( %s)" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "Utilisation du type de journal ( %s) niveau de journal ( %s)" #: src/motion.c msgid "Motion running as daemon process" msgstr "Mouvement exécuté en tant que processus démon" #: src/motion.c msgid "Motion running in setup mode." msgstr "Mouvement en mode de configuration." #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "Identifiant de la caméra: %d est de %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "Identifiant de la caméra: %d Nom de la caméra: %s Service: %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "Identifiant de la caméra: %d Nom de la caméra: %s Appareil: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "" "Le numéro de port de flux %d pour le thread %d est en conflit avec le port " "de contrôle" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "La fonctionnalité de flux pour le thread %d est désactivée." #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "" "Le numéro de port du flux %d pour le thread %d entre en conflit avec le " "thread %d" #: src/motion.c msgid "Restarting motion." msgstr "Mouvement de redémarrage." #: src/motion.c msgid "Motion restarted" msgstr "Motion recommencée" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "" "Thread %d - Délai d'attente du chien de garde. Essayer de faire un " "redémarrage en douceur" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "" "Thread %d - Le délai d'attente du chien de garde n'A PAS redémarré, ce qui " "l'a tué!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "Fil %d - Fil de nettoyage." #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "" "Les threads DEBUG-1 exécutant %d les threads animés exécutant %d, terminent " "%d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "En attente de la fin des threads, pid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "Motion thread %d redémarrer" #: src/motion.c msgid "Threads finished" msgstr "Fils finis" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "Motion mettant fin" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "URL invalide. Impossible d'analyser les valeurs." #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "Le thread du gestionnaire de caméra [ %d] a commencé" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "Fermeture de la prise netcam alors que le temps de maintien en vie est " "écoulé (champ proche envoyé par la caméra). UNEreconnecter devrait arriver." #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "réouverture de la caméra (non-streaming)" #: src/netcam.c msgid "camera re-connected" msgstr "caméra re-connectée" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "En-tête d'image non reconnu ( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "Erreur dans l'en-tête ( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "réouverture de la caméra (streaming)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "Erreur lors de l'obtention de l'image jpeg" #: src/netcam.c msgid "Trying to re-connect" msgstr "Essayer de se reconnecter" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "gestionnaire de caméra netcam: jeu de finition, sortie" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "Pas de réponse du gestionnaire de la caméra - il doit déjà être mort" #: src/netcam.c msgid "called with no data in buffer" msgstr "appelé sans données dans le tampon" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "Caméra réseau démarrant pour la caméra ( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "Proxy netcam invalide ( %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "" "Le nom d'utilisateur / mot de passe n'est pas autorisé sur une URL de proxy" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "Service netcam non valide ' %s'" #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "URL netcam non valide pour la caméra ( %s)" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "Le paramètre http Netcam ' %s' est converti en indicateurs: HTTP / 1.0: %s " "HTTP / 1.1: %s Keep-Vivant %s." #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "appelle maintenant netcam setup html ()" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "appelle maintenant netcam setup ftp" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "appelle maintenant le fichier d'installation de netcam ()" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "appelle maintenant netcam setup mjpg ()" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "Service netcam non valide '%s' - doit être mjpeg, ftp, mjpg ou jpeg." #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "" "Échec lors de la tentative de lecture de la première image - Retval: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "échec de la décompression de libjpeg à la première image - abandon!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "Largeur / hauteur ( %dx %d) doit être un multiple de 8" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "Erreur lors du démarrage du thread du gestionnaire de caméra [ %d]" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "recv échoué en ftp obtenir plus" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "Réponse du serveur: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "Échec de l'envoi dans l'utilisateur de l'envoi ftp" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "échec de l'envoi dans ftp envoi du mot de passe" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "envoi a échoué dans ftp quit" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "gethostbyname a échoué dans la connexion ftp" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "incompatibilité d'adresse gethostbyname dans ftp connect" #: src/netcam_ftp.c msgid "socket failed" msgstr "socket a échoué" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "Impossible de créer une connexion" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "Serveur FTP demandant ACCT sur anonyme" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "réglage de l'option de socket SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "échec de l'envoi dans la connexion ftp" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "Réponse invalide à PASV" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "Impossible de créer une connexion de données" #: src/netcam_ftp.c msgid "bind failed" msgstr "lier échoué" #: src/netcam_ftp.c msgid "listen failed" msgstr "écouter a échoué" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "envoi a échoué dans ftp get socket" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "accepter en ft get get socket" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "recv échoué en lecture FTP" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "ftp get socket a échoué" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "Erreur lors de l'envoi de TYPE I au serveur FTP" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "Jeton malformé Content-Length mais valeur %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "Contenu-Longueur %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "Type de contenu %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "" "Erreur de lecture de l'en-tête de l'image, mode de diffusion en continu (1). " "En-tête nul." #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "" "Erreur de lecture de l'en-tête de l'image, mode de diffusion en continu (1). " "En-tête inconnu ' %s'" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "Erreur lors de la lecture de l'en-tête de l'image (2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "En-tête pas JPEG" #: src/netcam_http.c msgid "Content-Length 0" msgstr "Longueur du contenu 0" #: src/netcam_http.c msgid "Found image header record" msgstr "Enregistrement d'en-tête d'image trouvé" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "Erreur lors de l'envoi de la requête 'connect'" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "Premier en-tête reçu (' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "Erreur de lecture du premier en-tête ( %s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "Code de résultat HTTP %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "" "Drapeau Netcam Keep-Alive supprimé en raison d'une connexion HTTP " "apparemment fermée." #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "Caméra non-streaming (ensemble persistant)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "Caméra non-en streaming (Keep-Alive non défini)" #: src/netcam_http.c msgid "Streaming camera" msgstr "Caméra en streaming" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "Chaîne de limite [ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "Chaîne de limite introuvable dans l'en-tête" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "" "Caméra en streaming utilisant probablement des blocs MJPG, envisagez " "d'utiliser mjpg:// netcam_url" #: src/netcam_http.c msgid "Unrecognized content type" msgstr "Type de contenu non reconnu" #: src/netcam_http.c msgid "Content-length present" msgstr "Contenu de longueur présente" #: src/netcam_http.c msgid "Content-length 0" msgstr "Longueur du contenu 0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "Conn trouvé: fermer l'en-tête (' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "" "Les en-têtes 'Connection: Keep-Alive' et 'Connection: close' ont été reçus. " "Motion supprime Keepalive." #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "" "Les en-têtes 'Connection: Keep-Alive' et 'Connection: close' ont été reçus. " "La motion continue sans changement." #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "Réception d'un champ Keep-Alive dans cet ensemble d'en-têtes." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "Aucun en-tête \"Connexion: Keep-Alive\" ni \"Connexion: fermer\" n'a été " "reçu. \n" " Motion supprime Keepalive." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "Aucun en-tête \"Connexion: Keep-Alive\" ni \"Connexion: fermer\" n'a été " "reçu. \n" " La motion continue sans changement." #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "Suppression de l'indicateur Keep-Alive de netcam car l'en-tête \"Connection: " "close\" a été reçu. \n" " Netcam ne prend pas en charge Keep-Alive. La motion continue dans non-Keep-" "Alive." #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "Keep-Alive a atteint la fin de la période de validité. \n" " Motion fermera netcam, puis reprendra Keep-Alive avec un nouveau socket." #: src/netcam_http.c msgid "disconnect" msgstr "déconnecter" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo () a échoué ( %s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "déconnecter netcam (1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "déconnexion de netcam puisque le maintien en vie n’est pas défini." #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "sans keepalive, la tentative de création de socket a échoué." #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "sans keepalive, nouvelle socket créée fd %d" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "avec keepalive set, socket invalide.Cela pourrait être la première fois. " "Créer unle nouveau a échoué." #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "" "avec keepalive set, socket invalide.Cela pourrait être la première fois, " "créé un nouveauun avec fd %d" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "SO KEEPALIVE est %s" #: src/netcam_http.c msgid "ON" msgstr "SUR" #: src/netcam_http.c msgid "OFF" msgstr "DE" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "SO KEEPALIVE réglé sur le socket." #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "fcntl (1) sur le socket" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "fcntl (2) sur le socket" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "connect () a échoué ( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "déconnecter netcam (4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "délai d'attente sur connect ()" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "déconnecter netcam (2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "getsockopt après la connexion" #: src/netcam_http.c msgid "connect returned error" msgstr "connect a renvoyé une erreur" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "déconnecter netcam (3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "expansion du tampon de [ %d / %d] à [ %d / %d] octets." #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "" "Limite de division potentielle - %d caractères supprimés, %d repositionnés" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "recv () échoue après la chaîne limite" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "laissant netcam connecté." #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "sur le point d’essayer de vous connecter, temps # %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "Échec d'ouverture de la caméra - vérifiez votre configuration et que " "netcamera est en ligne" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "Erreur de lecture du premier en-tête - nouvelle tentative" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "Échec de lecture du premier en-tête de caméra - abandon pour l'instant" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "Netcam a des drapeaux: HTTP / 1.0: %s HTTP / 1.1: %s Keep-Alive %s." #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "" "Netcam keepalive flag supprimé en raison de la définition du proxy. Proxy " "est incompatible avecRester en vie." #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "Échec de lecture du premier en-tête de flux - abandon pour l'instant" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "connecté, passe à lire l'image." #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "Erreur de lecture, tentative de reconnexion .." #: src/netcam_http.c msgid "lost the cam." msgstr "perdu la cam." #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "Tampon rempli avec [ %d] octets du réseau." #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "Lire les octets d'en-tête [ %d / %d]." #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "En-tête non valide reçu, reconnectant" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "Lire [ %d / %d] octets de morceaux, [ %d / %d] total" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "Chunk complete, tampon utilisé [ %d] octets." #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "Image complète, tampon utilisé [ %d] octets." #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "" "connecté, passe ensuite à la lecture et au décodage des fragments MJPG." #: src/netcam_http.c msgid "Begin" msgstr "Commencer" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "erreur stat ( %s)" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]! = dernier st mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "attente du nouveau délai d'expiration d'image" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "retarder l'attente d'une nouvelle image" #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "traitement d'une nouvelle image de fichier - st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "erreur ouverte ( %s): %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "erreur de lecture ( %s): %d" #: src/netcam_http.c msgid "End" msgstr "Fin" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> fichier-> chemin %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "Pas assez de données de netcam." #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> erreur jpeg %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "*** nouvelle image retardée avec succès ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "erreur jpeg %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "traitement de l'image jpeg - longueur du contenu %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "Incompatibilité largeur / hauteur de la caméra avec l'image JPEG - %dx %d " "attendu, %dx %d JPEGretval %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s: tableau de paquets redimensionné en %d" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s: paquet de copie av: %s, interruption: %s" #: src/netcam_rtsp.c msgid "True" msgstr "Vrai" #: src/netcam_rtsp.c msgid "False" msgstr "Faux" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s : Ignorer le paquet avec des données non valides" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s : erreur de trame d'enregistrement : %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "Ignorer un paquet avec des données non valides" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "Erreur de décodage du paquet: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "%s : erreur de transfert du matériel décodé vers la mémoire système" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "Erreur d'envoi du paquet au codec: %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "Erreur de décodage du paquet vidéo: copie dans la mémoire tampon" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s : Périphériques matériels :" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s : %s (disponible)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s : %s (non implémenté)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s : décodeur netcam %s désactivé." #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "Impossible d'obtenir le format de pix vaapi" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "Impossible d'obtenir le format cuda pix" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s : interrompu." #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s : %s : %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s : %s : échec" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s : le décodeur %s n'a pas fonctionné." #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "%s : Ignorer et supprimer le décodeur demandé par l'utilisateur %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s : initialisation du décodeur vaapi" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s : impossible de trouver le périphérique matériel vaapi" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s : initialisation du décodeur cuda" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s : impossible de trouver le périphérique matériel cuda" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s : initialisation du décodeur" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s: utilisation du décodeur %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s : décodeur ouvert" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s: le délai de lecture de la caméra ( %s) a expiré" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s: la caméra ( %s) a expiré" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "Impossible d’attribuer swsframe au format." #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "Impossible d'allouer swsframe out." #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "Impossible d'allouer le contexte de mise à l'échelle." #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "Erreur lors de la détermination de la taille de la trame" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "Erreur lors de l'allocation de l'image dans: %s" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "Erreur lors de l'allocation de la photo: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "Erreur de redimensionnement / reformatage: %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "Erreur lors de la mise en cadre dans le tampon de sortie: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s : interrompu" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s : av cadre de lecture : %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s : tentatives excessives pour obtenir des données de la caméra %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "" "%s : taux de capture non spécifié dans les paramètres netcam. Utilisation de " "%d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s : taux de capture non spécifié dans les paramètres netcam. Utilisation de " "la fréquence d'images %d" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "La caméra réseau envoie des images dans un autre" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "taille que celle spécifiée dans la config et aussi un" #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "format d'image différent. La photo est en cours" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "transcodé au format YUV420P et dans la taille demandée" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "dans le fichier de configuration. Si possible, changez netcam en" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "être au format YUV420P et la taille demandée dans le" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "config pour éventuellement réduire l'utilisation du processeur." #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "taille que celle spécifiée dans le fichier de configuration." #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "L'image est transcodée dans la taille" #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "demandé dans la configuration. Si possible changer" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "netcam ou configuration pour indiquer la même taille" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "pour éventuellement réduire l'utilisation du processeur." #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "Netcam: %dx %d => configuration: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "L'image envoyée est en cours" #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "converti en YUV420P. Si possible, changez netcam" #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "" "format d'image au format YUV420P afin de réduire éventuellement " "l'utilisation du processeur." #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s : configuration de rtsp/rtmp" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s : définition du format d'entrée mjpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s : définition du format d'entrée video4linux2" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s : configuration du fichier vidéo" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s : configuration de %s" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s : option : %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "Configuration de la v4l2 via netcam" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "Configuration du fichier via netcam" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "Configuration de %s via netcam" #: src/netcam_rtsp.c msgid "highres" msgstr "haute résolution" #: src/netcam_rtsp.c msgid "norm" msgstr "norme" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "Configuration du flux %s." #: src/netcam_rtsp.c msgid "Unknown" msgstr "Inconnu" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "Flux copié pour passage" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "Chemin nul passé pour se connecter" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s: Impossible d'ouvrir la caméra ( %s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s: Caméra ouverte ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s: impossible de trouver les informations sur le flux: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s: impossible d'ouvrir le contexte de codec: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s: la taille de l'image de la caméra n'est pas valide" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s: Impossible d'allouer le cadre." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s: Échec de la copie du flux pour la transmission." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s: Impossible de lire la première image" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s: Caméra ( %s) connectée" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s : le taux de capture de la Netcam est de %d." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s : la source de la caméra est %d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s : impossible de déterminer le FPS de la source de la caméra." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s : le taux de capture est inférieur au FPS de la caméra." #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s : des erreurs de décodage se produiront." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "" "%s : un taux de capture légèrement supérieur au FPS de la caméra est " "recommandé." #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s: Reconnexion avec l'appareil photo ...." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s: l'appareil photo ne s'est pas reconnecté." #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s: Vérification de la caméra toutes les 10 secondes." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s: le thread du gestionnaire de caméra [ %d] a commencé" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s: La boucle du gestionnaire est terminée." #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s: erreur lors du démarrage du thread du gestionnaire" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s: en attente de la première image du gestionnaire." #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "impossible de créer un contexte rtsp" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "incapable de créer un contexte élevé rtsp" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "Pas de prise en charge FFmpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s: arrêt de la caméra réseau." #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s: aucune réponse du thread du gestionnaire." #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "Résolution normale: arrêt complet." #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "Haute résolution: arrêt complet." #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "Impossible de définir EXIF ​​sur WebP Chunk" #: src/picture.c msgid "libwebp version error" msgstr "erreur de version libwebp" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "Erreur d'allocation du tampon d'image libwebp" #: src/picture.c msgid "libwebp image compression error" msgstr "Erreur de compression d'image libwebp" #: src/picture.c msgid "unable to assemble webp image" msgstr "impossible d'assembler l'image webp" #: src/picture.c msgid "unable to save webp image to file" msgstr "impossible d'enregistrer l'image Webp dans un fichier" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "Impossible d’écrire l’image dans le fichier %s - Vérification des droits " "d’accès au répertoire cible \n" "Le fil va finir à cause de cette erreur fatale" #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "Impossible d'écrire l'image dans le fichier %s" #: src/picture.c msgid "Error getting PGM vars." msgstr "Erreur lors de l'obtention des variables PGM." #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "Ce n'est pas un fichier pgm, commence par ' %s'" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "Magie %s : Largeur %s(%d) : Hauteur %s(%d) : MaxVal : %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "Échec de lecture des données d'image du fichier pgm" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "" "Le fichier de masque spécifié n'a pas la même taille que l'image de la " "caméra." #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "Tentative de redimensionnement de l’image de masque de %dx %d à %dx %d" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "" "ne peut pas écrire le fichier de masque %s - vérifie les droits d'accès au " "répertoire cible" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "ne peut pas écrire le fichier de masque %s" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "Échec de l'écriture du masque par défaut sous forme de fichier pgm" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "Créer un masque vide %s \n" "Veuillez éditer ce fichier et relancer le mouvement pour activer la fonction " "de masque" #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "Option de configuration \"rotation \" pas un multiple de 90: %d" #: src/track.c msgid "internal error" msgstr "erreur interne" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "erreur interne, %hu n'est pas un type de piste connu" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "port %s dev fd %i, commande %hu du moteur %hu données %hu" #: src/track.c msgid "Status byte timeout!" msgstr "Status byte timeout!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "Essayez d'ouvrir le périphérique série %s" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "Impossible d'ouvrir le périphérique série %s" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "Impossible d'initialiser le périphérique série %s" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "Périphérique série ouvert %s et initialiser, fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "" "Aucun périphérique %s n'a encore été démarré, en essayant stepper center ()" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "Échec d'initialisation du périphérique pas à pas sur %s, fd [ %i]." #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "Réussite, le périphérique a démarré %s, fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "Port SENDS %s dev fd %i, commande moteur %hu %hu données %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "Retour de commande %d" #: src/track.c msgid "Problem opening servo!" msgstr "Problème d'ouverture du servo!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d, cent-> y %d, reversex %d, reversey %d manuel %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d valeur hors limites! ( %d - %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d valeur hors limites! ( %d - %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "X offset %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "X cent-> x %d, cent-> y %d, inversionex %d, inversion %d moteurx %d données " "%d commande %d ré" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Y offset %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Y cent-> x %d, cent-> y %d, reversex %d, reversey %d motory %d données %d " "commande %d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "Décalage X %d, décalage Y %d, position x %d. position y %d, inversionx %d, " "inversion%d, taille par étape %d" #: src/track.c msgid "Return byte timeout!" msgstr "Retour octet timeout!" #: src/track.c msgid "Unable to set camera speed" msgstr "Impossible de régler la vitesse de la caméra" #: src/track.c msgid "succeed" msgstr "réussir" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "" "Impossible de réinitialiser la caméra pwc en position de départ! Raison" #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "échec de VIDIOCPWCMPTGRANGE" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "Échec du panoramique / inclinaison de la caméra pwc! Raison" #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "Impossible de remettre la caméra UVC en position de départ! Raison" #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "Réinitialisation de la caméra UVC à la position de départ" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl querycontrol" #: src/track.c msgid "Getting camera range" msgstr "Obtenir la portée de la caméra" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "" "ENTRÉE PARAM ABS plateau min %d, plateau max %d, inclinaison min %d, " "inclinaison max %d" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "ENTRÉE PARAM ABS X Ange %d, Y Ange %d" #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "Pour SET ABS déplacer X %d, déplacer Y %d" #: src/track.c msgid "Failed to move UVC camera!" msgstr "Impossible de déplacer la caméra UVC!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "Trouvé MINMAX = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "Avant ABS Y Ange: x = %d, Y = %d," #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "Après ABS Y Ange: x = %d, Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "" "Pour SET REL panoramique min %d, panoramique max %d, inclinaison min %d, " "inclinaison max %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "" "Pour le pan de piste SET REL Angel %d, inclinaison de la piste Angel %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "Pour SET REL déplacer X %d, déplacer Y %d" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, contrôle S = %d, Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, contrôle S = %d, Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "Avant REL Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "Après REL Y Angel: x = %d, Y = %d" #: src/translate.c msgid "Language: English" msgstr "Langue: Anglais" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "Impossible d'allouer %llu octets de mémoire!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "" "Attention! La fonction %s essaie de redimensionner memoryblock de %p à 0 " "octets!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "Impossible de redimensionner le bloc de mémoire au décalage %p en %llu " "octets (fonction %s)!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "Problème lors de la création du répertoire %s" #: src/util.c #, c-format msgid "creating directory %s" msgstr "création du répertoire %s" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "Erreur lors de l'ouverture du fichier %s avec le mode %s" #: src/util.c msgid "Error closing file" msgstr "Erreur de fermeture du fichier" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbeventid} n'est pas pris en charge. Utilisez l'identifiant de l'événement." #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "Mot-clé de spécification de format non valide %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "Impossible de définir le nom du thread %s" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "" "La version FFMPEG est trop ancienne. Désactivation du traitement relais." #: src/util.c msgid "pass-through enabled." msgstr "pass-through activé." #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "Erreur lors de la définition du paramètre >%s<" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "Analyse : >%s< >%s<" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "Parsed : >expurgé< >expurgé<" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "Erreur lors de l'analyse des contrôles parm nm : %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "Erreur lors de l'analyse des contrôles parm vl : %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "Erreur lors de la définition de la température : %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "Erreur lors de l'analyse des contrôles : %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "Analyse : %s" #: src/util.c msgid "Parsing: " msgstr "Analyse : " #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "Erreur d'analyse des contrôles : %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "Les erreurs %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "Nouveaux paramètres netcam : %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "Nouveaux paramètres élevés de netcam : %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "Nouveaux paramètres vidéo : %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "Nouveaux paramètres d'en-tête de contrôle Web : %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "Nouveaux paramètres d'en-tête de contrôle Web : " #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "Nouveaux paramètres d'en-tête de flux : %s" #: src/util.c msgid "New stream_header_params: " msgstr "Nouveaux paramètres d'en-tête de flux : " #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "Erreur de programmation. Élément de configuration inconnu : %s " #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE Erreur lors de la définition de la teinte [ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "à [ %d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE Erreur lors de l'obtention de la teinte" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT Erreur lors du réglage de la saturation [ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT Erreur lors de l'obtention de la saturation" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT Erreur lors du réglage du contraste [ %d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT Erreur lors du contraste" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "Luminosité METEORSBRIG [ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIG obtenir de la luminosité" #: src/video_bktr.c msgid "Not implemented" msgstr "Pas mis en Å“uvre" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "Entrée de périphérique %d hors limites (0-4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d non valide - Essai de composition %d" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "" "BT848SFMT, Impossible de définir le format d'entrée, réessayez avec le " "paramètre par défaut" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "BT848SFMT, impossible de définir le format d'entrée par défaut" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "Impossible de définir la géométrie" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "à [ %d / %d] Norm %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "Fréquence [%ld] non valide pour l'entrée source [%i]" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "Fréquence [%ld] Entrée source [%i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "définir l'entrée [ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "définir le format d'entrée [ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "définir la géométrie [ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "Ensemble de fréquences (pas encore implémenté" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "Dimensionnement du tampon à 3x" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "Tampon de dimensionnement à 3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap échoué" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "METEORCAPTUR en utilisant une seule méthode Capture d'erreur" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "Erreur de capture en utilisant une seule méthode" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "Impossible de trouver le périphérique vidéo" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "Fermeture du périphérique vidéo %s" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "" "Toujours %d utilisateurs du périphérique vidéo %s, nous ne le fermons pas " "maintenant" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "La largeur de l'image de configuration ( %d) n'est pas modulo 8" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "La hauteur de l'image de configuration ( %d) n'est pas modulo 8" #: src/video_bktr.c msgid "Stopping capture" msgstr "Arrêt de la capture" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "" "Réutilisation des [ %s] entrées [ %d, %d] Modifier la méthode de capture de " "changement METEOR CAP SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "VIDEO PALETTE YUV420P setting imgs.size norm et imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "périphérique vidéo ouvert %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "syntoniseur ouvert %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "Image corrompue ... continue" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "Position SOI ajustée par %d octets." #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "appel de nettoyage mmalcam" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "appeler netcam nettoyage" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "appeler netcam rtsp cleanup" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "Nettoyage du périphérique V4L2" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "Nettoyage du périphérique BKTR" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "Pas de nettoyage de l'appareil photo (MMAL, Netcam, V4L2, BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "Ouverture de la caméra MMAL" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "Échec de l'ouverture de la caméra MMAL" #: src/video_common.c msgid "Opening Netcam" msgstr "Ouverture de Netcam" #: src/video_common.c msgid "Netcam failed to open" msgstr "Impossible d'ouvrir Netcam" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Ouverture de Netcam RTSP" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Netcam RTSP n'a pas réussi à ouvrir" #: src/video_common.c msgid "Opening V4L2 device" msgstr "Ouverture du périphérique V4L2" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "Impossible d'ouvrir le périphérique V4L2" #: src/video_common.c msgid "Opening BKTR device" msgstr "Ouverture du périphérique BKTR" #: src/video_common.c msgid "BKTR device failed to open" msgstr "Impossible d'ouvrir le périphérique BKTR" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "Aucun appareil photo spécifié (MMAL, Netcam, V4L2, BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "Échec d'ouverture de ' %s'" #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "Erreur lors de la spécification du tampon: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "Tampon d'ouverture: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "Tampon de lecture: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "périphérique vidéo trouvé ' %s' %d" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "%s ouverts en tant que sortie de canal" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "L'ouverture de %s en tant que sortie de canal a échoué" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "Spécifications du tuyau d'origine" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "Spécifications de tuyauterie proposées" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "Spécifications du tuyau final" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "Aucun contrôle trouvé pour le périphérique" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "---------Les contrôles---------" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr "Nom et plage de l'identifiant V4L2" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "Erreur lors de la réinitialisation de la valeur utilisateur" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "Laisser le contrôle %s \"%s\" défini sur %d" #: src/video_v4l2.c msgid "Device not ready" msgstr "Appareil pas prêt" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "Définissez le contrôle \" %s \" sur la valeur %d" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "la définition du contrôle %s \"%s\" sur %d a échoué." #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "" "La valeur de l'option de contrôle %s %s est inférieure au minimum. " "Utilisation d'au moins %d " #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "" "La valeur de l'option de contrôle %s %s est supérieure au maximum. " "Utilisation maximale de %d " #: src/video_v4l2.c msgid "control type not supported yet" msgstr "type de contrôle pas encore supporté" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "Impossible d'interroger l'entrée %d. VIDIOC ENUMINPUT, si vous utilisez une " "entrée de modification WEBCAMvaleur dans conf par -1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "Nom = \" %s \", tapez 0x %08X, statut %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "Name = \" %s \", - TUNER" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "Nom = \" %s \" - APPAREIL PHOTO" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "Erreur lors de la sélection de l’entrée %d VIDIOC S INPUT" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "" "L'appareil ne prend pas en charge la spécification de la norme PAL / NTSC" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "- norme vidéo %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "Erreur lors de la sélection de la méthode standard %d VIDIOC S STD" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "Norme vidéo définie sur NTSC" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "Norme vidéo réglée sur SECAM" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "Norme vidéo définie sur PAL" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "syntoniseur %d VIDIOC G TUNER" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "Régler le tuner %d" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "Freq %ul VIDIOC S FREQUENCY" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "Définir la fréquence sur %ul" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "Impossible d'utiliser %c%c%c%c (%dx%d)" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "Test de la palette %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "Vérification de la taille de l'image %dx%d avec la foulée %d" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "Aucune valeur de foulée fournie par l'appareil." #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "La largeur (%d) doit être inférieure à la foulée (%d)" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "La largeur de l'image (%d) n'est pas un multiple de la foulée (%d)" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "Condition impossible : Largeur(%d), Foulée(%d), Par foulée(%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "La largeur de l'image sera remplie %d octets" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "Réglage de la résolution de %ix %i à %ix %i." #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "Résolution ajustée non modulo 8." #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "" "Spécifiez une palette ou une largeur / hauteur différente dans le fichier de " "configuration." #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "Erreur lors de la définition du format de pixel." #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "Utilisation de la palette %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "Réglage en largeur ( %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "Réglage en hauteur ( %d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "" "L'index de la palette de configuration %d ( %s) pour %dx %d ne fonctionne " "pas." #: src/video_v4l2.c msgid "Supported palettes:" msgstr "Palettes prises en charge:" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d - %s (compressé: %d) ( %# x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "Palette sélectionnée %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "La sélection de la palette a échoué pour le format %s" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "Impossible de trouver un format de palette compatible." #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "" "Erreur lors de la demande de tampons %d pour la carte mémoire. VIDIOC REQBUFS" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "informations mmap: frames = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "Mémoire tampon insuffisante %d %s< >%s< >%s<" msgstr "Action non valide demandée:> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "Langage natif : Oui" #: src/webu.c msgid "Native Language : off" msgstr "Langage natif : Non" #: src/webu.c msgid "Set the value to null/zero" msgstr "Définissez la valeur sur null / zero" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "Ignorer la connexion de : %s" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "Échec de l'authentification à partir de %s" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "Pas d'utilisateur Webcontrol: pass fourni" #: src/webu.c msgid "No stream user:pass provided" msgstr "Pas d'utilisateur de flux: pass fourni" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "Réponse invalide" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "Erreur lors de l'ajout de l'en-tête de contrôle Web %s %s" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "Erreur lors de l'ajout de l'en-tête de flux %s %s" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "Méthode non valide demandée: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "Connexion à partir de: %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "La page d'envoi a échoué %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "L'image diffusée n'est pas encore prête" #: src/webu.c msgid "Stream process requested to finish." msgstr "Le processus de flux doit se terminer." #: src/webu.c msgid "Send page failed." msgstr "Échec de l'envoi de la page." #: src/webu.c msgid "Basic authentication: available" msgstr "Authentification de base: disponible" #: src/webu.c msgid "Basic authentication: disabled" msgstr "Authentification de base: désactivé" #: src/webu.c msgid "Digest authentication: available" msgstr "Authentification Digest: disponible" #: src/webu.c msgid "Digest authentication: disabled" msgstr "Authentification Digest: désactivée" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd libary too old ipv6 désactivé" #: src/webu.c msgid "IPV6: available" msgstr "IPV6: disponible" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6: désactivé" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd libary trop vieux SSL / TLS désactivé" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS: disponible" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS: désactivé" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "Erreur de lecture du fichier pour la prise en charge de SSL / TLS." #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "SSL / TLS demandé mais aucun fichier de certificat fourni. SSL / TLS " "désactivé" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "" "SSL / TLS demandé mais aucun fichier de clé fourni. SSL / TLS désactivé" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "Démarrage de webcontrol sur le port %d" #: src/webu.c msgid "Unable to start MHD" msgstr "Impossible de démarrer MHD" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "Démarrage de webcontrol sur le port %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "Caméra démarrée %d flux sur le port / identifiant de la caméra %d / %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "Caméra démarrée %d flux sur le port %d" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "Démarrage de tous les flux de caméra sur le port %d" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "Démarrage de la caméra %d sur le port %d" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "Impossible de démarrer le flux pour la caméra %d" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "Port dupliqué demandé %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "IPs max. de verrouillage webcontrol invalides. Réglage égal à 25. " #: src/webu_html.c msgid "Cameras" msgstr "Caméras" #: src/webu_html.c msgid "Camera" msgstr "Caméra" #: src/webu_html.c msgid "All" msgstr "Toutes" #: src/webu_html.c msgid "Action" msgstr "Action" #: src/webu_html.c msgid "Start Event" msgstr "Commencer un événement" #: src/webu_html.c msgid "End Event" msgstr "Terminer l'événement" #: src/webu_html.c msgid "Snapshot" msgstr "Instantané" #: src/webu_html.c msgid "Change Configuration" msgstr "Changer la configuration" #: src/webu_html.c msgid "Write Configuration" msgstr "Écrire la configuration" #: src/webu_html.c msgid "Tracking" msgstr "Suivi" #: src/webu_html.c msgid "Pause" msgstr "Pause" #: src/webu_html.c msgid "Start" msgstr "Démarrer" #: src/webu_html.c msgid "Restart" msgstr "Redémarrer" #: src/webu_html.c msgid "Quit" msgstr "Quitter" #: src/webu_html.c msgid "Help" msgstr "Aide" #: src/webu_html.c msgid "No Configuration Options" msgstr "Aucune option de configuration" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "Options de configuration limitées" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "Options de configuration avancées" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "Options de configuration restreintes" #: src/webu_html.c msgid "All Cameras" msgstr "Toutes les caméras" #: src/webu_html.c msgid "Not running" msgstr "Hors ligne" #: src/webu_html.c msgid "Lost connection" msgstr "Connexion perdue" #: src/webu_html.c msgid "Paused" msgstr "En pause" #: src/webu_html.c msgid "Active" msgstr "Active" #: src/webu_html.c msgid "Select option" msgstr "Sélectionnez une option" #: src/webu_html.c msgid "Save" msgstr "Enregistrer" #: src/webu_html.c msgid "Pan/Tilt" msgstr "Rotation / inclinaison" #: src/webu_html.c msgid "Absolute Change" msgstr "Changement absolu" #: src/webu_html.c msgid "Center" msgstr "Centrer" #: src/webu_html.c msgid "Pan" msgstr "Rotation" #: src/webu_html.c msgid "Tilt" msgstr "Inclinaison" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "Thread non valide spécifié: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "URL non valide pour un port spécifique à la caméra: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "" "L'URL du fil 0 n'est pas valide lors de l'utilisation de fichiers " "spécifiques à l'appareil photo .: %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "URL incorrecte pour un port spécifique à la caméra: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "Impossible de récupérer le codec." #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "L'option ' %s' est dépréciée. Le nouveau nom de l'option est '%s'" motion-release-4.6.0/po/it.po000066400000000000000000003334251452402535500160550ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:34-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "%s dopo la versione %s" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "Opzione di configurazione sconosciuta \" %s \"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "Scrittura del file di configurazione su %s" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "Configfile %s non trovato - prova impostazioni predefinite." #: src/conf.c msgid "Error getcwd" msgstr "Errore getcwd" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "impossibile aprire il file di configurazione %s" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "Nome file non valido %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "Elaborazione thread 0 - file di configurazione %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "" "Nessun file di configurazione da elaborare, utilizzando i valori predefiniti" #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "Scrittura dei parametri di configurazione da tutti i file ( %d):" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "Discussione %d - File di configurazione: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s " #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "Elaborazione del file di configurazione %s" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "" "La configurazione della directory della telecamera %s non è stata trovata" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "File di configurazione della videocamera %s non trovato" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "Elaborazione del file di configurazione della telecamera %s" #: src/conf.c msgid "daemon" msgstr "demone" #: src/conf.c msgid "setup_mode" msgstr "modalità di impostazione" #: src/conf.c msgid "pid_file" msgstr "file pid" #: src/conf.c msgid "log_file" msgstr "file di registro" #: src/conf.c msgid "log_level" msgstr "livello di registro" #: src/conf.c msgid "log_type" msgstr "tipo di registro" #: src/conf.c msgid "quiet" msgstr "silenzioso" #: src/conf.c msgid "watchdog_tmo" msgstr "cane da guardia tmo" #: src/conf.c msgid "watchdog_kill" msgstr "cane da guardia uccidere" #: src/conf.c msgid "native_language" msgstr "lingua nativa" #: src/conf.c msgid "camera_name" msgstr "nome della telecamera" #: src/conf.c msgid "camera_id" msgstr "ID fotocamera" #: src/conf.c msgid "target_dir" msgstr "destinazione target" #: src/conf.c msgid "video_device" msgstr "dispositivo video" #: src/conf.c msgid "video_params" msgstr "parametri video" #: src/conf.c msgid "auto_brightness" msgstr "luminosità automatica" #: src/conf.c msgid "tuner_device" msgstr "dispositivo sintonizzatore" #: src/conf.c msgid "roundrobin_frames" msgstr "telai roundrobin" #: src/conf.c msgid "roundrobin_skip" msgstr "salta roundrobin" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "filtro interruttore roundrobin" #: src/conf.c msgid "netcam_url" msgstr "netcam url" #: src/conf.c msgid "netcam_params" msgstr "parametri della netcam" #: src/conf.c msgid "netcam_high_url" msgstr "netcam alto url" #: src/conf.c msgid "netcam_high_params" msgstr "parametri elevati di netcam" #: src/conf.c msgid "netcam_userpass" msgstr "netcam userpass" #: src/conf.c msgid "mmalcam_name" msgstr "nome mmalcam" #: src/conf.c msgid "mmalcam_params" msgstr "parametri mmalcam" #: src/conf.c msgid "width" msgstr "larghezza" #: src/conf.c msgid "height" msgstr "altezza" #: src/conf.c msgid "framerate" msgstr "frequenza dei fotogrammi" #: src/conf.c msgid "minimum_frame_time" msgstr "tempo di frame minimo" #: src/conf.c msgid "rotate" msgstr "ruotare" #: src/conf.c msgid "flip_axis" msgstr "asse di vibrazione" #: src/conf.c msgid "locate_motion_mode" msgstr "individuare la modalità di movimento" #: src/conf.c msgid "locate_motion_style" msgstr "individuare lo stile di movimento" #: src/conf.c msgid "text_left" msgstr "testo a sinistra" #: src/conf.c msgid "text_right" msgstr "testo giusto" #: src/conf.c msgid "text_changes" msgstr "modifiche al testo" #: src/conf.c msgid "text_scale" msgstr "scala del testo" #: src/conf.c msgid "text_event" msgstr "evento di testo" #: src/conf.c msgid "emulate_motion" msgstr "emulare il movimento" #: src/conf.c msgid "pause" msgstr "pausa" #: src/conf.c msgid "threshold" msgstr "soglia" #: src/conf.c msgid "threshold_maximum" msgstr "soglia massima" #: src/conf.c msgid "threshold_tune" msgstr "melodia di soglia" #: src/conf.c msgid "noise_level" msgstr "livello di rumore" #: src/conf.c msgid "noise_tune" msgstr "melodia del rumore" #: src/conf.c msgid "despeckle_filter" msgstr "despeckle filter" #: src/conf.c msgid "area_detect" msgstr "rilevamento area" #: src/conf.c msgid "mask_file" msgstr "file maschera" #: src/conf.c msgid "mask_privacy" msgstr "maschera la privacy" #: src/conf.c msgid "smart_mask_speed" msgstr "velocità maschera intelligente" #: src/conf.c msgid "lightswitch_percent" msgstr "percentuale interruttore luci" #: src/conf.c msgid "lightswitch_frames" msgstr "cornici interruttore luci" #: src/conf.c msgid "minimum_motion_frames" msgstr "frame di movimento minimo" #: src/conf.c msgid "event_gap" msgstr "gap evento" #: src/conf.c msgid "pre_capture" msgstr "pre acquisizione" #: src/conf.c msgid "post_capture" msgstr "acquisizione post" #: src/conf.c msgid "on_event_start" msgstr "all'inizio dell'evento" #: src/conf.c msgid "on_event_end" msgstr "alla fine dell'evento" #: src/conf.c msgid "on_picture_save" msgstr "sul salvataggio dell'immagine" #: src/conf.c msgid "on_area_detected" msgstr "sull'area rilevata" #: src/conf.c msgid "on_motion_detected" msgstr "sul movimento rilevato" #: src/conf.c msgid "on_movie_start" msgstr "all'inizio del film" #: src/conf.c msgid "on_movie_end" msgstr "alla fine del film" #: src/conf.c msgid "on_camera_lost" msgstr "sulla fotocamera persa" #: src/conf.c msgid "on_camera_found" msgstr "sulla fotocamera trovata" #: src/conf.c msgid "picture_output" msgstr "uscita dell'immagine" #: src/conf.c msgid "picture_output_motion" msgstr "movimento di uscita dell'immagine" #: src/conf.c msgid "picture_type" msgstr "tipo di immagine" #: src/conf.c msgid "picture_quality" msgstr "qualità dell'immagine" #: src/conf.c msgid "picture_exif" msgstr "immagine exif" #: src/conf.c msgid "picture_filename" msgstr "nome file immagine" #: src/conf.c msgid "snapshot_interval" msgstr "intervallo di istantanee" #: src/conf.c msgid "snapshot_filename" msgstr "nome file dell'istantanea" #: src/conf.c msgid "movie_output" msgstr "uscita del film" #: src/conf.c msgid "movie_output_motion" msgstr "movimento di uscita del film" #: src/conf.c msgid "movie_max_time" msgstr "tempo massimo del film" #: src/conf.c msgid "movie_bps" msgstr "film bps" #: src/conf.c msgid "movie_quality" msgstr "qualità del film" #: src/conf.c msgid "movie_codec" msgstr "codec film" #: src/conf.c msgid "movie_duplicate_frames" msgstr "fotogrammi duplicati di film" #: src/conf.c msgid "movie_passthrough" msgstr "passthrough del film" #: src/conf.c msgid "movie_filename" msgstr "nome file del film" #: src/conf.c msgid "movie_extpipe_use" msgstr "uso estrapolazione del film" #: src/conf.c msgid "movie_extpipe" msgstr "estrapolazione del film" #: src/conf.c msgid "timelapse_interval" msgstr "intervallo di timelapse" #: src/conf.c msgid "timelapse_mode" msgstr "modalità timelapse" #: src/conf.c msgid "timelapse_fps" msgstr "timelapse fps" #: src/conf.c msgid "timelapse_codec" msgstr "codec timelapse" #: src/conf.c msgid "timelapse_filename" msgstr "nome file timelapse" #: src/conf.c msgid "video_pipe" msgstr "tubo video" #: src/conf.c msgid "video_pipe_motion" msgstr "movimento di video pipe" #: src/conf.c msgid "webcontrol_port" msgstr "porta webcontrol" #: src/conf.c msgid "webcontrol_ipv6" msgstr "webcontrol ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "webcontrol localhost" #: src/conf.c msgid "webcontrol_parms" msgstr "parms webcontrol" #: src/conf.c msgid "webcontrol_interface" msgstr "interfaccia webcontrol" #: src/conf.c msgid "webcontrol_auth_method" msgstr "metodo di autenticazione webcontrol" #: src/conf.c msgid "webcontrol_authentication" msgstr "autenticazione webcontrol" #: src/conf.c msgid "webcontrol_tls" msgstr "webcontrol tls" #: src/conf.c msgid "webcontrol_cert" msgstr "webcontrol cert" #: src/conf.c msgid "webcontrol_key" msgstr "chiave webcontrol" #: src/conf.c msgid "webcontrol_header_params" msgstr "parametri dell'intestazione webcontrol" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "minuti di blocco del controllo web" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "tentativi di blocco del controllo web" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "blocco controllo web max ips" #: src/conf.c msgid "stream_port" msgstr "porta stream" #: src/conf.c msgid "stream_localhost" msgstr "stream localhost" #: src/conf.c msgid "stream_auth_method" msgstr "metodo di stream stream" #: src/conf.c msgid "stream_authentication" msgstr "autenticazione stream" #: src/conf.c msgid "stream_tls" msgstr "stream tls" #: src/conf.c msgid "stream_header_params" msgstr "parametri dell'intestazione del flusso" #: src/conf.c msgid "stream_preview_scale" msgstr "scala di anteprima del flusso" #: src/conf.c msgid "stream_preview_newline" msgstr "anteprima stream newline" #: src/conf.c msgid "stream_preview_method" msgstr "metodo di anteprima del flusso" #: src/conf.c msgid "stream_quality" msgstr "qualità del flusso" #: src/conf.c msgid "stream_grey" msgstr "flusso grigio" #: src/conf.c msgid "stream_motion" msgstr "movimento del flusso" #: src/conf.c msgid "stream_maxrate" msgstr "flusso massimo" #: src/conf.c msgid "stream_limit" msgstr "limite di flusso" #: src/conf.c msgid "database_type" msgstr "tipo di database" #: src/conf.c msgid "database_dbname" msgstr "nome database db" #: src/conf.c msgid "database_host" msgstr "host del database" #: src/conf.c msgid "database_port" msgstr "porta del database" #: src/conf.c msgid "database_user" msgstr "utente del database" #: src/conf.c msgid "database_password" msgstr "password del database" #: src/conf.c msgid "database_busy_timeout" msgstr "timeout occupato del database" #: src/conf.c msgid "sql_log_picture" msgstr "foto di registro sql" #: src/conf.c msgid "sql_log_snapshot" msgstr "snapshot log sql" #: src/conf.c msgid "sql_log_movie" msgstr "film di registro sql" #: src/conf.c msgid "sql_log_timelapse" msgstr "timelapse log sql" #: src/conf.c msgid "sql_query_start" msgstr "inizio query sql" #: src/conf.c msgid "sql_query_stop" msgstr "arresto query sql" #: src/conf.c msgid "sql_query" msgstr "query sql" #: src/conf.c msgid "track_type" msgstr "tipo di traccia" #: src/conf.c msgid "track_auto" msgstr "traccia auto" #: src/conf.c msgid "track_port" msgstr "traccia porta" #: src/conf.c msgid "track_motorx" msgstr "traccia motorx" #: src/conf.c msgid "track_motorx_reverse" msgstr "traccia inversione motorx" #: src/conf.c msgid "track_motory" msgstr "traccia motory" #: src/conf.c msgid "track_motory_reverse" msgstr "traccia inversione motoria" #: src/conf.c msgid "track_maxx" msgstr "traccia maxx" #: src/conf.c msgid "track_minx" msgstr "traccia minx" #: src/conf.c msgid "track_maxy" msgstr "traccia maxy" #: src/conf.c msgid "track_miny" msgstr "segui miny" #: src/conf.c msgid "track_homex" msgstr "traccia homex" #: src/conf.c msgid "track_homey" msgstr "traccia casalingo" #: src/conf.c msgid "track_iomojo_id" msgstr "traccia ID idomoo" #: src/conf.c msgid "track_step_angle_x" msgstr "traccia passo angolo x" #: src/conf.c msgid "track_step_angle_y" msgstr "traccia angolo di passo y" #: src/conf.c msgid "track_move_wait" msgstr "traccia spostamento attesa" #: src/conf.c msgid "track_speed" msgstr "velocità della traccia" #: src/conf.c msgid "track_stepsize" msgstr "tenere traccia delle dimensioni" #: src/conf.c msgid "track_generic_move" msgstr "traccia mossa generica" #: src/conf.c msgid "camera" msgstr "telecamera" #: src/conf.c msgid "camera_dir" msgstr "dir camera" #: src/dbse.c msgid "Closing MySQL library" msgstr "Chiusura della libreria MySQL" #: src/dbse.c msgid "Closing MariaDB library" msgstr "Chiusura della libreria MariaDB" #: src/dbse.c msgid "Database closed" msgstr "Database chiuso" #: src/dbse.c msgid "Initializing database" msgstr "Inizializzazione del database" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "" "Impossibile connettersi al database MySQL %s sull'host %s con l'utente %s" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "L'errore MySQL era %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "" "Impossibile connettersi al database MariaDB %s sull'host %s con l'utente %s" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "L'errore MariaDB era %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "Apertura database %s" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "Impossibile aprire il database SQLite3 %s. Errore %d: %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "Impostazione del timeout di occupato su %d msec" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "Impostazione del timeout di occupato non riuscita. Errore %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "Connessione al database PostgreSQL ' %s' non riuscita: %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "Tipo di database %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "Esecuzione di query MySQL" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "La query MySQL non è riuscita %s codice di errore %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "" "Impossibile riconnettersi al database MySQL %s sull'host %s con errore MySQL " "dell'utente %sera %s" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "Riconnessione al database MySQL '%s' riuscita" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "" "dopo la riconnessione la query MySQL non è riuscita %s codice di errore %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "Esecuzione della query MariaDB" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "La query MariaDB non è riuscita %s codice di errore %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "Impossibile riconnettersi al database MariaDB %s sull'host %s con l'utente " "%s MariaDBl'errore era %s" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "Riconnessione al database MariaDB '%s' riuscita" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "" "dopo la riconnessione la query MariaDB non è riuscita %s codice di errore %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "Ricollegato al database PostgreSQL '%s'" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "Esecuzione di query PostgreSQL" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "Tentativo di riconnessione al database PostgreSQL '%s': %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "Query PGSQL non riuscita: [%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "Esecuzione di %s" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "Errore SQLite3 %d : %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "Ignorando la query sql vuota" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "Impossibile avviare il comando esterno ' %s'" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "Esecuzione del comando esterno ' %s'" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "Scrittura immagine su file: %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "Scrittura del filmato su file: %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "Immagine salvata su file: %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "Filmato salvato su file: %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "Impossibile inserire l'immagine nella pipa video" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "Impossibile creare il collegamento simbolico [ %s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "Errore durante la creazione del nome della pipe di anteprima %d %s" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "Errore durante la creazione della base nome file %d %s" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "Errore durante la creazione del nome di anteprima %d %s" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "CHIUSURA: file extpipe desc %d, stato errore %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "pclose return: %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "Fonte FPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "percorso del film: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "nessun accesso in scrittura alla directory di destinazione %s" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "percorso non trovato, tentativo di crearlo %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "errore durante l'accesso al percorso %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "Errore durante la specifica della riga di comando: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "pipe: %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt-> moviefps: %d" #: src/event.c msgid "popen failed" msgstr "popen fallito" #: src/event.c msgid "Using extpipe" msgstr "Utilizzando extpipe" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "Errore durante la scrittura nella pipe, errore di stato %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "pipe %s non già creato o chiuso" #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "Il contenitore ogg non è più supportato. Passare a mpeg4" #: src/event.c msgid "Running test of the various output formats." msgstr "Esecuzione di test dei vari formati di output." #: src/event.c msgid "Error opening context for movie output." msgstr "Errore durante l'apertura del contesto per l'output del filmato." #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffopen errore aperto durante la creazione del file (movimento) [ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "" "Il contenitore SWF per timelapse non è più supportato. Usando il contenitore " "mpg." #: src/event.c msgid "Timelapse using mpg codec." msgstr "Timelapse usando il codec mpg." #: src/event.c msgid "Events will be appended to file" msgstr "Gli eventi verranno aggiunti al file" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "Timelapse usando il codec mpeg4." #: src/event.c msgid "Events will be trigger new files" msgstr "Gli eventi attiveranno nuovi file" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffopen errore aperto durante la creazione del file (timelapse) [ %s]" #: src/event.c msgid "Error encoding image" msgstr "Errore durante la codifica dell'immagine" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "Impossibile allocare memoria per il nome codec" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "La frequenza dei fotogrammi specificata è troppo alta per il tipo di filmato " "ffmpeg specificato.Scegli un contenitore ffmpeg diverso o framerate " "inferiore." #: src/ffmpeg.c msgid "Error setting base file name" msgstr "Errore durante l'impostazione del nome del file di base" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "Errore durante l'impostazione dell'appendice timelapse per il codec %s" #: src/ffmpeg.c msgid "Error setting file name" msgstr "Errore durante l'impostazione del nome del file" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "il valore dell'opzione codec %s non è supportato" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "Impossibile ottenere il codec" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "Errore durante l'invio del frame per la codifica: %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "" "Il pacchetto di ricezione ha generato EAGAIN che restituisce -2 codice: %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "Errore durante la ricezione del video del pacchetto codificato: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "Errore durante la codifica del video: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "Errore durante la codifica del video" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "" "PTS % Base PTS % ms intervallo % base dei tempi %d- " "%d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "CATTIVO TEMPISMO!! Frame saltato." #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "" "PTS % Base PTS % ms intervallo % base dei tempi %d- " "%d Modifica%d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s codec vbr / crf / bit rate: %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "Il codec preferito %s è stato inserito nella lista nera: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "Codec %s non trovato" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "Utilizzando il codec %s" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "Impossibile allocare il flusso" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "Impossibile allocare il codec!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "Basso fps. Codifica di% d frame in un contenitore% d frame." #: src/ffmpeg.c msgid "Unable to set quality" msgstr "Impossibile impostare la qualità" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "FPS segnalati supportati %d / %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "Impossibile aprire il codec %s" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "Impossibile copiare i parametri del decodificatore !: %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "impossibile allocare frame" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "impossibile allocare i buffer %s" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "errore durante l'apertura del file %s" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "Autorizzazione negata. %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "Errore durante l'apertura del file %s" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "Impossibile scrivere l'intestazione ffmpeg %s" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "Errore durante l'accesso alla modalità di svuotamento: %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "Errore durante lo svuotamento del codec: %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "Errore durante la scrittura del riquadro video drenante" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "Errore durante la codifica dell'immagine" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "Errore durante la scrittura del frame video" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "pacchetto_v_copia: %s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "Errore durante la scrittura del frame video: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "Contesto RTSP non disponibile." #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "fotocamera rtsp non pronta per il pass-through." #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "modalità pass-through abilitata. Passare al contenitore MP4." #: src/ffmpeg.c msgid "Could not get codec!" msgstr "Impossibile ottenere il codec!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "Impossibile copiare i parametri del codec" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "Pass-through disabilitato. ffmpeg troppo vecchio" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "Flusso pass-through aperto" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "ffmpeg versione libavcodec %d. %d. %d versione libavformat %d. %d. %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "registro lockmgr av fallito ( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "Nessuna funzionalità ffmpeg inclusa" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "" "ripristino del registro av lockmgr non riuscito al momento della pulizia" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "Impossibile allocare il contesto di output" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "Impossibile impostare il passthru!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "Impossibile impostare il flusso" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "Errore durante lo svuotamento del codec" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "Tentativi eccessivi di svuotare il pacchetto bufferizzato" #: src/ffmpeg.c msgid "Buffered packet" msgstr "Pacchetto tamponato" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s: dato che il buffer jpeg era troppo piccolo" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "Dimensioni dell'immagine JPEG non valide" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "Dimensione immagine JPEG %dx %d, JPEG era %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "" "Ricevuto evento di richiamata del controllo telecamera imprevisto, 0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "" "Un frame rate elevato può causare problemi con l'esposizione delle immagini" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "" "Se l'esposizione automatica non funziona, provare un frame rate inferiore." #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "Impossibile creare il componente della fotocamera MMAL %s" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "La videocamera MMAL %s non ha porte di uscita" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "Impossibile abilitare la porta di controllo: errore %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "Installazione MMAL senza padding non riuscita" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "impossibile impostare il formato video della videocamera" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "il componente della fotocamera non può essere abilitato" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "Componente della fotocamera MMAL creato" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "Creazione del pool buffer della fotocamera MMAL non riuscita" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "Creazione coda coda buffer MMAL non riuscita" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "Impossibile ottenere un buffer richiesto %d dalla coda del pool" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "Impossibile inviare un buffer alla porta ( %d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "" "MMAL Avvio thread della telecamera ... per la telecamera ( %s) di %dx %d a " "%d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "i parametri della fotocamera non possono essere assegnati" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "" "Abilitazione della porta di acquisizione della fotocamera MMAL non riuscita" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "Avvio acquisizione fotocamera MMAL non riuscito" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "Pulizia della fotocamera MMAL" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %d flag %08x dimensione %d / %d a %08x, dimensione img = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "Impossibile restituire un buffer alla porta video della videocamera" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "Ridimensionamento del buffer di pre acquisizione in %d elementi" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "File ID processo rimosso (file pid)." #: src/motion.c msgid "Error removing pid file" msgstr "Errore durante la rimozione del file pid" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "File di registro di chiusura ( %s)." #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "Rilevato movimento - inizio dell'evento %d." #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "Aggiunti %d fillerframes al film" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "" "Impossibile determinare il tipo di telecamera (MMAL, Netcam, V4L2, BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "Apertura del file della maschera di privacy" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "Apertura file maschera privacy ad alta risoluzione" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "Errore durante l'apertura del file maschera %s" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "Impossibile leggere l'immagine sulla privacy della maschera. Funzione di " "privacy maschera disabilitata." #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "Maschera file privacy \" %s \" caricata." #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "Scala di testo non valida. Regolato a %d" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "Fotocamera %d avviata: rilevazione movimento %s" #: src/motion.c msgid "Disabled" msgstr "Disabilitato" #: src/motion.c msgid "Enabled" msgstr "Abilitato" #: src/motion.c msgid "Pass-through processing disabled." msgstr "Elaborazione pass-through disabilitata." #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "Dimensioni di configurazione non valide %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "Utilizzo delle dimensioni predefinite %dx %d" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "La larghezza dell'immagine ( %d) richiesta non è modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "" "Regolazione della larghezza al multiplo successivo più alto di 8 ( %d)." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "L'altezza dell'immagine ( %d) richiesta non è modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "Regolazione dell'altezza al successivo multiplo superiore di 8 ( %d)." #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "Impossibile recuperare l'immagine iniziale dalla fotocamera" #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "" "Il movimento continua usando larghezza e altezza dai file di configurazione" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "Motion supporta solo larghezza e altezza modulo 8" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "La larghezza dell'immagine ( %d) o l'altezza ( %d) richieste non sono modulo " "8." #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Motion supporta solo larghezza e altezza maggiori o uguali al 64 %dx %d" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "Substream non disponibile. Dimensioni dell'immagine non modulo 16." #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "" "il formato immagine webp non è disponibile, non è possibile tornare a jpeg" #: src/motion.c msgid "Error capturing first image" msgstr "Errore durante l'acquisizione della prima immagine" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "Apertura del dispositivo di loopback video per immagini normali" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "Impossibile aprire il loopback video per le immagini normali" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "Apertura del dispositivo di loopback video per i filmati" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "Impossibile aprire il loopback video per i filmati" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "" "Lettura dell'immagine maschera non riuscita. Funzione maschera disabilitata." #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "File maschera \" %s \" caricato." #: src/motion.c msgid "Emulating motion" msgstr "Emulazione del movimento" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "Rilevato movimento nell'area %d." #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "Nuovo tentativo fino a connessione riuscita con la fotocamera" #: src/motion.c msgid "Camera has become available." msgstr "La fotocamera è diventata disponibile." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "Riavvio del movimento.\n" "La larghezza dell'immagine (%d) o l'altezza (%d) richieste non sono modulo 8." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Riavvio del movimento.\n" "Motion supporta solo larghezza e altezza maggiori o uguali a 64 %dx%d" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "Riavvio del movimento.\n" "L'altezza o la larghezza è cambiata sulla fotocamera." #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "Riavvio del movimento.\n" "L'alta risoluzione è cambiata sulla fotocamera." #: src/motion.c msgid "Video signal re-acquired" msgstr "Segnale video riacquistato" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "" "Errore irreversibile del dispositivo video - Chiusura del dispositivo video" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "" "Riavvio del thread Motion per reinizializzare tutti i buffer di immagine" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "Segnale video perso - Aggiunta di un'immagine grigia" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "" "Segnale video ancora perso - Tentativo di chiudere il dispositivo video" #: src/motion.c msgid "Lightswitch detected" msgstr "Interruttore luci rilevato" #: src/motion.c msgid "Switchfilter detected" msgstr "Rilevato filtro interruttore" #: src/motion.c msgid "micro-lightswitch!" msgstr "micro-lightswitch!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "Fine dell'evento %d" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "Modifiche non elaborate: %5d - modifiche dopo ' %s': %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr "- etichette: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "Modifiche: %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr "- livello di rumore: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr "- soglia: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "Argomento modalità timelapse non valido ' %s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%: s Impostazione predefinita della modalità timelapse manuale" #: src/motion.c msgid "Thread exiting" msgstr "Discussione in uscita" #: src/motion.c msgid "Motion going to daemon mode" msgstr "Movimento in modalità demone" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "" "Esce dal movimento, impossibile creare il file ID processo (file pid) %s" #: src/motion.c msgid "Could not change directory" msgstr "Impossibile cambiare la directory" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "File ID processo creato %s. L'ID processo è %d" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "" "Gli ID Camara non sono univoci o hanno valori superiori a 32.000. Tornando " "anumeri di thread" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2: disponibile" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2: non disponibile" #: src/motion.c msgid "bktr : available" msgstr "bktr: disponibile" #: src/motion.c msgid "bktr : not available" msgstr "bktr: non disponibile" #: src/motion.c msgid "webp : available" msgstr "webp: disponibile" #: src/motion.c msgid "webp : not available" msgstr "webp: non disponibile" #: src/motion.c msgid "mmal : available" msgstr "mmal: disponibile" #: src/motion.c msgid "mmal : not available" msgstr "mmal: non disponibile" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg: disponibile" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg: non disponibile" #: src/motion.c msgid "mysql : available" msgstr "mysql: disponibile" #: src/motion.c msgid "mysql : not available" msgstr "mysql: non disponibile" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB: disponibile" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB: non disponibile" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3: disponibile" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3: non disponibile" #: src/motion.c msgid "pgsql : available" msgstr "pgsql: disponibile" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql: non disponibile" #: src/motion.c msgid "nls : available" msgstr "nls: disponibile" #: src/motion.c msgid "nls : not available" msgstr "nls: non disponibile" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "Utilizzo del livello di registro predefinito ( %s) ( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "Registrazione su file ( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "Esce dal movimento, impossibile creare il file di registro %s" #: src/motion.c msgid "Logging to syslog" msgstr "Registrazione su syslog" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "Motion %s avviato" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "Utilizzo del tipo di registro predefinito ( %s)" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "Utilizzo del tipo di registro ( %s) livello di registro ( %s)" #: src/motion.c msgid "Motion running as daemon process" msgstr "Movimento in esecuzione come processo daemon" #: src/motion.c msgid "Motion running in setup mode." msgstr "Movimento in esecuzione in modalità impostazione." #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "ID videocamera: %d proviene da %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "ID videocamera: %d Nome videocamera: %s Servizio: %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "ID videocamera: %d Nome videocamera: %s Dispositivo: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "" "Il numero di porta dello stream %d per il thread %d è in conflitto con la " "porta di controllo" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "La funzione di streaming per il thread %d è disabilitata." #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "" "Il numero di porta dello stream %d per il thread %d è in conflitto con il " "thread %d" #: src/motion.c msgid "Restarting motion." msgstr "Riavvio del movimento." #: src/motion.c msgid "Motion restarted" msgstr "Movimento riavviato" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "Discussione %d - Timeout watchdog. Prova di fare un riavvio grazioso" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "" "Discussione %d - Il timeout del watchdog NON è stato riavviato, uccidendolo!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "Discussione %d - Pulizia del filo." #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "" "Discussioni DEBUG-1 che eseguono %d animazioni che eseguono %d, finitura %d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "In attesa che i thread finiscano, pid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "Thread di movimento %d riavvio" #: src/motion.c msgid "Threads finished" msgstr "Discussioni finite" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "Terminazione del movimento" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "URL non valido. Impossibile analizzare i valori." #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "Discussione gestore fotocamera [ %d] avviata" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "Chiusura del socket netcam quando il tempo di mantenimento è scaduto (la " "telecamera ha inviato il campo di chiusura). UNla riconnessione dovrebbe " "avvenire." #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "riapertura della videocamera (non streaming)" #: src/netcam.c msgid "camera re-connected" msgstr "fotocamera ricollegata" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "Intestazione immagine non riconosciuta ( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "Errore nell'intestazione ( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "riapertura della videocamera (streaming)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "Errore durante l'acquisizione dell'immagine jpeg" #: src/netcam.c msgid "Trying to re-connect" msgstr "Cercando di riconnetterti" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "gestore videocamera Netcam: fine impostato, uscita" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "Nessuna risposta dal gestore della fotocamera: deve essere già morto" #: src/netcam.c msgid "called with no data in buffer" msgstr "chiamato senza dati nel buffer" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "Network Camera che inizia per la telecamera ( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "Proxy netcam non valido ( %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "Nome utente / password non consentiti su un URL proxy" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "Servizio netcam non valido ' %s'" #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "URL netcam non valido per la telecamera ( %s)" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "Il parametro http Netcam ' %s' viene convertito in flag: HTTP / 1.0: %s " "HTTP / 1.1: %s Keep-Vivo %s." #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "ora chiama netcam setup html ()" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "ora chiama netcam setup ftp" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "ora chiama il file di installazione di netcam ()" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "ora chiama netcam setup mjpg ()" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "Servizio netcam '%s' non valido: deve essere mjpeg, ftp, mjpg o jpeg." #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "Impossibile tentare di leggere la prima immagine - retval: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "errore di decompressione libjpeg sul primo fotogramma - rinunciare!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "Larghezza / altezza ( %dx %d) deve essere multipli di 8" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "Errore durante l'avvio del thread del gestore della telecamera [ %d]" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "recv fallito in ftp ottenere di più" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "Risposta del server: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "invio fallito nell'invio ftp dell'utente" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "invio fallito in ftp send passwd" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "invio fallito in ftp esci" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "gethostbyname non riuscito in ftp connect" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "discordanza dell'indirizzo gethostbyname in ftp connect" #: src/netcam_ftp.c msgid "socket failed" msgstr "presa fallita" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "Impossibile creare una connessione" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "Server FTP che richiede ACCT su anonimo" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "impostazione opzione socket SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "invio fallito in ftp ottenere connessione" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "Risposta non valida a PASV" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "Impossibile creare una connessione dati" #: src/netcam_ftp.c msgid "bind failed" msgstr "vincolo fallito" #: src/netcam_ftp.c msgid "listen failed" msgstr "ascolto fallito" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "invio fallito in ftp get socket" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "accetta in ftp get socket" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "recv fallito nella lettura ftp" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "ftp get socket fallito" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "Errore durante l'invio di TIPO I al server ftp" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "token non corretto Content-Length ma valore %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "Lunghezza contenuto %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "Tipo di contenuto %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "" "Errore durante la lettura dell'intestazione dell'immagine, modalità " "streaming (1). Intestazione nulla." #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "" "Errore durante la lettura dell'intestazione dell'immagine, modalità " "streaming (1). Intestazione sconosciuta ' %s'" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "Errore durante la lettura dell'intestazione dell'immagine (2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "Intestazione non JPEG" #: src/netcam_http.c msgid "Content-Length 0" msgstr "Lunghezza contenuto 0" #: src/netcam_http.c msgid "Found image header record" msgstr "Trovato record di intestazione dell'immagine" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "Errore durante l'invio della richiesta di 'connessione' " #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "Prima intestazione ricevuta (' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "Errore durante la lettura della prima intestazione ( %s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "Codice risultato HTTP %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "" "Rimosso il flag Keep-Alive di netcam a causa di una connessione HTTP " "apparentemente chiusa." #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "Videocamera non in streaming (set keep-alive)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "Videocamera non streaming (keep-alive non impostata)" #: src/netcam_http.c msgid "Streaming camera" msgstr "Videocamera streaming" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "Stringa limite [ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "Stringa di confine non trovata nell'intestazione" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "" "Streaming camera probabilmente usando i blocchi MJPG, considera l'utilizzo " "di mjpg: //netcam url." #: src/netcam_http.c msgid "Unrecognized content type" msgstr "Tipo di contenuto non riconosciuto" #: src/netcam_http.c msgid "Content-length present" msgstr "Contenuto presente" #: src/netcam_http.c msgid "Content-length 0" msgstr "Lunghezza contenuto 0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "Trovato Conn: chiudi intestazione (' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "" "Ricevute le intestazioni \"Connessione: Keep-Alive\" e \"Connessione: chiudi" "\".Il movimento rimuove keepalive." #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "" "Ricevute le intestazioni \"Connessione: Keep-Alive\" e \"Connessione: chiudi" "\".Il movimento continua invariato." #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "Ricevuto un campo Keep-Alive in questo set di intestazioni." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "Nessuna intestazione \"Connessione: keep-alive\" né \"Connessione: chiusura" "\" ricevuta. \n" " Il movimento rimuove keepalive." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "Nessuna intestazione \"Connessione: keep-alive\" né \"Connessione: chiusura" "\" ricevuta. \n" " Il movimento continua invariato." #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "Rimosso il flag Keep-Alive di netcam perché è stata ricevuta l'intestazione " "\"Connessione: chiudi\". \n" " Netcam non supporta Keep-Alive. Il movimento continua in modalità non keep-" "alive." #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "Keep-Alive ha raggiunto la fine del periodo valido. \n" " Motion chiuderà netcam, quindi riprenderà Keep-Alive con un nuovo socket." #: src/netcam_http.c msgid "disconnect" msgstr "disconnect" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo () non riuscito ( %s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "disconnettere netcam (1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "disconnettere netcam poiché keep-alive non impostato." #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "senza keepalive, il tentativo di creare socket non è riuscito." #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "senza keepalive, nuovo socket creato fd %d" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "con keepalive set, socket non valido. Potrebbe essere la prima volta. Creare " "ununo nuovo fallito." #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "" "con keepalive set, socket non valido. Questa potrebbe essere la prima volta, " "creato un nuovouno con fd %d" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "COSÃŒ KEEPALIVE è %s" #: src/netcam_http.c msgid "ON" msgstr "SU" #: src/netcam_http.c msgid "OFF" msgstr "OFF" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "SO KEEPALIVE impostato su socket." #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "fcntl (1) sul socket" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "fcntl (2) sul socket" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "connect () non riuscito ( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "disconnettere netcam (4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "timeout su connect ()" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "disconnettere netcam (2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "getockopt dopo la connessione" #: src/netcam_http.c msgid "connect returned error" msgstr "errore restituito connessione" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "disconnettere netcam (3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "buffer di espansione da [ %d / %d] a [ %d / %d] byte." #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "" "Limite di divisione potenziale: %d caratteri cancellati, %d riposizionato" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "recv () non riesce dopo la stringa di limite" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "lasciando netcam collegato." #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "per provare a connettersi, tempo # %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "Impossibile aprire la fotocamera: controlla la tua configurazione e che " "netcamera è online" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "Errore durante la lettura della prima intestazione - riprovare" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "" "Impossibile leggere la prima intestazione della fotocamera - rinunciare per " "ora" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "Netcam ha flag: HTTP / 1.0: %s HTTP / 1.1: %s Keep-Alive %s." #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "" "Rimosso il flag keepalive di netcam a causa del set di proxy. Il proxy non è " "compatibile conKeep-Alive." #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "" "Impossibile leggere la prima intestazione del flusso. Rinunciare per ora" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "collegato, continuando a leggere l'immagine." #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "Errore di lettura, tentativo di riconnettersi." #: src/netcam_http.c msgid "lost the cam." msgstr "perso la videocamera." #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "Buffer riempito con [ %d] byte dalla rete." #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "Leggi i byte di intestazione [ %d / %d]." #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "Intestazione non valida ricevuta, riconnessione" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "Leggi [ %d / %d] byte pezzo, [ %d / %d] totale" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "Chunk completato, buffer utilizzato [ %d] byte." #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "Immagine completata, buffer utilizzato [ %d] byte." #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "collegato, continuando a leggere e decodificare blocchi MJPG." #: src/netcam_http.c msgid "Begin" msgstr "Inizio" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "errore stat ( %s)" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]! = last st mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "in attesa di un nuovo timeout dell'immagine del file" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "ritardare l'attesa di una nuova immagine del file" #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "elaborazione nuova immagine file - st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "errore aperto ( %s): %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "errore di lettura ( %s): %d" #: src/netcam_http.c msgid "End" msgstr "Fine" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> file-> percorso %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "Dati insufficienti da netcam." #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> errore jpeg %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "*** nuovo ritardo della foto riuscito ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "errore jpeg %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "elaborazione immagine jpeg - lunghezza contenuto %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "Mancata corrispondenza di larghezza / altezza della telecamera con immagine " "JPEG - %dx %d prevista, JPEG %dx %dretval %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s: array di pacchetti ridimensionato su %d" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s: pacchetto copia av: %s, Interruzione: %s" #: src/netcam_rtsp.c msgid "True" msgstr "Vero" #: src/netcam_rtsp.c msgid "False" msgstr "falso" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: Ignora pacchetto con dati non validi" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: Errore frame di registrazione: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "Ignorando il pacchetto con dati non validi" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "Pacchetto di decodifica errore: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "" "%s: errore durante il trasferimento dell'hardware decodificato alla memoria " "di sistema" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "Errore durante l'invio del pacchetto al codec: %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "Errore nella decodifica del pacchetto video: copia nel buffer" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: Dispositivi HW:" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s (disponibile)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s (non implementato)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s: decoder netcam %s disabilitato." #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "Impossibile ottenere il formato pix vaapi" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "Impossibile ottenere il formato cuda pix" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s: interrotto." #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: fallito" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s: il decoder %s non ha funzionato." #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "%s: Ignorando e rimuovendo il decoder richiesto dall'utente %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s: inizializzazione del decodificatore vaapi" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: impossibile trovare il dispositivo vaapi hw" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s: inizializzazione del decoder cuda" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: impossibile trovare il dispositivo cuda hw" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s: inizializzazione del decodificatore" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s: utilizzo del decodificatore %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: decoder aperto" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s: timeout della lettura della telecamera ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s: timeout fotocamera ( %s)" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "Impossibile allocare swsframe in." #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "Impossibile allocare swsframe." #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "Impossibile allocare il contesto di ridimensionamento." #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "Errore durante la determinazione della dimensione del frame out" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "Errore durante l'allocazione dell'immagine in: %s" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "Errore durante l'allocazione dell'immagine: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "Errore ridimensionamento / riformattazione: %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "Errore durante l'inserimento del frame nel buffer di output: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s: Interrotto" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: frame letto av: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: tentativi eccessivi di ottenere dati dalla fotocamera %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "" "%s: velocità di acquisizione non specificata nei parametri netcam. Usando %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s: velocità di acquisizione non specificata nei parametri netcam. Usando il " "frame rate %d" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "La telecamera di rete sta inviando immagini in modo diverso" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "dimensione di quanto specificato nella configurazione e anche a" #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "diverso formato immagine. L'immagine è" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "transcodificato in YUV420P e nelle dimensioni richieste" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "nel file di configurazione. Se possibile, cambiare netcam in" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "essere nel formato YUV420P e le dimensioni richieste nel file" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "configurazione per ridurre eventualmente l'utilizzo della CPU." #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "dimensione rispetto a quella specificata nel file di configurazione." #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "L'immagine viene transcodificata nella dimensione" #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "richiesto nella configurazione. Se possibile, cambia" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "netcam o configurazione per indicare la stessa dimensione" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "per ridurre eventualmente l'utilizzo della CPU." #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "Netcam: %dx %d => Config: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "L'immagine inviata è essere" #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "convertito in YUV420P. Se possibile, cambiare netcam" #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "" "formato immagine su YUV420P per ridurre eventualmente l'utilizzo della CPU." #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: impostazione rtsp/rtmp" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: impostazione del formato di input mjpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: impostazione del formato di input video4linux2" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: Configurazione del file del filmato" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s: Configurazione di %s" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: opzione: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "Configurazione di v4l2 tramite netcam" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "Configurazione file tramite netcam" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "Configurazione di %s tramite netcam" #: src/netcam_rtsp.c msgid "highres" msgstr "alta risoluzione" #: src/netcam_rtsp.c msgid "norm" msgstr "norma" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "Impostazione del flusso %s." #: src/netcam_rtsp.c msgid "Unknown" msgstr "Sconosciuto" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "Stream copiato per pass-through" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "Percorso null passato per la connessione" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s: impossibile aprire la telecamera ( %s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s: videocamera aperta ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s: impossibile trovare informazioni sullo stream: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s: impossibile aprire il contesto del codec: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s: le dimensioni dell'immagine della videocamera non sono valide" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s: impossibile allocare frame." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s: impossibile copiare lo stream per il pass-through." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s: impossibile leggere la prima immagine" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s: videocamera ( %s) collegata" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s: la velocità di acquisizione della Netcam è %d." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s: la sorgente della fotocamera è %d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s: impossibile determinare l'FPS della sorgente della telecamera." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s: la velocità di acquisizione è inferiore all'FPS della fotocamera." #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s: si verificheranno errori di decodifica." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "" "%s: si consiglia una velocità di acquisizione leggermente maggiore dell'FPS " "della fotocamera." #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s: ricollegamento con la fotocamera ...." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s: la fotocamera non si è riconnessa." #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s: verifica della telecamera ogni 10 secondi." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s: thread del gestore fotocamera [ %d] avviato" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s: loop gestore terminato." #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s: errore durante l'avvio del thread del gestore" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s: in attesa della prima immagine dal gestore." #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "impossibile creare il contesto rtsp" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "impossibile creare il contesto elevato rtsp" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "Nessun supporto FFmpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s: spegnimento della telecamera di rete." #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s: nessuna risposta dal thread del gestore." #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "Risoluzione normale: spegnimento completo." #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "Alta risoluzione: spegnimento completo." #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "Impossibile impostare EXIF ​​su Webp Chunk" #: src/picture.c msgid "libwebp version error" msgstr "errore versione libwebp" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "errore di allocazione del buffer di immagine libwebp" #: src/picture.c msgid "libwebp image compression error" msgstr "errore di compressione dell'immagine libwebp" #: src/picture.c msgid "unable to assemble webp image" msgstr "impossibile assemblare l'immagine webp" #: src/picture.c msgid "unable to save webp image to file" msgstr "impossibile salvare l'immagine webp su file" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "Impossibile scrivere l'immagine nel file %s - controlla i diritti di accesso " "alla directory di destinazione \n" "Il thread sta per finire a causa di questo errore fatale" #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "Impossibile scrivere l'immagine nel file %s" #: src/picture.c msgid "Error getting PGM vars." msgstr "Errore durante l'ottenimento delle var PGM." #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "Questo non è un file pgm, inizia con ' %s'" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "Magic %s: Larghezza %s(%d): Altezza %s(%d): MaxVal: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "Impossibile leggere i dati dell'immagine dal file pgm" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "" "Il file maschera specificato non ha le stesse dimensioni dell'immagine della " "telecamera." #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "" "Tentativo di ridimensionare l'immagine della maschera da %dx %d a %dx %d" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "" "impossibile scrivere il file maschera %s - controlla i diritti di accesso " "alla directory di destinazione" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "impossibile scrivere il file maschera %s" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "Impossibile scrivere la maschera predefinita come file pgm" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "Creazione maschera vuota %s \n" "Modifica questo file ed esegui nuovamente il movimento per abilitare la " "funzione maschera" #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "L'opzione di configurazione \"ruota \" non è un multiplo di 90: %d" #: src/track.c msgid "internal error" msgstr "errore interno" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "errore interno, %hu non è un tipo di traccia noto" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "porta %s dev fd %i, comando %hu motore %hu dati %hu" #: src/track.c msgid "Status byte timeout!" msgstr "Timeout byte di stato!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "Prova ad aprire il dispositivo seriale %s" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "Impossibile aprire il dispositivo seriale %s" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "Impossibile inizializzare il dispositivo seriale %s" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "Dispositivo seriale aperto %s e inizializzazione, fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "Nessun dispositivo %s ancora avviato, provando stepper center ()" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "impossibile inizializzare il dispositivo stepper su %s, fd [ %i]." #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "riuscito, dispositivo avviato %s, fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "INVIA porta %s dev fd %i, comando %hu motore %hu dati %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "Comando return %d" #: src/track.c msgid "Problem opening servo!" msgstr "Problema durante l'apertura del servo!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d, cent-> y %d, inversione %d, reversey %d manuale %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d valore fuori range! ( %d - %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d valore fuori range! ( %d - %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "X offset %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "X cent-> x %d, cent-> y %d, reverseex %d, reversey %d motorx %d data %d " "comando%d" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Offset Y %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Y cent-> x %d, cent-> y %d, reverseex %d, reversey %d motory %d data %d " "comando%d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "Offset X %d, Offset Y %d, Posizione x %d. posizione y %d, inversione %d, " "reversey%d, dimensioni ridotte %d" #: src/track.c msgid "Return byte timeout!" msgstr "Restituisce il timeout dei byte!" #: src/track.c msgid "Unable to set camera speed" msgstr "Impossibile impostare la velocità della fotocamera" #: src/track.c msgid "succeed" msgstr "avere successo" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "" "Impossibile ripristinare la telecamera pwc nella posizione iniziale! " "Ragionare" #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "VIDIOCPWCMPTGRANGE non riuscito" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "" "Impossibile eseguire la panoramica / inclinazione della videocamera pwc! " "Ragionare" #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "" "Impossibile ripristinare la telecamera UVC sulla posizione iniziale! " "Ragionare" #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "Ripristino della videocamera UVC sulla posizione iniziale" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl querycontrol" #: src/track.c msgid "Getting camera range" msgstr "Ottenere la gamma di telecamere" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "" "PARAM INGRESSO ABS pan min %d, pan max %d, inclinazione min %d, inclinazione " "max %d" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "PARAM INGRESSO ABS X Angelo %d, Y Angelo %d" #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "Per SET ABS, spostare X %d, spostare Y %d" #: src/track.c msgid "Failed to move UVC camera!" msgstr "Impossibile spostare la videocamera UVC!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "Trovato MINMAX = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "Prima dell'ABS Y Angelo: x = %d, Y = %d," #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "Dopo ABS Y Angelo: x = %d, Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "" "Per SET REL pan min %d, pan max %d, inclinazione min %d, inclinazione max %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "Per SET REL track pan Angel %d, inclinazione traccia Angel %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "Per SET REL, spostare X %d, spostare Y %d" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, controllo S = %d, Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, controllo S = %d, Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "Prima di REL Y Angelo: x = %d, Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "Dopo REL Y Angel: x = %d, Y = %d" #: src/translate.c msgid "Language: English" msgstr "Lingua inglese" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "Impossibile allocare %llu byte di memoria!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "" "Avvertimento! La funzione %s tenta di ridimensionare il blocco di memoria da " "%p a 0 byte!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "Impossibile ridimensionare il blocco di memoria all'offset da %p a %llu byte " "(funzione %s)!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "Problema durante la creazione della directory %s" #: src/util.c #, c-format msgid "creating directory %s" msgstr "creazione della directory %s" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "Errore durante l'apertura del file %s con la modalità %s" #: src/util.c msgid "Error closing file" msgstr "Errore durante la chiusura del file" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbeventid} non è supportato. Usa evento." #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "parola chiave identificatore di formato non valido %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "Impossibile impostare il nome thread %s" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "" "Versione FFMPEG troppo vecchia. Disabilitazione dell'elaborazione pass-" "through." #: src/util.c msgid "pass-through enabled." msgstr "passaggio abilitato." #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "Errore durante l'impostazione del parametro >%s<" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "Analizzato: >%s< >%s<" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "Parsed: >censurato< >censurato<" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "Errore durante l'analisi dei controlli parm nm: %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "Errore durante l'analisi dei controlli parm vl: %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "Errore durante l'impostazione della temperatura: %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "Errore durante l'analisi dei controlli: %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "Analisi: %s" #: src/util.c msgid "Parsing: " msgstr "Analisi: " #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "Errore durante l'analisi dei controlli: %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "Errori %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "Nuovi parametri della netcam: %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "Nuovi parametri alti della netcam: %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "Nuovi parametri video: %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "Nuovi parametri dell'intestazione del controllo web: %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "Nuovi parametri dell'intestazione del controllo web: " #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "Nuovi parametri dell'intestazione del flusso: %s" #: src/util.c msgid "New stream_header_params: " msgstr "Nuovi parametri dell'intestazione del flusso: " #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "Errore di programmazione. Elemento di configurazione sconosciuto: %s " #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE Errore durante l'impostazione della tonalità [ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "a [ %d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE Errore nell'acquisizione della tonalità" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT Errore durante l'impostazione della saturazione [ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT Errore durante l'acquisizione della saturazione" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT Errore impostazione contrasto [ %d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT Errore nell'acquisizione del contrasto" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "Luminosità METEORSBRIG [ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIG ottiene luminosità" #: src/video_bktr.c msgid "Not implemented" msgstr "Non implementato" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "Ingresso dispositivo %d fuori intervallo (0-4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d non valido -Creare composito %d" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "" "BT848SFMT, Impossibile impostare il formato di input, riprovare con " "l'impostazione predefinita" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "BT848SFMT, Impossibile impostare il formato di input né predefinito" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "Impossibile impostare la geometria" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "a [ %d / %d] Norm %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "Frequenza non valida [%ld] per ingresso sorgente [%i]" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "Frequenza [%ld] Ingresso sorgente [%i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "imposta input [ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "imposta il formato di input [ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "imposta geometria [ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "Frequenza impostata (non ancora implementata" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "Buffer di dimensionamento su 3x" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "Buffer di dimensionamento su 3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap non riuscito" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "METEORCAPTUR utilizzando il metodo singolo Errore nella cattura" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "Errore durante l'acquisizione utilizzando il metodo singolo" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "Impossibile trovare il dispositivo video" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "Chiusura del dispositivo video %s" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "Ancora %d utenti del dispositivo video %s, quindi non lo chiudiamo ora" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "la larghezza dell'immagine di configurazione ( %d) non è modulo 8" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "l'altezza dell'immagine di configurazione ( %d) non è modulo 8" #: src/video_bktr.c msgid "Stopping capture" msgstr "Interruzione dell'acquisizione" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "" "Riutilizzo degli input [ %s] [ %d, %d] Cambia metodo di acquisizione METEOR " "CAP SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "VIDEO PALETTE YUV420P impostazione imgs.size norm e imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "apri il dispositivo video %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "apri il dispositivo di sintonizzazione %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "Immagine corrotta ... continua" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "Posizione SOI regolata da %d byte." #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "chiamando cleanup mmalcam" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "chiamando netcam cleanup" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "chiamando netcam rtsp cleanup" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "Pulizia del dispositivo V4L2" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "Pulizia del dispositivo BKTR" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "" "Nessuna pulizia del dispositivo della fotocamera (MMAL, Netcam, V4L2, BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "Apertura cam MMAL" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "Impossibile aprire la cam MMAL" #: src/video_common.c msgid "Opening Netcam" msgstr "Apertura di Netcam" #: src/video_common.c msgid "Netcam failed to open" msgstr "Impossibile aprire Netcam" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Apertura di Netcam RTSP" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Impossibile aprire Netcam RTSP" #: src/video_common.c msgid "Opening V4L2 device" msgstr "Apertura del dispositivo V4L2" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "Impossibile aprire il dispositivo V4L2" #: src/video_common.c msgid "Opening BKTR device" msgstr "Apertura del dispositivo BKTR" #: src/video_common.c msgid "BKTR device failed to open" msgstr "Impossibile aprire il dispositivo BKTR" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "Nessun dispositivo fotocamera specificato (MMAL, Netcam, V4L2, BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "Impossibile aprire ' %s'" #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "Errore durante la specifica del buffer: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "Buffer di apertura: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "Buffer di lettura: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "trovato dispositivo video ' %s' %d" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "%s aperti come output di tubi" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "Apertura %s in caso di errore nell'output della pipe" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "Specifiche del tubo originale" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "Specifiche del tubo proposte" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "Specifiche finali del tubo" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "Nessun controllo trovato per il dispositivo" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "--------- --------- Controlli" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr "Nome e intervallo ID V4L2" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "Errore durante il ripristino del valore utente" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "Lasciando il controllo %s \"%s\" impostato su %d" #: src/video_v4l2.c msgid "Device not ready" msgstr "Dispositivo non pronto" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "Impostare il controllo \" %s \" sul valore %d" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "impostazione del controllo %s \"%s\" su %d non riuscita." #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "" "Il valore dell'opzione di controllo %s %s è inferiore al minimo. Usando il " "minimo %d " #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "" "Il valore dell'opzione di controllo %s %s è superiore al massimo. " "Utilizzando il massimo %d " #: src/video_v4l2.c msgid "control type not supported yet" msgstr "tipo di controllo non ancora supportato" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "Impossibile interrogare l'input %d. VIDIOC ENUMINPUT, se si utilizza un " "input di modifica WEBCAMvalore in conf di -1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "Nome = \" %s \", digitare 0x %08X, stato %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "Nome = \" %s \", - TUNER" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "Nome = \" %s \" - FOTOCAMERA" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "Errore durante la selezione dell'ingresso %d INGRESSO VIDIOC" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "Il dispositivo non supporta la specifica della norma PAL / NTSC" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "- standard video %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "Errore durante la selezione del metodo standard %d VIDIOC S STD" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "Standard video impostato su NTSC" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "Standard video impostato su SECAM" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "Standard video impostato su PAL" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "sintonizzatore %d VIDIOC G TUNER" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "Imposta sintonizzatore %d" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "freq %ul VIDIOC S FREQUENCY" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "Imposta la frequenza su %ul" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "Impossibile utilizzare %c%c%c%c (%dx%d)" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "Tavolozza dei test %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "Controllo della dimensione dell'immagine %dx%d con stride %d" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "Nessun valore del passo fornito dal dispositivo." #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "Larghezza(%d) deve essere inferiore a falcata(%d)" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "La larghezza dell'immagine (%d) non è multiplo del passo (%d)" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "Condizione impossibile: Larghezza(%d), Passo(%d), Per passo(%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "La larghezza dell'immagine verrà riempita di %d byte" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "Regolazione della risoluzione da %ix %i a %ix %i." #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "Risoluzione modificata non modulo 8." #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "" "Specificare una tavolozza diversa o larghezza / altezza nel file di " "configurazione." #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "Errore durante l'impostazione del formato pixel." #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "Utilizzo della tavolozza %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "Regolazione in larghezza ( %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "Regolazione in altezza ( %d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "" "L'indice della tavolozza di configurazione %d ( %s) per %dx %d non funziona." #: src/video_v4l2.c msgid "Supported palettes:" msgstr "Tavolozze supportate:" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d - %s (compresso: %d) ( %# x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "Tavolozza selezionata %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "Selezione tavolozza non riuscita per il formato %s" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "Impossibile trovare un formato tavolozza compatibile." #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "" "Errore durante la richiesta dei buffer %d per la mappa di memoria. VIDIOC " "REQBUFS" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "Informazioni mmap: frame = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "Memoria buffer insufficiente %d %s< >%s< >%s<" msgstr "Azione non valida richiesta:> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "Lingua nativa: attiva" #: src/webu.c msgid "Native Language : off" msgstr "Lingua nativa: disattivata" #: src/webu.c msgid "Set the value to null/zero" msgstr "Impostare il valore su null / zero" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "Ignora connessione da: %s" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "Autenticazione non riuscita da %s" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "Nessun utente webcontrol: pass fornito" #: src/webu.c msgid "No stream user:pass provided" msgstr "Nessun utente stream: pass fornito" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "Risposta non valida" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "Errore durante l'aggiunta dell'intestazione del controllo web %s %s" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "Errore durante l'aggiunta dell'intestazione del flusso %s %s" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "Metodo non valido richiesto: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "Connessione da: %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "pagina di invio non riuscita %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "L'immagine in streaming non è ancora pronta" #: src/webu.c msgid "Stream process requested to finish." msgstr "Processo di streaming richiesto per il completamento." #: src/webu.c msgid "Send page failed." msgstr "Invio pagina non riuscito." #: src/webu.c msgid "Basic authentication: available" msgstr "Autenticazione di base: disponibile" #: src/webu.c msgid "Basic authentication: disabled" msgstr "Autenticazione di base: disabilitata" #: src/webu.c msgid "Digest authentication: available" msgstr "Autenticazione digest: disponibile" #: src/webu.c msgid "Digest authentication: disabled" msgstr "Autenticazione digest: disabilitata" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd libary ipv6 troppo vecchio disabilitato" #: src/webu.c msgid "IPV6: available" msgstr "IPV6: disponibile" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6: disabilitato" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd libary SSL / TLS troppo vecchio disabilitato" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS: disponibile" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS: disabilitato" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "Errore durante la lettura del file per il supporto SSL / TLS." #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "SSL / TLS richiesto ma nessun file di certificato fornito. SSL / TLS " "disabilitato" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "" "SSL / TLS richiesto ma nessun file chiave fornito. SSL / TLS disabilitato" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "Avvio di webcontrol sulla porta %d" #: src/webu.c msgid "Unable to start MHD" msgstr "Impossibile avviare MHD" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "Webcontrol avviato sulla porta %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "Stream della telecamera %d avviato sulla porta / ID telecamera %d / %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "Avvio della telecamera %d stream sulla porta %d" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "Avvio di tutti i flussi della telecamera sulla porta %d" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "Avvio della telecamera %d stream sulla porta %d" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "Impossibile avviare lo streaming per la telecamera %d" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "Porta duplicata richiesta %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "Ips max blocco controllo web non valido. Impostazione pari a 25. " #: src/webu_html.c msgid "Cameras" msgstr "Telecamera" #: src/webu_html.c msgid "Camera" msgstr "Telecamera" #: src/webu_html.c msgid "All" msgstr "Tutti" #: src/webu_html.c msgid "Action" msgstr "Azione" #: src/webu_html.c msgid "Start Event" msgstr "Inizia evento" #: src/webu_html.c msgid "End Event" msgstr "Fine evento" #: src/webu_html.c msgid "Snapshot" msgstr "Istantanea" #: src/webu_html.c msgid "Change Configuration" msgstr "Cambia configurazione" #: src/webu_html.c msgid "Write Configuration" msgstr "Scrivi configurazione" #: src/webu_html.c msgid "Tracking" msgstr "Tracciamento" #: src/webu_html.c msgid "Pause" msgstr "Pausa" #: src/webu_html.c msgid "Start" msgstr "Inizio" #: src/webu_html.c msgid "Restart" msgstr "Ricomincia" #: src/webu_html.c msgid "Quit" msgstr "Smettere" #: src/webu_html.c msgid "Help" msgstr "Aiuto" #: src/webu_html.c msgid "No Configuration Options" msgstr "Nessuna opzione di configurazione" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "Opzioni di configurazione limitate" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "Opzioni di configurazione avanzate" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "Opzioni di configurazione riservate" #: src/webu_html.c msgid "All Cameras" msgstr "Tutte le fotocamere" #: src/webu_html.c msgid "Not running" msgstr "Non attivo" #: src/webu_html.c msgid "Lost connection" msgstr "Connessione persa" #: src/webu_html.c msgid "Paused" msgstr "In pausa" #: src/webu_html.c msgid "Active" msgstr "Attivo" #: src/webu_html.c msgid "Select option" msgstr "Selezionare l'opzione" #: src/webu_html.c msgid "Save" msgstr "Salva" #: src/webu_html.c msgid "Pan/Tilt" msgstr "Girevole / inclinazione" #: src/webu_html.c msgid "Absolute Change" msgstr "Cambiamento assoluto" #: src/webu_html.c msgid "Center" msgstr "Centro" #: src/webu_html.c msgid "Pan" msgstr "Girevole" #: src/webu_html.c msgid "Tilt" msgstr "Inclinazione" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "Discussione specificata non valida: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "URL non valido per una porta specifica della telecamera: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "" "L'URL per il thread 0 non è valido quando si utilizzano file specifici della " "fotocamera: %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "URL non valido per una porta specifica della telecamera: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "Impossibile ottenere lo streaming dell'immagine." #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "L'opzione ' %s' è ammortizzata. Il nome della nuova opzione è '%s'" motion-release-4.6.0/po/ja.po000066400000000000000000003550501452402535500160310ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # # update 2022/04/13 siriuth msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:35-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã®å¾Œã®%s" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "䏿˜Žãªè¨­å®šã‚ªãƒ—ション\"%s\"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "設定ファイルを %sã«å‡ºåŠ›" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "設定ファイル %sãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“-デフォルト値ã§è©¦è¡Œã—ã¦ã„ã¾ã™" #: src/conf.c msgid "Error getcwd" msgstr "getcwdエラー" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "設定ファイル %sã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "無効ãªãƒ•ァイルå: %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "処ç†ã‚¹ãƒ¬ãƒƒãƒ‰0-設定ファイル %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "デフォルト値ã§å‡¦ç†ã™ã‚‹è¨­å®šãƒ•ァイルã¯ã‚りã¾ã›ã‚“" #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "ã™ã¹ã¦ã®ãƒ•ァイルã‹ã‚‰è¨­å®šãƒ‘ラメーターを出力(%d):" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "スレッド%d - 設定ファイル: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s <編集済ã¿>" #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "設定ファイル%sを処ç†ã—ã¦ã„ã¾ã™" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "カメラディレクトリ設定 %s ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "カメラ設定ファイル %sãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "カメラ設定ファイル %sを処ç†ä¸­ã§ã™" #: src/conf.c msgid "daemon" msgstr "デーモン" #: src/conf.c msgid "setup_mode" msgstr "セットアップモード" #: src/conf.c msgid "pid_file" msgstr "PIDファイル" #: src/conf.c msgid "log_file" msgstr "ログファイル" #: src/conf.c msgid "log_level" msgstr "ログレベル" #: src/conf.c msgid "log_type" msgstr "ログタイプ" #: src/conf.c msgid "quiet" msgstr "é™å¯‚" #: src/conf.c msgid "watchdog_tmo" msgstr "ウォッãƒãƒ‰ãƒƒã‚° tmo" #: src/conf.c msgid "watchdog_kill" msgstr "ウォッãƒãƒ‰ãƒƒã‚°ã‚­ãƒ«" # msgid "watchdog_tmo" # msgstr "ウォッãƒãƒ‰ãƒƒã‚°tmo" # msgid "watchdog_kill" # msgstr "ウォッãƒãƒ‰ãƒƒã‚°ã‚­ãƒ«" #: src/conf.c msgid "native_language" msgstr "æ¯å›½èªž" #: src/conf.c msgid "camera_name" msgstr "カメラå" #: src/conf.c msgid "camera_id" msgstr "カメラID" #: src/conf.c msgid "target_dir" msgstr "ターゲットディレクトリ" #: src/conf.c msgid "video_device" msgstr "ビデオデãƒã‚¤ã‚¹" #: src/conf.c msgid "video_params" msgstr "ビデオパラメータ" #: src/conf.c msgid "auto_brightness" msgstr "自動è¼åº¦" #: src/conf.c msgid "tuner_device" msgstr "ãƒãƒ¥ãƒ¼ãƒŠãƒ¼ãƒ‡ãƒã‚¤ã‚¹" #: src/conf.c msgid "roundrobin_frames" msgstr "巡回フレーム" #: src/conf.c msgid "roundrobin_skip" msgstr "巡回スキップ" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "巡回スイッãƒãƒ•ィルター" #: src/conf.c msgid "netcam_url" msgstr "ãƒãƒƒãƒˆã‚«ãƒ url" #: src/conf.c msgid "netcam_params" msgstr "ãƒãƒƒãƒˆã‚«ãƒ ãƒ‘ラメータ" #: src/conf.c msgid "netcam_high_url" msgstr "ãƒã‚¤ãƒãƒƒãƒˆã‚«ãƒ URL" #: src/conf.c msgid "netcam_high_params" msgstr "ãƒã‚¤ãƒãƒƒãƒˆã‚«ãƒ  params" #: src/conf.c msgid "netcam_userpass" msgstr "ãƒãƒƒãƒˆã‚«ãƒ ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ‘ス" #: src/conf.c msgid "mmalcam_name" msgstr "ラズベリーパイカメラå" #: src/conf.c msgid "mmalcam_params" msgstr "ラズベリーパイカメラパラメータ" #: src/conf.c msgid "width" msgstr "å¹…" #: src/conf.c msgid "height" msgstr "高ã•" #: src/conf.c msgid "framerate" msgstr "フレームレート" #: src/conf.c msgid "minimum_frame_time" msgstr "最å°ãƒ•レーム時間" #: src/conf.c msgid "rotate" msgstr "ç”»åƒã®å›žè»¢" #: src/conf.c msgid "flip_axis" msgstr "ç”»åƒã®å転" #: src/conf.c msgid "locate_motion_mode" msgstr "動体検知ã®è¡¨ç¤ºãƒ¢ãƒ¼ãƒ‰" #: src/conf.c msgid "locate_motion_style" msgstr "動体検知ã®è¡¨ç¤ºã‚¹ã‚¿ã‚¤ãƒ«" #: src/conf.c msgid "text_left" msgstr "左下ã®ãƒ†ã‚­ã‚¹ãƒˆ" #: src/conf.c msgid "text_right" msgstr "å³ä¸‹ã®ãƒ†ã‚­ã‚¹ãƒˆ" #: src/conf.c msgid "text_changes" msgstr "変動値" #: src/conf.c msgid "text_scale" msgstr "テキストスケール" #: src/conf.c msgid "text_event" msgstr "テキストイベント" #: src/conf.c msgid "emulate_motion" msgstr "動体検知をエミュレートã™ã‚‹" #: src/conf.c msgid "pause" msgstr "動体検知ã®ä¸€æ™‚åœæ­¢" #: src/conf.c msgid "threshold" msgstr "ã—ãã„値" #: src/conf.c msgid "threshold_maximum" msgstr "ã—ãã„å€¤ã®æœ€å¤§" #: src/conf.c msgid "threshold_tune" msgstr "ã—ãã„値調整" #: src/conf.c msgid "noise_level" msgstr "ノイズレベル" #: src/conf.c msgid "noise_tune" msgstr "ノイズ調整" #: src/conf.c msgid "despeckle_filter" msgstr "スペックル除去フィルター" #: src/conf.c msgid "area_detect" msgstr "エリア検出" #: src/conf.c msgid "mask_file" msgstr "マスクファイル" #: src/conf.c msgid "mask_privacy" msgstr "プライãƒã‚·ãƒ¼ãƒžã‚¹ã‚¯" #: src/conf.c msgid "smart_mask_speed" msgstr "スマートマスク更新頻度" #: src/conf.c msgid "lightswitch_percent" msgstr "ライトスイッãƒçއ" #: src/conf.c msgid "lightswitch_frames" msgstr "ライトスイッãƒãƒ•レーム" #: src/conf.c msgid "minimum_motion_frames" msgstr "最å°ãƒ¢ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•レーム" #: src/conf.c msgid "event_gap" msgstr "イベントギャップ" #: src/conf.c msgid "pre_capture" msgstr "プレキャプãƒãƒ£" #: src/conf.c msgid "post_capture" msgstr "ãƒã‚¹ãƒˆã‚­ãƒ£ãƒ—ãƒãƒ£" #: src/conf.c msgid "on_event_start" msgstr "イベント開始時" #: src/conf.c msgid "on_event_end" msgstr "イベント終了時" #: src/conf.c msgid "on_picture_save" msgstr "ç”»åƒä¿å­˜æ™‚" #: src/conf.c msgid "on_area_detected" msgstr "領域検知時" #: src/conf.c msgid "on_motion_detected" msgstr "動体検知時" #: src/conf.c msgid "on_movie_start" msgstr "動画開始時" #: src/conf.c msgid "on_movie_end" msgstr "動画終了時" #: src/conf.c msgid "on_camera_lost" msgstr "カメラを失ã£ãŸã¨ã" #: src/conf.c msgid "on_camera_found" msgstr "カメラを見ã¤ã‘ãŸã¨ã" #: src/conf.c msgid "picture_output" msgstr "ç”»åƒå‡ºåŠ›" #: src/conf.c msgid "picture_output_motion" msgstr "動体画åƒã®å‡ºåŠ›" #: src/conf.c msgid "picture_type" msgstr "ピクãƒãƒ£ã‚¿ã‚¤ãƒ—" #: src/conf.c msgid "picture_quality" msgstr "画質" #: src/conf.c msgid "picture_exif" msgstr "ç”»åƒã®exif" #: src/conf.c msgid "picture_filename" msgstr "ç”»åƒãƒ•ァイルå" #: src/conf.c msgid "snapshot_interval" msgstr "スナップショットã®é–“éš”" #: src/conf.c msgid "snapshot_filename" msgstr "スナップショットファイルå" #: src/conf.c msgid "movie_output" msgstr "動画出力" #: src/conf.c msgid "movie_output_motion" msgstr "動体動画出力" #: src/conf.c msgid "movie_max_time" msgstr "å‹•ç”»ã®æœ€å¤§æ™‚é–“" #: src/conf.c msgid "movie_bps" msgstr "å‹•ç”»ã®ãƒ“ットレート" #: src/conf.c msgid "movie_quality" msgstr "å‹•ç”»ã®å“質" #: src/conf.c msgid "movie_codec" msgstr "å‹•ç”»ã®ã‚³ãƒ¼ãƒ‡ãƒƒã‚¯" #: src/conf.c msgid "movie_duplicate_frames" msgstr "å‹•ç”»ã«è¤‡è£½ã—ãŸãƒ•レームを利用ã™ã‚‹" #: src/conf.c msgid "movie_passthrough" msgstr "å‹•ç”»ã®ãƒ‘ススルー" #: src/conf.c msgid "movie_filename" msgstr "å‹•ç”»ã®ãƒ•ァイルå" #: src/conf.c msgid "movie_extpipe_use" msgstr "動画を拡張パイプã«å‡ºåŠ›" #: src/conf.c msgid "movie_extpipe" msgstr "å‹•ç”»ã®æ‹¡å¼µãƒ‘イプ" #: src/conf.c msgid "timelapse_interval" msgstr "タイムラプスã®é–“éš”" #: src/conf.c msgid "timelapse_mode" msgstr "タイムラプスモード" #: src/conf.c msgid "timelapse_fps" msgstr "タイムラプスã®fps" #: src/conf.c msgid "timelapse_codec" msgstr "タイムラプスã®ã‚³ãƒ¼ãƒ‡ãƒƒã‚¯" #: src/conf.c msgid "timelapse_filename" msgstr "タイムラプスファイルå" #: src/conf.c msgid "video_pipe" msgstr "å‹•ç”»ã®ãƒ‘イプ" #: src/conf.c msgid "video_pipe_motion" msgstr "動体検知動画ã®ãƒ‘イプ" #: src/conf.c msgid "webcontrol_port" msgstr "web制御ãƒãƒ¼ãƒˆ" #: src/conf.c msgid "webcontrol_ipv6" msgstr "web制御 ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "web制御 localhost" #: src/conf.c msgid "webcontrol_parms" msgstr "web制御 parms" #: src/conf.c msgid "webcontrol_interface" msgstr "web制御インターフェース" #: src/conf.c msgid "webcontrol_auth_method" msgstr "web制御 èªè¨¼æ–¹æ³•" #: src/conf.c msgid "webcontrol_authentication" msgstr "web制御 èªè¨¼" #: src/conf.c msgid "webcontrol_tls" msgstr "web制御 TLS" #: src/conf.c msgid "webcontrol_cert" msgstr "web制御 証明書" #: src/conf.c msgid "webcontrol_key" msgstr "web制御 キー" #: src/conf.c msgid "webcontrol_header_params" msgstr "web制御ヘッダパラメータ" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "web制御ロック分" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "web制御ロックã®è©¦è¡Œ" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "web制御ロック最大ips" #: src/conf.c msgid "stream_port" msgstr "ストリームãƒãƒ¼ãƒˆ" #: src/conf.c msgid "stream_localhost" msgstr "ストリームlocalhost" #: src/conf.c msgid "stream_auth_method" msgstr "ストリームèªè¨¼æ–¹æ³•" #: src/conf.c msgid "stream_authentication" msgstr "ストリームèªè¨¼" #: src/conf.c msgid "stream_tls" msgstr "ストリームTLS" #: src/conf.c msgid "stream_header_params" msgstr "ストリームヘッダパラメータ" #: src/conf.c msgid "stream_preview_scale" msgstr "ストリームプレビュースケール" #: src/conf.c msgid "stream_preview_newline" msgstr "ã‚¹ãƒˆãƒªãƒ¼ãƒ ãƒ—ãƒ¬ãƒ“ãƒ¥ãƒ¼ã®æ”¹è¡Œ" #: src/conf.c msgid "stream_preview_method" msgstr "ストリームã®ãƒ—レビュー方法" #: src/conf.c msgid "stream_quality" msgstr "ストリームå“質" #: src/conf.c msgid "stream_grey" msgstr "ストリームグレー" #: src/conf.c msgid "stream_motion" msgstr "ストリームモーション" #: src/conf.c msgid "stream_maxrate" msgstr "最大ストリーム" #: src/conf.c msgid "stream_limit" msgstr "ストリーム制é™" #: src/conf.c msgid "database_type" msgstr "データベースã®ç¨®é¡ž" #: src/conf.c msgid "database_dbname" msgstr "データベースå" #: src/conf.c msgid "database_host" msgstr "データベースホスト" #: src/conf.c msgid "database_port" msgstr "データベースãƒãƒ¼ãƒˆ" #: src/conf.c msgid "database_user" msgstr "データベースユーザー" #: src/conf.c msgid "database_password" msgstr "データベースパスワード" #: src/conf.c msgid "database_busy_timeout" msgstr "データベースビジータイムアウト" #: src/conf.c msgid "sql_log_picture" msgstr "SQLログ ç”»åƒ" #: src/conf.c msgid "sql_log_snapshot" msgstr "SQLログ スナップショット" #: src/conf.c msgid "sql_log_movie" msgstr "SQLログ å‹•ç”»" #: src/conf.c msgid "sql_log_timelapse" msgstr "SQLログ タイムラプス" #: src/conf.c msgid "sql_query_start" msgstr "SQLクエリã®é–‹å§‹" #: src/conf.c msgid "sql_query_stop" msgstr "SQLã‚¯ã‚¨ãƒªåœæ­¢" #: src/conf.c msgid "sql_query" msgstr "SQLクエリ" #: src/conf.c msgid "track_type" msgstr "トラックタイプ" #: src/conf.c msgid "track_auto" msgstr "自動トラッキング" #: src/conf.c msgid "track_port" msgstr "トラッキングãƒãƒ¼ãƒˆ" #: src/conf.c msgid "track_motorx" msgstr "トラッキング X軸" #: src/conf.c msgid "track_motorx_reverse" msgstr "トラッキング X軸å転" #: src/conf.c msgid "track_motory" msgstr "トラッキング Y軸" #: src/conf.c msgid "track_motory_reverse" msgstr "トラッキング Y軸å転" #: src/conf.c msgid "track_maxx" msgstr "トラッキング 最大X" #: src/conf.c msgid "track_minx" msgstr "トラッキング 最å°X" #: src/conf.c msgid "track_maxy" msgstr "トラッキング 最大Y" #: src/conf.c msgid "track_miny" msgstr "トラッキング 最å°Y" #: src/conf.c msgid "track_homex" msgstr "トラッキング Xホーム" #: src/conf.c msgid "track_homey" msgstr "トラッキング Yホーム" #: src/conf.c msgid "track_iomojo_id" msgstr "トラッキング iomojo_id" #: src/conf.c msgid "track_step_angle_x" msgstr "トラッキング Xステップ角度" #: src/conf.c msgid "track_step_angle_y" msgstr "トラッキング Yステップ角度" #: src/conf.c msgid "track_move_wait" msgstr "ãƒˆãƒ©ãƒƒã‚­ãƒ³ã‚°ç§»å‹•å¾…ã¡æ™‚é–“" #: src/conf.c msgid "track_speed" msgstr "トラッキング速度" #: src/conf.c msgid "track_stepsize" msgstr "トラックステップサイズ" #: src/conf.c msgid "track_generic_move" msgstr "トラッキング 一般的ãªç§»å‹•" #: src/conf.c msgid "camera" msgstr "カメラ" #: src/conf.c msgid "camera_dir" msgstr "カメラ方å‘" #: src/dbse.c msgid "Closing MySQL library" msgstr "MySQLライブラリを閉ã˜ã‚‹" #: src/dbse.c msgid "Closing MariaDB library" msgstr "MariaDBライブラリを閉ã˜ã‚‹" #: src/dbse.c msgid "Database closed" msgstr "データベースを閉ã˜ãŸ" #: src/dbse.c msgid "Initializing database" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’åˆæœŸåŒ–" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "ユーザー %sã§ãƒ›ã‚¹ãƒˆ %sã®MySQLデータベース %sã«æŽ¥ç¶šã§ãã¾ã›ã‚“" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "MySQLエラー %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "ユーザー %sã§ãƒ›ã‚¹ãƒˆ %sã®MariaDBデータベース %sã«æŽ¥ç¶šã§ãã¾ã›ã‚“" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "MariaDBエラー %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "データベース %s ã‚’é–‹ã„ã¦ã„ã¾ã™" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "SQLite3 データベース %s ã‚’é–‹ã‘ã¾ã›ã‚“。エラー %d : %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "ビジー タイムアウトを %d ミリ秒ã«è¨­å®š" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "ビジー タイムアウトã®è¨­å®šã«å¤±æ•—ã—ã¾ã—ãŸã€‚エラー %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "PostgreSQLデータベース '%s'ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸ: %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "データベース タイプ %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "MySQLクエリã®å®Ÿè¡Œ" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "MySQLクエリãŒå¤±æ•—ã—ã¾ã—㟠%sエラーコード %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "" "ユーザー %s MySQLエラーã§ãƒ›ã‚¹ãƒˆ %sã®MySQLデータベース %sã«å†æŽ¥ç¶šã§ãã¾ã›ã‚“ %s" "ã§ã—ãŸ" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "MySQLデータベースã¸ã®å†æŽ¥ç¶š '%s'æˆåŠŸ" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "å†æŽ¥ç¶šå¾Œã€MySQLクエリãŒå¤±æ•—ã—ã¾ã—㟠%sエラーコード %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "MariaDBクエリã®å®Ÿè¡Œ" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "MariaDBクエリãŒå¤±æ•—ã—ã¾ã—㟠%sエラーコード %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "ユーザー %s MariaDBを使用ã—ã¦ãƒ›ã‚¹ãƒˆ %sã®MariaDBデータベース %sã«å†æŽ¥ç¶šã§ãã¾" "ã›ã‚“エラー㯠%sã§ã—ãŸ" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "MariaDBデータベースã¸ã®å†æŽ¥ç¶š '%s'æˆåŠŸ" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "å†æŽ¥ç¶šå¾Œã€MariaDBクエリãŒå¤±æ•—ã—ã¾ã—㟠%sエラーコード %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "PostgreSQLデータベース '%s'ã«å†æŽ¥ç¶šã—ã¾ã—ãŸ" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "PostgreSQLクエリã®å®Ÿè¡Œ" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "PostgreSQLデータベース '%s'ã¸ã®å†æŽ¥ç¶šã‚’試ã¿ã¦ã„ã¾ã™: %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "PGSQLクエリãŒå¤±æ•—ã—ã¾ã—ãŸ:[%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "%s を実行ã—ã¦ã„ã¾ã™" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "SQLite3 エラー %d : %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "空㮠SQL クエリを無視ã™ã‚‹" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "外部コマンド '%s'ã‚’é–‹å§‹ã§ãã¾ã›ã‚“" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "外部コマンド '%s'を実行ã—ã¦ã„ã¾ã™" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "ç”»åƒãƒ•ァイルを出力中ã§ã™: %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "動画ファイルを出力中ã§ã™: %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "ç”»åƒãƒ•ァイルをä¿å­˜ã—ã¾ã—ãŸ: %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "動画ファイルをä¿å­˜ã—ã¾ã—ãŸ: %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "ç”»åƒã‚’ビデオパイプã«é…ç½®ã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "シンボリックリンク[%s]を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "プレビューパイプå %d %sã®ä½œæˆã‚¨ãƒ©ãƒ¼" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "ファイルåベース %d %sã®ä½œæˆã‚¨ãƒ©ãƒ¼" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "プレビューå %d %sã®ä½œæˆã‚¨ãƒ©ãƒ¼" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "クローズ中: extpipeファイルã®èª¬æ˜Ž %dã€ã‚¨ãƒ©ãƒ¼çŠ¶æ…‹ %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "pcloseリターン値: %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "ソースFPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "動画パス: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "ターゲットディレクトリ %sã¸ã®æ›¸ãè¾¼ã¿ã‚¢ã‚¯ã‚»ã‚¹ãªã—" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "パスãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“. 作æˆä¸­ %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "パス %sã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "コマンドライン記述ã®ã‚¨ãƒ©ãƒ¼: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "パイプ: %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt-> moviefps:%d" #: src/event.c msgid "popen failed" msgstr "プロセスパイプã®ã‚ªãƒ¼ãƒ—ンãŒå¤±æ•—" #: src/event.c msgid "Using extpipe" msgstr "拡張パイプを使用ã—ã¾ã™" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "パイプã¸ã®å‡ºåŠ›ã‚¨ãƒ©ãƒ¼. %d状態エラー" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "パイプ %sã¯ä½œæˆã¾ãŸã¯é–‰ã˜ã‚‰ã‚Œã¦ã„ã¾ã›ã‚“" #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "oggコンテナã¯ä½¿ç”¨ã—ãªããªã‚Šã¾ã—ãŸ. mpeg4ã¸ã®å¤‰æ›´ã—ã¾ã™" #: src/event.c msgid "Running test of the various output formats." msgstr "ã•ã¾ã–ã¾ãªå‡ºåЛ形å¼ã®å®Ÿè¡Œãƒ†ã‚¹ãƒˆã€‚" #: src/event.c msgid "Error opening context for movie output." msgstr "動画出力ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’é–‹ãã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffopen オープンエラー(動体検知)ファイルã®ä½œæˆä¸­[%s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "" "タイムラプスã®swfコンテナã¯ä½¿ç”¨ã—ãªããªã‚Šã¾ã—ãŸ.mpgコンテナを使用ã—ã¾ã™" #: src/event.c msgid "Timelapse using mpg codec." msgstr "タイムラプスã¯mpgコーデックを使用ã—ã¾ã™" #: src/event.c msgid "Events will be appended to file" msgstr "イベントã¯ãƒ•ァイルã«è¿½åŠ ã•れã¾ã™" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "タイムラプスã¯mpeg4コーデックを使用ã—ã¾ã™" #: src/event.c msgid "Events will be trigger new files" msgstr "ã‚¤ãƒ™ãƒ³ãƒˆã¯æ–°ã—ã„ファイルをトリガーã—ã¾ã™" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffopen オープンエラー(タイムラプス)ファイルã®ä½œæˆä¸­[%s]" #: src/event.c msgid "Error encoding image" msgstr "ç”»åƒã®å¤‰æ›ã‚¨ãƒ©ãƒ¼" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "コーデックåã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "指定ã•れãŸãƒ•レームレートãŒã€æŒ‡å®šã•れãŸffmpeg動画タイプã«å¯¾ã—ã¦é«˜ã™ãŽã¾ã™.別ã®" "ffmpegã‚³ãƒ³ãƒ†ãƒŠã‚’é¸æŠžã™ã‚‹ã‹ã€ãƒ•レームレートを下ã’ã¾ã™" #: src/ffmpeg.c msgid "Error setting base file name" msgstr "ベースファイルåã®è¨­å®šã‚¨ãƒ©ãƒ¼" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "%sコーデックã®ã‚¿ã‚¤ãƒ ãƒ©ãƒ—ス追加ã®è¨­å®šä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" #: src/ffmpeg.c msgid "Error setting file name" msgstr "ファイルåã®è¨­å®šã‚¨ãƒ©ãƒ¼" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "コーデックオプション値 %sã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "コーデックをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "変æ›ç”¨ãƒ•レームé€ä¿¡ã‚¨ãƒ©ãƒ¼: %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "å—信パケットã¯ã€-2コードを返ã™EAGAINを投ã’ã¾ã—ãŸ: %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "変æ›ã•れãŸãƒ‘ケットビデオã®å—信エラー: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "å‹•ç”»ã®å¤‰æ›ã‚¨ãƒ©ãƒ¼: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "å‹•ç”»ã®å¤‰æ›ã‚¨ãƒ©ãƒ¼" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "" "PTS %ベースPTS %ミリ秒間隔 %タイムベース %d- %d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "悪ã„タイミング!! フレームãŒã‚¹ã‚­ãƒƒãƒ—ã•れã¾ã—ãŸ" #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "" "PTS %ベースPTS %ミリ秒間隔 %タイムベース %d- %d変更 " "%d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s コーデック vbr/crf /ビットレート: %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "優先コーデック %sãŒãƒ–ラックリストã«ç™»éŒ²ã•れã¾ã—ãŸ: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "コーデック %sãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "コーデック %sを使用中" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "ストリームを割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "コーデックã®å‰²ã‚Šå½“ã¦ã«å¤±æ•—ã—ã¾ã—ãŸ!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "fpsãŒä½Žã„ãŸã‚, %dフレームを%dフレームコンテナã«å¤‰æ›ã—ã¦ã„ã¾ã™" #: src/ffmpeg.c msgid "Unable to set quality" msgstr "å“質を設定ã§ãã¾ã›ã‚“" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "報告ã•れãŸFPS㯠%d/%dをサãƒãƒ¼ãƒˆã—ã¾ã—ãŸ" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "コーデック %sã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "デコーダーパラメーターã®ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸ!: %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "フレームを割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "ãƒãƒƒãƒ•ã‚¡ %sを割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "%sã¸ã®ãƒ•ァイルオープンエラー" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "%sã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "%sã¸ã®ãƒ•ァイルオープンエラー" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "ffmpegヘッダ %sを書ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "排出モードã¸ã®ç§»è¡Œã‚¨ãƒ©ãƒ¼: %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "ã‚³ãƒ¼ãƒ‡ãƒƒã‚¯ã®æŽ’å‡ºã‚¨ãƒ©ãƒ¼: %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "ドレインビデオフレームã®å‡ºåŠ›ã‚¨ãƒ©ãƒ¼" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "ç”»åƒã®å¤‰æ›ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "ビデオフレームã®å‡ºåЛ䏭ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet: %s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "ビデオフレームã®å‡ºåЛ䏭ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "RTSPコンテキストã¯åˆ©ç”¨ã§ãã¾ã›ã‚“" #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "rtspカメラã¯ãƒ‘ã‚¹ã‚¹ãƒ«ãƒ¼ã®æº–å‚™ãŒã§ãã¦ã„ã¾ã›ã‚“" #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "ãƒ‘ã‚¹ã‚¹ãƒ«ãƒ¼ãƒ¢ãƒ¼ãƒ‰ãŒæœ‰åй.MP4コンテナã¸ã®å¤‰æ›´" #: src/ffmpeg.c msgid "Could not get codec!" msgstr "コーデックをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "コーデックパラメータをコピーã§ãã¾ã›ã‚“" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "パススルーã¯ç„¡åйã§ã™. ffmpegãŒå¤ã™ãŽã¾ã™" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "パススルーストリームを開ãã¾ã—ãŸ" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "ffmpeg libavcodecãƒãƒ¼ã‚¸ãƒ§ãƒ³ %d.%d.%d libavformatãƒãƒ¼ã‚¸ãƒ§ãƒ³ %d.%d.%d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "av lockmgrã®ç™»éŒ²ã«å¤±æ•—ã—ã¾ã—ãŸ(%d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "ffmpeg機能ã¯å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "クリーンアップ時ã«av lockmgrレジスタã®ãƒªã‚»ãƒƒãƒˆã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "出力コンテキストを割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "パススルーをセットアップã§ãã¾ã›ã‚“ã§ã—ãŸ!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "ストリームを設定ã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "コーデックã®ãƒ•ラッシュエラー" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "ãƒãƒƒãƒ•ァリングã•れãŸãƒ‘ケットをクリアã—よã†ã¨ã™ã‚‹éŽå‰°ãªè©¦ã¿" #: src/ffmpeg.c msgid "Buffered packet" msgstr "ãƒãƒƒãƒ•ァリングã•れãŸãƒ‘ケット" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s: 指定ã•れãŸjpegãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¾ã—ãŸ" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "無効ãªJPEGç”»åƒã‚µã‚¤ã‚º" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "JPEGç”»åƒã‚µã‚¤ã‚º %dx %dã€JPEG㯠%dx %dã§ã—ãŸ" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "予期ã—ãªã„カメラ制御コールãƒãƒƒã‚¯ã‚¤ãƒ™ãƒ³ãƒˆã€0x %08xã‚’å—ä¿¡ã—ã¾ã—ãŸ" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "高フレームレートã¯ã€ç”»åƒã®éœ²å‡ºã«å•題を引ãèµ·ã“ã™å¯èƒ½æ€§ãŒã‚りã¾ã™" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "è‡ªå‹•éœ²å‡ºãŒæ©Ÿèƒ½ã—ãªã„å ´åˆã¯ã€ä½Žã„フレームレートを試ã—ã¦ãã ã•ã„" #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "MMALカメラコンãƒãƒ¼ãƒãƒ³ãƒˆ %sを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "MMALカメラ %sã«ã¯å‡ºåŠ›ãƒãƒ¼ãƒˆãŒã‚りã¾ã›ã‚“" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "制御ãƒãƒ¼ãƒˆã‚’有効ã«ã§ãã¾ã›ã‚“:エラー %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "MMALパディングãªã—ã®ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "カメラã®ãƒ“デオ形å¼ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "カメラコンãƒãƒ¼ãƒãƒ³ãƒˆã‚’有効ã«ã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "作æˆã•れãŸMMALカメラコンãƒãƒ¼ãƒãƒ³ãƒˆ" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "MMALカメラãƒãƒƒãƒ•ァープールã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "MMALカメラãƒãƒƒãƒ•ァキューã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "プールキューã‹ã‚‰å¿…è¦ãªãƒãƒƒãƒ•ã‚¡ %dã‚’å–å¾—ã§ãã¾ã›ã‚“" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "ãƒãƒ¼ãƒˆã«ãƒãƒƒãƒ•ã‚¡ã‚’é€ä¿¡ã§ãã¾ã›ã‚“(%d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "MMALカメラスレッドã®é–‹å§‹. カメラ用(%s). %d x%d. %d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "カメラã®ãƒ‘ラメータを割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "MMALカメラキャプãƒãƒ£ãƒãƒ¼ãƒˆã®æœ‰åŠ¹åŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "MMALカメラã®ã‚­ãƒ£ãƒ—ãƒãƒ£é–‹å§‹ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "MMALカメラã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %dフラグ %08xサイズ %d/%d at %08xã€img size = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "ãƒãƒƒãƒ•ァをカメラã®ãƒ“デオãƒãƒ¼ãƒˆã«æˆ»ã™ã“ã¨ãŒã§ãã¾ã›ã‚“" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "事å‰ã‚­ãƒ£ãƒ—ãƒãƒ£ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’ %dアイテムã«å¤‰æ›´ã—ã¾ã™" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "プロセスIDファイル(pidファイル)を削除ã—ã¾ã—ãŸ" #: src/motion.c msgid "Error removing pid file" msgstr "PIDファイルã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "ログファイルを閉ã˜ã¦ã„ã¾ã™(%s)" #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "ãƒ¢ãƒ¼ã‚·ãƒ§ãƒ³ãŒæ¤œå‡ºã•れã¾ã—㟠- イベント %d ã‚’é–‹å§‹ã—ã¾ã™ã€‚" #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "映画㫠%dフィラーフレームを追加ã—ã¾ã—ãŸ" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "カメラã®ã‚¿ã‚¤ãƒ—を判別ã§ãã¾ã›ã‚“(MMALã€Netcamã€V4L2ã€BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "プライãƒã‚·ãƒ¼ãƒžã‚¹ã‚¯ãƒ•ァイルを開ã" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "高解åƒåº¦ã®ãƒ—ライãƒã‚·ãƒ¼ãƒžã‚¹ã‚¯ãƒ•ァイルを開ã" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "マスクファイル %sã‚’é–‹ãéš›ã®ã‚¨ãƒ©ãƒ¼" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "プライãƒã‚·ãƒ¼ãƒžã‚¹ã‚¯ç”»åƒã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ.プライãƒã‚·ãƒ¼ãƒžã‚¹ã‚¯æ©Ÿèƒ½ãŒç„¡åйã§" "ã™" #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "プライãƒã‚·ãƒ¼ãƒžã‚¹ã‚¯ãƒ•ァイル\"%s\"ãŒãƒ­ãƒ¼ãƒ‰ã•れã¾ã—ãŸ" #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "無効ãªãƒ†ã‚­ã‚¹ãƒˆã‚¹ã‚±ãƒ¼ãƒ«. %dã«èª¿æ•´" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "カメラ %dãŒé–‹å§‹ã—ã¾ã—ãŸ:モーション検出 %s" #: src/motion.c msgid "Disabled" msgstr "無効" #: src/motion.c msgid "Enabled" msgstr "有効化" #: src/motion.c msgid "Pass-through processing disabled." msgstr "パススルー処ç†ã¯ç„¡åйã§ã™" #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "無効ãªè¨­å®šå¯¸æ³• %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "デフォルトã®å¯¸æ³• %dx %dを使用" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "è¦æ±‚ã•れãŸç”»åƒå¹…(%d)ã¯ãƒ¢ã‚¸ãƒ¥ãƒ­8ã§ã¯ã‚りã¾ã›ã‚“" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "幅を次ã«é«˜ã„8ã®å€æ•°(%d)ã«èª¿æ•´ã—ã¾ã™" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "è¦æ±‚ã•れãŸç”»åƒã®é«˜ã•(%d)ã¯ãƒ¢ã‚¸ãƒ¥ãƒ­8ã§ã¯ã‚りã¾ã›ã‚“" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "高ã•を次ã«é«˜ã„8ã®å€æ•°(%d)ã«èª¿æ•´ã—ã¾ã™" #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "カメラã‹ã‚‰åˆæœŸç”»åƒã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "設定ファイルã®å¹…ã¨é«˜ã•を使用ã—ã¦ãƒ¢ãƒ¼ã‚·ãƒ§ãƒ³ãŒç¶šè¡Œã•れã¾ã™" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "Motionã¯8を法ã¨ã™ã‚‹å¹…ã¨é«˜ã•ã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "è¦æ±‚ã•れãŸç”»åƒã®å¹…(%d)ã¾ãŸã¯é«˜ã•(%d)ã¯ãƒ¢ã‚¸ãƒ¥ãƒ­8ã§ã¯ã‚りã¾ã›ã‚“" #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "モーションã¯ã€64 %dx %d以上ã®å¹…ã¨é«˜ã•ã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "サブストリームã¯åˆ©ç”¨ã§ãã¾ã›ã‚“.16を法ã¨ã—ãªã„ç”»åƒã‚µã‚¤ã‚º" #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "webpç”»åƒå½¢å¼ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“.jpegã«ãƒ•ェールãƒãƒƒã‚¯ã—ã¾ã™" #: src/motion.c msgid "Error capturing first image" msgstr "最åˆã®ç”»åƒã®ã‚­ãƒ£ãƒ—ãƒãƒ£ã‚¨ãƒ©ãƒ¼" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "通常ã®å†™çœŸç”¨ã®ãƒ“デオループãƒãƒƒã‚¯ãƒ‡ãƒã‚¤ã‚¹ã‚’é–‹ã" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "通常ã®å†™çœŸã®ãƒ“デオループãƒãƒƒã‚¯ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "映画用ã®ãƒ“デオループãƒãƒƒã‚¯ãƒ‡ãƒã‚¤ã‚¹ã‚’é–‹ã" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "å‹•ç”»ã®ãƒ“デオループãƒãƒƒã‚¯ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "マスク画åƒã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ.マスク機能ã¯ç„¡åйã§ã™" #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "マスクファイル\"%s\"ãŒãƒ­ãƒ¼ãƒ‰ã•れã¾ã—ãŸ" #: src/motion.c msgid "Emulating motion" msgstr "エミュレートモーション" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "エリア %dã®å‹•ããŒæ¤œå‡ºã•れã¾ã—ãŸ" #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "カメラã¨ã®æŽ¥ç¶šã«æˆåŠŸã™ã‚‹ã¾ã§å†è©¦è¡Œã—ã¦ã„ã¾ã™" #: src/motion.c msgid "Camera has become available." msgstr "カメラãŒä½¿ç”¨å¯èƒ½ã«ãªã‚Šã¾ã—ãŸã€‚" #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "モーションをå†é–‹ã—ã¦ã„ã¾ã™ã€‚\n" "è¦æ±‚ã•れãŸç”»åƒã®å¹… (%d) ã¾ãŸã¯é«˜ã• (%d) ã¯ãƒ¢ã‚¸ãƒ¥ãƒ­ 8 ã§ã¯ã‚りã¾ã›ã‚“。" #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "モーションをå†é–‹ã—ã¦ã„ã¾ã™ã€‚\n" "モーション㯠64 %dx%d 以上ã®å¹…ã¨é«˜ã•ã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "モーションをå†é–‹ã—ã¦ã„ã¾ã™ã€‚\n" "カメラã®é«˜ã•ã¾ãŸã¯å¹…ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚" #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "モーションをå†é–‹ã—ã¦ã„ã¾ã™ã€‚\n" "カメラã®é«˜è§£åƒåº¦ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚" #: src/motion.c msgid "Video signal re-acquired" msgstr "å†å–å¾—ã—ãŸãƒ“デオ信å·" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "ビデオデãƒã‚¤ã‚¹ã®è‡´å‘½çš„ãªã‚¨ãƒ©ãƒ¼-ビデオデãƒã‚¤ã‚¹ã‚’é–‰ã˜ã‚‹" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "Motionスレッドをå†èµ·å‹•ã—ã¦ã€ã™ã¹ã¦ã®ç”»åƒãƒãƒƒãƒ•ァーをå†åˆæœŸåŒ–ã™ã‚‹" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "ビデオ信å·ãŒå¤±ã‚れã¾ã—ãŸ-グレー画åƒã‚’追加ã—ã¾ã™" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "ビデオ信å·ãŒã¾ã å¤±ã‚れã¦ã„ã‚‹-ビデオデãƒã‚¤ã‚¹ã‚’é–‰ã˜ã‚ˆã†ã¨ã—ã¦ã„ã¾ã™" #: src/motion.c msgid "Lightswitch detected" msgstr "ライトスイッãƒãŒæ¤œå‡ºã•れã¾ã—ãŸ" #: src/motion.c msgid "Switchfilter detected" msgstr "スイッãƒãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ãŒæ¤œå‡ºã•れã¾ã—ãŸ" #: src/motion.c msgid "micro-lightswitch!" msgstr "マイクロライトスイッãƒ!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "イベント%dã®çµ‚了" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "Raw 変更: %5d - '%s'ã®å¾Œã®å¤‰æ›´: %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr " - ラベル: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "変更: %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr "-ノイズレベル: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr "-ã—ãã„値: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "無効ãªã‚¿ã‚¤ãƒ ãƒ©ãƒ—スモード引数 '%s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%:s ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ‰‹å‹•タイムラプスモード" #: src/motion.c msgid "Thread exiting" msgstr "終了ã™ã‚‹ã‚¹ãƒ¬ãƒƒãƒ‰" #: src/motion.c msgid "Motion going to daemon mode" msgstr "デーモンモードã«ç§»è¡Œã™ã‚‹ãƒ¢ãƒ¼ã‚·ãƒ§ãƒ³" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "" "モーションを終了ã—ã¾ã™.プロセスIDファイル(pidファイル) %sを作æˆã§ãã¾ã›ã‚“" #: src/motion.c msgid "Could not change directory" msgstr "ディレクトリを変更ã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "プロセスIDファイル %sを作æˆã—ã¾ã—ãŸ.プロセスID㯠%dã§ã™" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "" "カマラIDã¯ä¸€æ„ã§ã¯ãªãã€32,000ã‚’è¶…ãˆã‚‹å€¤ãŒã‚りã¾ã™.ã«ãƒ•ォールãƒãƒƒã‚¯ã‚¹ãƒ¬ãƒƒãƒ‰ç•ª" "å·" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2:利用å¯èƒ½" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2:利用ã§ãã¾ã›ã‚“" #: src/motion.c msgid "bktr : available" msgstr "bktr:利用å¯èƒ½" #: src/motion.c msgid "bktr : not available" msgstr "bktr:利用ã§ãã¾ã›ã‚“" #: src/motion.c msgid "webp : available" msgstr "webp:利用å¯èƒ½" #: src/motion.c msgid "webp : not available" msgstr "webp:利用ã§ãã¾ã›ã‚“" #: src/motion.c msgid "mmal : available" msgstr "mmal:利用å¯èƒ½" #: src/motion.c msgid "mmal : not available" msgstr "mmal:利用ã§ãã¾ã›ã‚“" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg:利用å¯èƒ½" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg:利用ã§ãã¾ã›ã‚“" #: src/motion.c msgid "mysql : available" msgstr "mysql:利用å¯èƒ½" #: src/motion.c msgid "mysql : not available" msgstr "mysql:利用ã§ãã¾ã›ã‚“" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB:利用å¯èƒ½" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB:利用ã§ãã¾ã›ã‚“" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3:利用å¯èƒ½" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3:利用ã§ãã¾ã›ã‚“" #: src/motion.c msgid "pgsql : available" msgstr "pgsql:利用å¯èƒ½" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql:利用ã§ãã¾ã›ã‚“" #: src/motion.c msgid "nls : available" msgstr "nls:利用å¯èƒ½" #: src/motion.c msgid "nls : not available" msgstr "nls:利用ã§ãã¾ã›ã‚“" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "デフォルトã®ãƒ­ã‚°ãƒ¬ãƒ™ãƒ«(%s)(%d)を使用" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "ファイル %s ã¸ãƒ­ã‚°ã‚’出力ã—ã¾ã™" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "モーションã®çµ‚了時ã«ã€ãƒ­ã‚°ãƒ•ァイル %s を作æˆã§ãã¾ã›ã‚“" #: src/motion.c msgid "Logging to syslog" msgstr "syslogã¸ã®ãƒ­ã‚°å‡ºåŠ›ã—ã¾ã™" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "モーション %s ãŒé–‹å§‹ã—ã¾ã—ãŸ" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "デフォルトã®ãƒ­ã‚°ã‚¿ã‚¤ãƒ—(%s)を使用ã—ã¾ã™" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "ログã®ç¨®é¡ž(%s),ログレベル(%s)ã§å‡ºåŠ›ã—ã¾ã™" #: src/motion.c msgid "Motion running as daemon process" msgstr "Motionã¯ãƒ‡ãƒ¼ãƒ¢ãƒ³ãƒ—ロセスã§å®Ÿè¡Œä¸­ã§ã™" #: src/motion.c msgid "Motion running in setup mode." msgstr "Motionã¯ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—モードã§å®Ÿè¡Œä¸­ã§ã™" #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "カメラID: %d㯠%sã‹ã‚‰è¨­å®šã•れã¦ã„ã¾ã™" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "カメラID: %d カメラå: %s サービス: %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "カメラID: %dカメラå: %sデãƒã‚¤ã‚¹: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "スレッド %dã®ã‚¹ãƒˆãƒªãƒ¼ãƒ ãƒãƒ¼ãƒˆç•ªå· %dã¯ã€åˆ¶å¾¡ãƒãƒ¼ãƒˆã¨ç«¶åˆã—ã¦ã„ã¾ã™" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "スレッド %dã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã¯ç„¡åйã§ã™" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "スレッド %dã®ã‚¹ãƒˆãƒªãƒ¼ãƒ ãƒãƒ¼ãƒˆç•ªå· %dãŒ,スレッド %dã¨ç«¶åˆã—ã¦ã„ã¾ã™" #: src/motion.c msgid "Restarting motion." msgstr "motionã‚’å†é–‹ä¸­ã§ã™" #: src/motion.c msgid "Motion restarted" msgstr "モーションをå†é–‹ã—ã¾ã—ãŸ" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "スレッド %d - Watchdogタイムアウト.グレースフルリスタートを試行中ã§ã™" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "スレッド %d - Watchdogタイムアウトã¯å†èµ·å‹•ã›ãš,強制終了ã—ã¾ã—ãŸ!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "スレッド %d - スレッドをクリーニング中ã§ã™" #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "DEBUG-1スレッド %dを実行中モーションスレッド %dを実行中ã€çµ‚了 %d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "スレッドã®çµ‚了を待ã£ã¦ã„ã¾ã™ã€pid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "モーションスレッド %dã®å†èµ·å‹•" #: src/motion.c msgid "Threads finished" msgstr "スレッドãŒçµ‚了ã—ã¾ã—ãŸ" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "ãƒ¢ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ­¢ã—ã¾ã—ãŸ" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "無効ãªURL.値を解æžã§ãã¾ã›ã‚“" #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "カメラãƒãƒ³ãƒ‰ãƒ©ã‚¹ãƒ¬ãƒƒãƒ‰[%d]ãŒé–‹å§‹ã—ã¾ã—ãŸ" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "存続時間ãŒçµŒéŽã—ãŸãŸã‚ã€Netcamソケットを閉ã˜ã¾ã™(カメラã¯Closeフィールドをé€" "ä¿¡ã—ã¾ã—ãŸ).å†æŽ¥ç¶šãŒç™ºç”Ÿã™ã‚‹ã¯ãšã§ã™" #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "カメラをå†åº¦é–‹ãã¾ã™(éžã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°)" #: src/netcam.c msgid "camera re-connected" msgstr "カメラãŒå†æŽ¥ç¶šã•れã¾ã—ãŸ" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "èªè­˜ã•れãªã„ç”»åƒãƒ˜ãƒƒãƒ€(%d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "ヘッダã®ã‚¨ãƒ©ãƒ¼(%d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "カメラをå†åº¦é–‹ã(ストリーミング)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "JPEGç”»åƒã®å–得エラー" #: src/netcam.c msgid "Trying to re-connect" msgstr "å†æŽ¥ç¶šã‚’è©¦è¡Œä¸­ã§ã™" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "ãƒãƒƒãƒˆã‚«ãƒ  カメラãƒãƒ³ãƒ‰ãƒ©ãƒ¼: 設定完了,終了" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "カメラãƒãƒ³ãƒ‰ãƒ©ãƒ¼ã‹ã‚‰å¿œç­”ãŒã‚りã¾ã›ã‚“ - æ—¢ã«åœæ­¢ã—ã¦ã„ã¾ã™" #: src/netcam.c msgid "called with no data in buffer" msgstr "ãƒãƒƒãƒ•ã‚¡ã«ãƒ‡ãƒ¼ã‚¿ãªã—ã§å‘¼ã³å‡ºã•れã¾ã™" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "カメラ(%s)ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚«ãƒ¡ãƒ©ã‚’é–‹å§‹ã—ã¦ã„ã¾ã™" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "無効ãªãƒãƒƒãƒˆã‚«ãƒ  プロキシ(%s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "ユーザーå/パスワードã¯ãƒ—ロキシURLã§è¨±å¯ã•れã¦ã„ã¾ã›ã‚“" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "無効ãªãƒãƒƒãƒˆã‚«ãƒ  サービス '%s'" #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "カメラ(%s)ã®ãƒãƒƒãƒˆã‚«ãƒ URLãŒç„¡åйã§ã™" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "ãƒãƒƒãƒˆã‚«ãƒ  httpパラメーター '%s'ã¯ãƒ•ラグã«å¤‰æ›ã•れã¾ã™: HTTP/1.0: %s " "HTTP/1.1: %s Keep-Alive %s" #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "ç¾åœ¨,netcam setup html()を呼出中ã§ã™" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "ç¾åœ¨,netcam setup ftpを呼出中ã§ã™" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "ç¾åœ¨,netcam setup file()を呼出中ã§ã™" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "ç¾åœ¨,netcam setup mjpg()を呼出中ã§ã™" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "" "無効ãªãƒãƒƒãƒˆã‚«ãƒ¡ãƒ©ã‚µãƒ¼ãƒ“ス '%s' - mjpegã€ftpã€mjpgã€ã¾ãŸã¯jpegã§ã‚ã‚‹å¿…è¦ãŒã‚" "りã¾ã™" #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "最åˆã®ç”»åƒã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—㟠- retval: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "最åˆã®ãƒ•レームã§libjpegã®è§£å‡ã«å¤±æ•—ã—ã¾ã—㟠- 破棄ã•れã¾ã™!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "å¹…/高ã•(%dx%d)ã¯8ã®å€æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "カメラãƒãƒ³ãƒ‰ãƒ©ã‚¹ãƒ¬ãƒƒãƒ‰ã®é–‹å§‹ã‚¨ãƒ©ãƒ¼[%d]" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "ftpã§recvãŒå¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "サーãƒãƒ¼ã®å¿œç­”: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "FTPé€ä¿¡ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "ftpã§é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸpasswdã‚’é€ä¿¡ã—ã¾ã™" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "ftp quitã§é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "gethostbynameãŒFTP接続ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "FTP接続ã§ã®gethostbynameアドレスã®ä¸ä¸€è‡´" #: src/netcam_ftp.c msgid "socket failed" msgstr "ソケットãŒå¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "接続を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "匿åã§ACCTã‚’è¦æ±‚ã™ã‚‹FTPサーãƒãƒ¼" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "ソケットオプションSO REUSEADDRã®è¨­å®š" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "FTP接続ã§é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "PASVã¸ã®ç„¡åйãªå›žç­”" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "データ接続ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_ftp.c msgid "bind failed" msgstr "ãƒã‚¤ãƒ³ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_ftp.c msgid "listen failed" msgstr "listenã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "ftp getソケットã§é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "ftp get socketã§å—ã‘入れã¾ã™" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "ftpã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "ftp get socket failed" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "TYPE Iã‚’FTPサーãƒãƒ¼ã«é€ä¿¡ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "䏿­£ãªãƒˆãƒ¼ã‚¯ãƒ³Content-Lengthã§ã‚ã‚‹ãŒå€¤ %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "コンテンツ長 %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "コンテンツタイプ %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "ç”»åƒãƒ˜ãƒƒãƒ€ã®èª­ã¿å–りエラーã€ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ¢ãƒ¼ãƒ‰(1).ヌルヘッダ" #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "ç”»åƒãƒ˜ãƒƒãƒ€ã®èª­ã¿å–りエラーã€ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ¢ãƒ¼ãƒ‰(1).䏿˜Žãªãƒ˜ãƒƒãƒ€ '%s'" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "ç”»åƒãƒ˜ãƒƒãƒ€ã®èª­ã¿å–りエラー(2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "JPEGã§ã¯ãªã„ヘッダ" #: src/netcam_http.c msgid "Content-Length 0" msgstr "コンテンツ長0" #: src/netcam_http.c msgid "Found image header record" msgstr "ç”»åƒãƒ˜ãƒƒãƒ€ãƒ¬ã‚³ãƒ¼ãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "「接続ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®é€ä¿¡ã‚¨ãƒ©ãƒ¼" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "最åˆã®ãƒ˜ãƒƒãƒ€('%s')ã‚’å—ä¿¡ã—ã¾ã—ãŸ" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "最åˆã®ãƒ˜ãƒƒãƒ€ã®èª­ã¿å–りエラー(%s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "HTTPçµæžœã‚³ãƒ¼ãƒ‰ %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "" "明らã‹ã«HTTP接続ãŒé–‰ã˜ã‚‰ã‚ŒãŸãŸã‚ã€netcam Keep-Aliveフラグを削除ã—ã¾ã—ãŸ" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "éžã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚«ãƒ¡ãƒ©(キープアライブセット)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "éžã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚«ãƒ¡ãƒ©(キープアライブã¯è¨­å®šã•れã¦ã„ã¾ã›ã‚“)" #: src/netcam_http.c msgid "Streaming camera" msgstr "ストリーミングカメラ" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "境界文字列[%s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "ヘッダã«å¢ƒç•Œæ–‡å­—列ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "" "ãŠãらãMJPGブロックを使用ã™ã‚‹ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚«ãƒ¡ãƒ©.mjpg://ã®ä½¿ç”¨ã‚’検討ã—ã¦ã" "ã ã•ã„netcamã®URL" #: src/netcam_http.c msgid "Unrecognized content type" msgstr "èªè­˜ã•れãªã„コンテンツタイプ" #: src/netcam_http.c msgid "Content-length present" msgstr "コンテンツã®é•·ã•" #: src/netcam_http.c msgid "Content-length 0" msgstr "コンテンツ長0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "見ã¤ã‹ã£ãŸæŽ¥ç¶š: ヘッダを閉ã˜ã‚‹('%s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "" "「Connection:Keep-Aliveã€ãŠã‚ˆã³ã€ŒConnection:closeã€ãƒ˜ãƒƒãƒ€ã®ä¸¡æ–¹ãŒå—ä¿¡ã•れã¾ã—" "ãŸ.Motionã¯ã‚­ãƒ¼ãƒ—アライブを削除ã—ã¾ã™" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "" "「Connection:Keep-Aliveã€ãŠã‚ˆã³ã€ŒConnection:closeã€ãƒ˜ãƒƒãƒ€ã®ä¸¡æ–¹ãŒå—ä¿¡ã•れã¾ã—" "ãŸ.å‹•ãã¯å¤‰ã‚りã¾ã›ã‚“" #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "ã“ã®ä¸€é€£ã®ãƒ˜ãƒƒãƒ€ã§ã‚­ãƒ¼ãƒ—アライブフィールドをå—ä¿¡ã—ã¾ã—ãŸ" #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "「接続:キープアライブã€ãƒ˜ãƒƒãƒ€ã‚‚「接続:é–‰ã˜ã‚‹ã€ãƒ˜ãƒƒãƒ€ã‚‚å—ä¿¡ã—ã¾ã›ã‚“ã§ã—ãŸ.\n" "Motionã¯ã‚­ãƒ¼ãƒ—アライブを削除ã—ã¾ã™" #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "「接続:キープアライブã€ãƒ˜ãƒƒãƒ€ã‚‚「接続:é–‰ã˜ã‚‹ã€ãƒ˜ãƒƒãƒ€ã‚‚å—ä¿¡ã—ã¾ã›ã‚“ã§ã—ãŸ.\n" "å‹•ãã¯å¤‰ã‚りã¾ã›ã‚“" #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "「Connection:closeã€ãƒ˜ãƒƒãƒ€ã‚’å—ä¿¡ã—ãŸãŸã‚ã€netcam Keep-Aliveフラグを削除ã—ã¾ã—" "ãŸ.\n" "Netcamã¯ã‚­ãƒ¼ãƒ—アライブをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“.å‹•ãã¯éžã‚­ãƒ¼ãƒ—アライブã§ç¶™ç¶šã—ã¾" "ã™" #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "ã‚­ãƒ¼ãƒ—ã‚¢ãƒ©ã‚¤ãƒ–ãŒæœ‰åŠ¹æœŸé–“ã®çµ‚ã‚りã«é”ã—ã¾ã—ãŸ.\n" "Motionã¯netcamã‚’é–‰ã˜ã€æ–°ã—ã„ソケットã§Keep-Aliveã‚’å†é–‹ã—ã¾ã™" #: src/netcam_http.c msgid "disconnect" msgstr "切断ã™ã‚‹" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo()ãŒå¤±æ•—ã—ã¾ã—ãŸ(%s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "netcamã®åˆ‡æ–­(1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "キープアライブãŒè¨­å®šã•れã¦ã„ãªã„ãŸã‚ã€netcamを切断ã—ã¦ã„ã¾ã™" #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "キープアライブãªã—ã§ã€ã‚½ã‚±ãƒƒãƒˆã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "キープアライブãªã—ã§ã€æ–°ã—ã„ソケットã¯fd %dを作æˆã—ã¾ã—ãŸ" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "キープアライブãŒè¨­å®šã•れã¦ã„ã¦ã€ç„¡åйãªã‚½ã‚±ãƒƒãƒˆ.ã“れãŒåˆã‚ã¦ã®å¯èƒ½æ€§ãŒã‚りã¾" "ã™.作æˆã™ã‚‹æ–°ã—ã„ã‚‚ã®ã¯å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "" "キープアライブãŒè¨­å®šã•れã€ç„¡åйãªã‚½ã‚±ãƒƒãƒˆãŒã‚りã¾ã™.ã“れã¯åˆã‚ã¦ã®å ´åˆã€æ–°ã—ã„" "fd %dã‚’æŒã¤ã‚‚ã®" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "SO KEEPALIVE㯠%sã§ã™" #: src/netcam_http.c msgid "ON" msgstr "ã«" #: src/netcam_http.c msgid "OFF" msgstr "オフ" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "SO KEEPALIVEãŒã‚½ã‚±ãƒƒãƒˆã«è¨­å®šã•れã¾ã—ãŸ" #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "ソケット上ã®fcntl(1)" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "ソケット上ã®fcntl(2)" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "connect()ãŒå¤±æ•—ã—ã¾ã—ãŸ(%d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "ãƒãƒƒãƒˆã‚«ãƒ¡ãƒ©ã®åˆ‡æ–­(4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "connect()ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "netcamã®åˆ‡æ–­(2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "接続後ã®getsockopt" #: src/netcam_http.c msgid "connect returned error" msgstr "接続ãŒã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ã¾ã—ãŸ" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "netcamã®åˆ‡æ–­(3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "[%d/%d]ã‹ã‚‰[%d/%d]ãƒã‚¤ãƒˆã«ãƒãƒƒãƒ•ァーを拡張ã—ã¾ã™" #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "潜在的ãªåˆ†å‰²å¢ƒç•Œ- %d文字ãŒãƒ•ラッシュã•れ〠%dãŒå†é…ç½®ã•れã¾ã—ãŸ" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "境界文字列ã®å¾Œã«recv()ãŒå¤±æ•—ã™ã‚‹" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "ãƒãƒƒãƒˆã‚«ãƒ¡ãƒ©ã‚’接続ã—ãŸã¾ã¾ã«ã—ã¾ã™" #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "接続ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€æ™‚間# %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "カメラを開ã‘ã¾ã›ã‚“ã§ã—ãŸ-設定を確èªã—ã€ãƒãƒƒãƒˆã‚«ãƒ¡ãƒ©ãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã‚ã‚‹ã“ã¨ã‚’確" "èªã—ã¦ãã ã•ã„" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "最åˆã®ãƒ˜ãƒƒãƒ€ã®èª­ã¿å–りエラー-å†è©¦è¡Œ" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "最åˆã®ã‚«ãƒ¡ãƒ©ãƒ˜ãƒƒãƒ€ã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ-今ã®ã¨ã“ã‚ã‚ãらã‚ã¾ã™" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "Netcamã«ã¯ãƒ•ラグãŒã‚りã¾ã™:HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s" #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "" "プロキシセットãŒåŽŸå› ã§netcamキープアライブフラグを削除ã—ã¾ã—ãŸ.生ãç¶šã‘ã‚‹" #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "最åˆã®ã‚¹ãƒˆãƒªãƒ¼ãƒ ãƒ˜ãƒƒãƒ€ã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ-今ã®ã¨ã“ã‚ã‚ãらã‚ã¾ã™" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "接続ã•れã€ç”»åƒã‚’読ã¿å–りã¾ã™" #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "読ã¿å–りエラー.å†æŽ¥ç¶šã‚’è©¦è¡Œã—ã¦ã„ã¾ã™" #: src/netcam_http.c msgid "lost the cam." msgstr "カメラを見失ã„ã¾ã—ãŸ" #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‹ã‚‰ã®[%d]ãƒã‚¤ãƒˆã§è£œå……ã•れãŸãƒãƒƒãƒ•ã‚¡" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "[%d/%d]ヘッダãƒã‚¤ãƒˆã‚’読ã¿å–りã¾ã™" #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "無効ãªãƒ˜ãƒƒãƒ€ã‚’å—ä¿¡ã—ã¾ã—ãŸã€å†æŽ¥ç¶šã—ã¦ã„ã¾ã™" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "読ã¿å–り[%d/%d]ãƒãƒ£ãƒ³ã‚¯ãƒã‚¤ãƒˆã€åˆè¨ˆ[%d/%d]" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "ãƒãƒ£ãƒ³ã‚¯ãŒå®Œäº†ã—ã€ãƒãƒƒãƒ•ã‚¡ãŒä½¿ç”¨ã•れã¾ã—ãŸ[%d]ãƒã‚¤ãƒˆ" #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "イメージãŒå®Œäº†ã—ã¾ã—ãŸã€ä½¿ç”¨ã•れãŸãƒãƒƒãƒ•ァー[%d]ãƒã‚¤ãƒˆ" #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "接続ã—ã€MJPGãƒãƒ£ãƒ³ã‚¯ã®èª­ã¿å–りã¨ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚’ç¶šã‘ã¾ã™" #: src/netcam_http.c msgid "Begin" msgstr "ベギン" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "stat(%s)エラー" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [%d]!=最後ã®st mtime [%d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "æ–°ã—ã„ファイルイメージã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’待機ã—ã¦ã„ã¾ã™" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "æ–°ã—ã„ファイル画åƒã‚’å¾…ã¤é…å»¶" #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "æ–°ã—ã„ファイル画åƒã®å‡¦ç†-st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "オープン(%s)エラー: %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "読ã¿å–り(%s)エラー: %d" #: src/netcam_http.c msgid "End" msgstr "終了" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> file-> path %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "netcamã‹ã‚‰ã®å分ãªãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã›ã‚“" #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> jpegエラー %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "***æ–°ã—ã„写真ã®é…å»¶ãŒæˆåŠŸã—ã¾ã—ãŸ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "jpegエラー %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "jpegç”»åƒã®å‡¦ç†-コンテンツã®é•·ã• %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "JPEGç”»åƒã¨ã‚«ãƒ¡ãƒ©ã®å¹…/高ã•ã®ä¸ä¸€è‡´-予想ã•れる %dx %dã€JPEG %dx %dretval %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s: パケットé…列ã®ã‚µã‚¤ã‚ºã‚’ %dã«å¤‰æ›´ã—ã¾ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s: AVコピーパケット: %sã€å‰²ã‚Šè¾¼ã¿: %s" #: src/netcam_rtsp.c msgid "True" msgstr "真実" #: src/netcam_rtsp.c msgid "False" msgstr "é–“é•ã„" # msgid "True" # msgstr "真" # msgid "False" # msgstr "å½" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: 無効ãªãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚€ãƒ‘ケットを無視ã—ã¾ã™" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: 記録フレームエラー: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "無効ãªãƒ‡ãƒ¼ã‚¿ã‚’æŒã¤ãƒ‘ケットを無視ã™ã‚‹" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "パケットã®ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚¨ãƒ©ãƒ¼: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "%s: デコードã•れãŸHWをシステムメモリã«è»¢é€ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "コーデックã¸ã®ãƒ‘ケットé€ä¿¡ã‚¨ãƒ©ãƒ¼: %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "ビデオパケットã®ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚¨ãƒ©ãƒ¼:ãƒãƒƒãƒ•ã‚¡ã¸ã®ã‚³ãƒ”ー" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: HWデãƒã‚¤ã‚¹:" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s(利用å¯èƒ½)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s(実装ã•れã¦ã„ã¾ã›ã‚“)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s: netcamデコーダー %sãŒç„¡åйã«ãªã£ã¦ã„ã¾ã™" #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "vaapipixå½¢å¼ã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "cudapixå½¢å¼ã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s: 中断ã•れã¾ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: 失敗ã—ã¾ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s: デコーダー %sãŒæ©Ÿèƒ½ã—ã¾ã›ã‚“ã§ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "%s: ユーザーãŒè¦æ±‚ã—ãŸãƒ‡ã‚³ãƒ¼ãƒ€ãƒ¼ã‚’無視ã—ã¦å‰Šé™¤ã—ã¾ã™ %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s: vaapiãƒ‡ã‚³ãƒ¼ãƒ€ãƒ¼ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: vaapiãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ‡ãƒã‚¤ã‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s: cudaãƒ‡ã‚³ãƒ¼ãƒ€ãƒ¼ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: cudaãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ‡ãƒã‚¤ã‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s: ãƒ‡ã‚³ãƒ¼ãƒ€ãƒ¼ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s: デコーダー %sを使用" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: デコーダーãŒé–‹ãã¾ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s: カメラ読ã¿å–り(%s)ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s: カメラ(%s)ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "swsframeを割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "swsframeを割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "スケーリングコンテキストを割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "フレームアウトã®ã‚µã‚¤ã‚ºã®æ±ºå®šã‚¨ãƒ©ãƒ¼" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "ピクãƒãƒ£ã®å‰²ã‚Šå½“ã¦ã‚¨ãƒ©ãƒ¼: %s" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "ç”»åƒã®å‰²ã‚Šå½“ã¦ã‚¨ãƒ©ãƒ¼: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "サイズ変更/å†ãƒ•ォーマット中ã®ã‚¨ãƒ©ãƒ¼: %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "出力ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒ•レームã®å‡ºåŠ›ã‚¨ãƒ©ãƒ¼: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s: 中断" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: av読ã¿å–りフレーム: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: カメラ %d ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã—よã†ã¨ã—ã¦ã„ã¾ã™" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "%s: キャプãƒãƒ£ãƒ¬ãƒ¼ãƒˆãŒnetcamãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã§æŒ‡å®šã•れã¦ã„ã¾ã›ã‚“. %dã®ä½¿ç”¨" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s: キャプãƒãƒ£ãƒ¬ãƒ¼ãƒˆãŒnetcamãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã§æŒ‡å®šã•れã¦ã„ã¾ã›ã‚“.フレームレート %d" "を使用ã™ã‚‹" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚«ãƒ¡ãƒ©ã¯åˆ¥ã®ç”»åƒã‚’é€ä¿¡ã—ã¦ã„ã¾ã™" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "è¨­å®šã§æŒ‡å®šã•れãŸã‚µã‚¤ã‚ºã‚ˆã‚Šã‚‚大ãã„" #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "ç•°ãªã‚‹ç”»åƒå½¢å¼.写真ã¯" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "YUV420Pã«ã€è¦æ±‚ã•れãŸã‚µã‚¤ã‚ºã«ãƒˆãƒ©ãƒ³ã‚¹ã‚³ãƒ¼ãƒ‰ã•れã¾ã™" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "設定ファイル内.å¯èƒ½ã§ã‚れã°ã€netcamã‚’" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "YUV420På½¢å¼ã§ã‚りã€ã‚µã‚¤ã‚ºã¯" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "ãŠãらãCPU使用率を下ã’ã‚‹ãŸã‚ã®è¨­å®š" #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã§æŒ‡å®šã•れãŸã‚µã‚¤ã‚ºã‚ˆã‚Šã‚‚大ãã„" #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "ç”»åƒã¯ã‚µã‚¤ã‚ºã«å¤‰æ›ã•れã¦ã„ã¾ã™" #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "設定ã§è¦æ±‚ã•れã¾ã—ãŸ.å¯èƒ½ã§ã‚れã°å¤‰æ›´" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "åŒã˜ã‚µã‚¤ã‚ºã‚’示ã™ãƒãƒƒãƒˆã‚«ãƒ¡ãƒ©ã¾ãŸã¯è¨­å®š" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "ãŠãらãCPU使用率を下ã’ã‚‹ãŸã‚" #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "Netcam: %dx %d =>設定: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "é€ä¿¡ã•れãŸç”»åƒã¯" #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "YUV420Pã«ãƒˆãƒ©ãƒ³ã‚¹ã‚³ãƒ¼ãƒ‰ã•れã¾ã™.å¯èƒ½ã§ã‚れã°ã€netcamを変更ã—ã¾ã™" #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "CPU使用率を下ã’ã‚‹ãŸã‚ã®YUV420Pã¸ã®ç”»åƒãƒ•ォーマット" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: rtsp/rtmpを設定ã—ã¦ã„ã¾ã™" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: 入力フォーマットmjpegã®è¨­å®š" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: 入力フォーマットã®è¨­å®švideo4linux2" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: 動画ファイルã®è¨­å®š" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s: %sã®è¨­å®š" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: オプション: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "netcamを介ã—ãŸv4l2ã®ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "netcam経由ã§ãƒ•ァイルを設定ã™ã‚‹" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "netcam経由㧠%sを設定ã™ã‚‹" #: src/netcam_rtsp.c msgid "highres" msgstr "高解åƒåº¦" #: src/netcam_rtsp.c msgid "norm" msgstr "ノルム" # msgid "norm" # msgstr "è¦ç¯„" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "%sストリームを設定ã—ã¦ã„ã¾ã™" #: src/netcam_rtsp.c msgid "Unknown" msgstr "未知ã®" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "パススルー用ã«ã‚³ãƒ”ーã•れãŸã‚¹ãƒˆãƒªãƒ¼ãƒ " #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "æŽ¥ç¶šã«æ¸¡ã•れãŸãƒŒãƒ«ãƒ‘ス" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s: カメラを開ãã“ã¨ãŒã§ãã¾ã›ã‚“(%s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s: カメラを開ãã¾ã—ãŸ(%s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s: ストリーム情報ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s: コーデックコンテキストを開ã‘ã¾ã›ã‚“: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s: カメラã®ç”»åƒã‚µã‚¤ã‚ºãŒç„¡åйã§ã™" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s: フレームを割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s: パススルー用ã®ã‚¹ãƒˆãƒªãƒ¼ãƒ ã®ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s: 最åˆã®ç”»åƒã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s: カメラ(%s)ãŒæŽ¥ç¶šã•れã¾ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s: Netcamã®ã‚­ãƒ£ãƒ—ãƒãƒ£ãƒ¬ãƒ¼ãƒˆã¯ %d ã§ã™" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s: カメラソース㯠%d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s: カメラã®ã‚½ãƒ¼ã‚¹FPSを特定ã§ãã¾ã›ã‚“" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s: キャプãƒãƒ£ãƒ¬ãƒ¼ãƒˆãŒã‚«ãƒ¡ãƒ©ã®FPSよりも低ããªã£ã¦ã„ã¾ã™" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s: デコードエラーãŒç™ºç”Ÿã—ã¾ã™" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "%s: カメラã®FPSよりã‚ãšã‹ã«å¤§ãã„キャプãƒãƒ£ãƒ¬ãƒ¼ãƒˆã‚’ãŠå‹§ã‚ã—ã¾ã™" #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s: カメラã«å†æŽ¥ç¶šã—ã¦ã„ã¾ã™..." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s: カメラã¯å†æŽ¥ç¶šã—ã¾ã›ã‚“ã§ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s:10ç§’ã”ã¨ã«ã‚«ãƒ¡ãƒ©ã‚’確èªã—ã¦ã„ã¾ã™" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s: カメラãƒãƒ³ãƒ‰ãƒ©ã‚¹ãƒ¬ãƒƒãƒ‰[%d]ãŒé–‹å§‹ã—ã¾ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s: ãƒãƒ³ãƒ‰ãƒ©ãƒ¼ãƒ«ãƒ¼ãƒ—ãŒçµ‚了ã—ã¾ã—ãŸ" #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s: ãƒãƒ³ãƒ‰ãƒ©ã‚¹ãƒ¬ãƒƒãƒ‰ã®é–‹å§‹ã‚¨ãƒ©ãƒ¼" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s: ãƒãƒ³ãƒ‰ãƒ©ãƒ¼ã‹ã‚‰ã®æœ€åˆã®ç”»åƒã‚’待機ã—ã¦ã„ã¾ã™" #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "rtspコンテキストを作æˆã§ãã¾ã›ã‚“" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "rtspãƒã‚¤ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’作æˆã§ãã¾ã›ã‚“" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "FFmpegã®ã‚µãƒãƒ¼ãƒˆãªã—" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s: ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚«ãƒ¡ãƒ©ã‚’シャットダウンã—ã¦ã„ã¾ã™" #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s: ãƒãƒ³ãƒ‰ãƒ©ã‚¹ãƒ¬ãƒƒãƒ‰ã‹ã‚‰å¿œç­”ãŒã‚りã¾ã›ã‚“" #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "通常ã®è§£æ±ºç­–:シャットダウンãŒå®Œäº†ã—ã¾ã—ãŸ" #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "高解åƒåº¦: シャットダウンãŒå®Œäº†ã—ã¾ã—ãŸ" #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "EXIFã‚’webpãƒãƒ£ãƒ³ã‚¯ã«è¨­å®šã§ãã¾ã›ã‚“" #: src/picture.c msgid "libwebp version error" msgstr "libwebpãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚¨ãƒ©ãƒ¼" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "libwebpイメージãƒãƒƒãƒ•ァー割り当ã¦ã‚¨ãƒ©ãƒ¼" #: src/picture.c msgid "libwebp image compression error" msgstr "libwebpç”»åƒåœ§ç¸®ã‚¨ãƒ©ãƒ¼" #: src/picture.c msgid "unable to assemble webp image" msgstr "webpイメージを組ã¿ç«‹ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" #: src/picture.c msgid "unable to save webp image to file" msgstr "webpイメージをファイルã«ä¿å­˜ã§ãã¾ã›ã‚“" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "ファイル %sã«ç”»åƒã‚’書ãè¾¼ã‚ã¾ã›ã‚“-ターゲットディレクトリã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã‚’確èª" "ã—ã¦ãã ã•ã„\n" "ã“ã®è‡´å‘½çš„ãªã‚¨ãƒ©ãƒ¼ã«ã‚ˆã‚Šã€ã‚¹ãƒ¬ãƒƒãƒ‰ã¯çµ‚了ã—ã¾ã™" #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "ファイル %sã«ç”»åƒã‚’書ãè¾¼ã‚ã¾ã›ã‚“" #: src/picture.c msgid "Error getting PGM vars." msgstr "PGM 変数ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "ã“れã¯pgmファイルã§ã¯ãªãã€ã€Œ %sã€ã§å§‹ã¾ã‚Šã¾ã™" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "マジック %s: å¹… %s(%d): 高㕠%s(%d): MaxVal: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "pgmファイルã‹ã‚‰ã®ç”»åƒãƒ‡ãƒ¼ã‚¿ã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "指定ã•れãŸãƒžã‚¹ã‚¯ãƒ•ァイルã¯ã€ã‚«ãƒ¡ãƒ©ã‹ã‚‰ã®ç”»åƒã¨åŒã˜ã‚µã‚¤ã‚ºã§ã¯ã‚りã¾ã›ã‚“" #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "マスクイメージã®ã‚µã‚¤ã‚ºã‚’ %dx %dã‹ã‚‰ %dx %dã«å¤‰æ›´ã—よã†ã¨ã—ã¦ã„ã¾ã™" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "" "マスクファイル %sを書ãè¾¼ã‚ã¾ã›ã‚“-ターゲットディレクトリã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã‚’確èª" "ã—ã¦ãã ã•ã„" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "マスクファイル %sを書ãè¾¼ã‚ã¾ã›ã‚“" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "デフォルトã®ãƒžã‚¹ã‚¯ã‚’pgmファイルã¨ã—ã¦æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "空ã®ãƒžã‚¹ã‚¯ %sを作æˆã—ã¦ã„ã¾ã™\n" "ã“ã®ãƒ•ァイルを編集ã—ã¦ãƒ¢ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†å®Ÿè¡Œã—ã€ãƒžã‚¹ã‚¯æ©Ÿèƒ½ã‚’有効ã«ã—ã¦ãã ã•ã„" #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "設定オプション\"rotate \"ã¯90ã®å€æ•°ã§ã¯ã‚りã¾ã›ã‚“: %d" #: src/track.c msgid "internal error" msgstr "内部エラー" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "内部エラー〠%huã¯æ—¢çŸ¥ã®ãƒˆãƒ©ãƒƒã‚¯ã‚¿ã‚¤ãƒ—ã§ã¯ã‚りã¾ã›ã‚“" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "ãƒãƒ¼ãƒˆ %s dev fd %iã€ãƒ¢ãƒ¼ã‚¿ãƒ¼ %huコマンド %huデータ %hu" #: src/track.c msgid "Status byte timeout!" msgstr "ステータスãƒã‚¤ãƒˆã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "シリアルデãƒã‚¤ã‚¹ %sã‚’é–‹ã„ã¦ã¿ã¦ãã ã•ã„" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "シリアルデãƒã‚¤ã‚¹ %sã‚’é–‹ã‘ã¾ã›ã‚“" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "シリアルデãƒã‚¤ã‚¹ %sã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "シリアルデãƒã‚¤ã‚¹ %sã‚’é–‹ã„ã¦åˆæœŸåŒ–ã€fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "デãƒã‚¤ã‚¹ %sã¯ã¾ã é–‹å§‹ã•れã¦ã„ã¾ã›ã‚“.ステッパーcenter()を試行ã—ã¦ã„ã¾ã™" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "%sã€fd [%i]ã®ã‚¹ãƒ†ãƒƒãƒ‘ーデãƒã‚¤ã‚¹ã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "æˆåŠŸã€ãƒ‡ãƒã‚¤ã‚¹ã¯ %sã€fd [%i]ã‚’é–‹å§‹ã—ã¾ã—ãŸ" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "ãƒãƒ¼ãƒˆ %s dev fd %iã€ãƒ¢ãƒ¼ã‚¿ãƒ¼ %huコマンド %huデータ %huã‚’é€ä¿¡ã—ã¾ã™" #: src/track.c #, c-format msgid "Command return %d" msgstr "コマンドリターン %d" #: src/track.c msgid "Problem opening servo!" msgstr "サーボを開ã‘ãªã„!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent->x %dã€cent->y %dã€reversex %dã€reversey %d 手動 %d" # msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" # msgstr "cent->x %dã€cent-> y %dã€reversex %dã€reversey %d手動 %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d値ãŒç¯„囲外ã§ã™!(%d - %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d値ãŒç¯„囲外ã§ã™!(%d - %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "Xオフセット %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d コマンド" "%d" # msgid "" # "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " # "%d" # msgstr "" # "X cent->x %dã€cent-> y %dã€reversex %dã€reversey %d motorx %d data %dコマン" # "ド %d" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Yオフセット %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d モーター %d データ %d コマンド" "%d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "X オフセット %dã€Y オフセット %dã€X ä½ç½® %d。 y ä½ç½® %dã€é€† %dã€é€†" "%d ã€ã‚¹ãƒ†ãƒƒãƒ—サイズ %d" # msgid "" # "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " # "%d" # msgstr "" # "Yセント->x %dã€ã‚»ãƒ³ãƒˆ-> y %dã€reversex %dã€reversey %d motory %dデータ %dコ" # "マンド %d" # msgid "" # "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " # "%d , stepsize %d" # msgstr "" # "Xオフセット %dã€Yオフセット %dã€xä½ç½® %d.yä½ç½® %dã€é€†æ–¹å‘ %dã€é€†æ–¹å‘ %dã€ã‚¹" # "テップサイズ %d" #: src/track.c msgid "Return byte timeout!" msgstr "ãƒã‚¤ãƒˆã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’è¿”ã™!" #: src/track.c msgid "Unable to set camera speed" msgstr "カメラ速度を設定ã§ãã¾ã›ã‚“" #: src/track.c msgid "succeed" msgstr "æˆåŠŸ" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "pwcカメラを開始ä½ç½®ã«ãƒªã‚»ãƒƒãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ!ç†ç”±" #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "失敗 VIDIOCPWCMPTGRANGE" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "PWCカメラã®ãƒ‘ン/ティルトã«å¤±æ•—ã—ã¾ã—ãŸ!ç†ç”±" #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "UVCカメラを開始ä½ç½®ã«ãƒªã‚»ãƒƒãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ!ç†ç”±" #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "UVCカメラを開始ä½ç½®ã«ãƒªã‚»ãƒƒãƒˆä¸­" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl querycontrol" #: src/track.c msgid "Getting camera range" msgstr "カメラã®ç¯„囲をå–å¾—" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "入力パラメータ ABS ãƒ‘ãƒ³æœ€å° %dã€ãƒ‘ン最大 %dã€ãƒãƒ«ãƒˆæœ€å° %dã€ãƒãƒ«ãƒˆæœ€å¤§ %d" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "入力パラメータ ABS X エンジェル %dã€Y エンジェル %d" #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "SET ABS ã®å ´åˆ X %d を移動ã€Y %d を移動" # msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " # msgstr "" # "入力パラメータ絶対値 ãƒ‘ãƒ³æœ€å° %dã€ãƒ‘ン最大 %dã€ãƒ†ã‚£ãƒ«ãƒˆæœ€å° %dã€ãƒ†ã‚£ãƒ«ãƒˆæœ€å¤§ %d" # msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " # msgstr "入力パラメータABS Xエンジェル %dã€Yエンジェル %d" # msgid "For_SET_ABS move_X %d,move_Y %d" # msgstr "SET ABSã®å ´åˆã€X %dを移動ã€Y %dを移動" #: src/track.c msgid "Failed to move UVC camera!" msgstr "UVCカメラを移動ã§ãã¾ã›ã‚“ã§ã—ãŸ!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "MINMAX = %d ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "ABS Y Angelã®å‰:x = %dã€Y = %dã€" #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "ABS Y エンジェルã®å¾Œ : x= %d ã€Y= %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "SET REL ãƒ‘ãƒ³æœ€å° %dã€ãƒ‘ン最大 %dã€ãƒãƒ«ãƒˆæœ€å° %dã€ãƒãƒ«ãƒˆæœ€å¤§ %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "SET REL トラック パン エンジェル %dã€ãƒˆãƒ©ãƒƒã‚¯ ãƒãƒ«ãƒˆ エンジェル %d ã®å ´åˆ" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "SET REL ã®å ´åˆ X %d を移動ã€Y %d を移動" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr= %d, control S= %d, Wert= %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr "dev %d,addr= %d, コントロール S= %d, Wert= %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "REL Y エンジェルã®å‰: x= %d , Y= %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "REL Y エンジェルã®å¾Œ : x= %d , Y= %d" # msgid "After_ABS_Y_Angel : x= %d , Y= %d" # msgstr "後 絶対値 Y角度 : x= %d , Y= %d" # msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" # msgstr "SET RELã®å ´åˆã€ãƒ‘ãƒ³æœ€å° %d,パン最大 %d,ãƒ†ã‚£ãƒ«ãƒˆæœ€å° %d,ティルト最大 %d" # msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" # msgstr "SET RELトラックパンエンジェル %dã€ãƒˆãƒ©ãƒƒã‚¯ãƒãƒ«ãƒˆã‚¨ãƒ³ã‚¸ã‚§ãƒ« %d" # msgid "For_SET_REL move_X %d,move_Y %d" # msgstr "SET RELã®å ´åˆã€X %dを移動ã€Y %dを移動" # msgid " dev %d, addr= %d, control_S= %d, Wert= %d" # msgstr "dev %dã€addr = %dã€ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«S = %dã€Wert = %d" # msgid " dev %d,addr= %d, control_S= %d, Wert= %d" # msgstr "dev %dã€addr = %dã€ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«S = %dã€Wert = %d" # msgid "Before_REL_Y_Angel : x= %d , Y= %d" # msgstr "REL Y Angelã®å‰:x = %dã€Y = %d" # msgid "After_REL_Y_Angel : x= %d , Y= %d" # msgstr "REL Y Angelã®å¾Œ:x = %dã€Y = %d" #: src/translate.c msgid "Language: English" msgstr "言語:英語" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "%lluãƒã‚¤ãƒˆã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "" "警告!関数 %sã¯ã€ %pã®ãƒ¡ãƒ¢ãƒªãƒ–ロックã®ã‚µã‚¤ã‚ºã‚’0ãƒã‚¤ãƒˆã«å¤‰æ›´ã—よã†ã¨ã—ã¾ã™!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "オフセット %pã®ãƒ¡ãƒ¢ãƒªãƒ–ロックã®ã‚µã‚¤ã‚ºã‚’ %lluãƒã‚¤ãƒˆã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ(é–¢" "æ•° %s)!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "ディレクトリ %sã®ä½œæˆä¸­ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸ" #: src/util.c #, c-format msgid "creating directory %s" msgstr "ディレクトリ %sを作æˆã—ã¦ã„ã¾ã™" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "モード %sã§ãƒ•ァイル %sã‚’é–‹ãéš›ã®ã‚¨ãƒ©ãƒ¼" #: src/util.c msgid "Error closing file" msgstr "ファイルを閉ã˜ã‚‹éš›ã®ã‚¨ãƒ©ãƒ¼" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbeventid} ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。イベント ID を使用ã—ã¾ã™ã€‚" #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "無効ãªãƒ•ォーマット指定å­ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "スレッドå %sを設定ã§ãã¾ã›ã‚“" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "FFMPEGãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¤ã™ãŽã¾ã™.パススルー処ç†ã‚’無効ã«ã—ã¾ã™" #: src/util.c msgid "pass-through enabled." msgstr "ãƒ‘ã‚¹ã‚¹ãƒ«ãƒ¼ãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã™" #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "パラメータ設定エラー >%s<" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "è§£æžæ¸ˆã¿: >%s< >%s<" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "è§£æžæ¸ˆã¿:>編集済ã¿<>編集済ã¿<" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "parm nmコントロールã®è§£æžã‚¨ãƒ©ãƒ¼: %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "parm vlコントロールã®è§£æžã‚¨ãƒ©ãƒ¼: %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "温度設定エラー: %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "コントロールã®å†è§£æžã‚¨ãƒ©ãƒ¼: %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "è§£æž: %s" #: src/util.c msgid "Parsing: " msgstr "è§£æž: <編集済ã¿>" #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "コントロールã®è§£æžã‚¨ãƒ©ãƒ¼: %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "エラー: %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "æ–°ã—ã„netcamパラメータ: %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "æ–°ã—ã„netcamã®é«˜ãƒ‘ラメータ: %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "æ–°ã—ã„ビデオパラメータ: %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "æ–°è¦web制御 ヘッダ パラメータ: %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "æ–°è¦web制御 ヘッダ パラメータ: <編集済ã¿>" #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "æ–°ã—ã„ストリームヘッダパラメータ: %s" #: src/util.c msgid "New stream_header_params: " msgstr "æ–°ã—ã„ストリームヘッダパラメータ:<編集済ã¿>" #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "プログラミングエラー.䏿˜Žãªè¨­å®šã‚¢ã‚¤ãƒ†ãƒ :%s" #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE色相[%d]ã®è¨­å®šã‚¨ãƒ©ãƒ¼" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "[%d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE色相ã®å–得エラー" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT飽和ã®è¨­å®šã‚¨ãƒ©ãƒ¼[%d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT飽和ã®å–得エラー" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONTコントラスト設定エラー[%d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONTコントラストå–得エラー" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "METEORSBRIGè¼åº¦[%d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIGãŒæ˜Žã‚‹ã•ã‚’å–å¾—" #: src/video_bktr.c msgid "Not implemented" msgstr "実装ã•れã¦ã„ã¾ã›ã‚“" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "デãƒã‚¤ã‚¹å…¥åŠ› %dãŒç¯„囲外(0〜4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d無効-è¤‡åˆ %dを試行ã—ã¦ã„ã¾ã™" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "" "BT848SFMTã€å…¥åЛ形å¼ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ.デフォルトã§å†è©¦è¡Œã—ã¦ãã ã•ã„" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "BT848SFMTã€å…¥åЛ形å¼ã‚’デフォルトã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "ジオメトリを設定ã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "[%d/%d] ノルム %d ã¸" # msgid "to [%d/%d] Norm %d" # msgstr "[%d/%d]ノルム %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "無効ãªé »åº¦[%ld] ソース入力ã®å ´åˆ[%i]" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "周波数[%ld]ソース入力[%i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "入力を設定[%d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "入力フォーマットを設定[%d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "ジオメトリ[%d]x[%d]を設定ã—ã¾ã™" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "周波数セット(ã¾ã å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "ãƒãƒƒãƒ•ァーã®ã‚µã‚¤ã‚ºã‚’3å€ã«ã™ã‚‹" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "ãƒãƒƒãƒ•ァーを3/2xã«ã‚µã‚¤ã‚ºå¤‰æ›´ã™ã‚‹" #: src/video_bktr.c msgid "mmap failed" msgstr "mmapãŒå¤±æ•—ã—ã¾ã—ãŸ" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "å˜ä¸€ãƒ¡ã‚½ãƒƒãƒ‰ã‚¨ãƒ©ãƒ¼ã‚­ãƒ£ãƒ—ãƒãƒ£ã‚’使用ã™ã‚‹METEORCAPTUR" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "å˜ä¸€ãƒ¡ã‚½ãƒƒãƒ‰ã‚’使用ã—ãŸã‚¨ãƒ©ãƒ¼ã‚­ãƒ£ãƒ—ãƒãƒ£" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "ビデオデãƒã‚¤ã‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "ビデオデãƒã‚¤ã‚¹ %sã‚’é–‰ã˜ã¦ã„ã¾ã™" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "ã¾ã ãƒ“デオを%d人 使用中ã§ã™(device %s).今ã¯é–‰ã˜ã¾ã›ã‚“" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "設定ã•れãŸã‚¤ãƒ¡ãƒ¼ã‚¸ã®å¹…(%d)ãŒ8ã§å‰²ã‚Šåˆ‡ã‚Œã¾ã›ã‚“" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "設定ã•れãŸã‚¤ãƒ¡ãƒ¼ã‚¸ã®é«˜ã•(%d)ãŒ8ã§å‰²ã‚Šåˆ‡ã‚Œã¾ã›ã‚“" #: src/video_bktr.c msgid "Stopping capture" msgstr "キャプãƒãƒ£ã®åœæ­¢" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "入力(%s)ã®å†åˆ©ç”¨[%d,%d] キャプãƒãƒ£ã®å¤‰æ›´å‡¦ç† METEOR_CAP_SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "ビデオパレットYUV420P設定imgs.size normãŠã‚ˆã³imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "ビデオデãƒã‚¤ã‚¹ %sã‚’é–‹ãã¾ã™" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "ãƒãƒ¥ãƒ¼ãƒŠãƒ¼ãƒ‡ãƒã‚¤ã‚¹ %sã‚’é–‹ãã¾ã™" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "ç”»åƒãŒç ´æã—ã¦ã„ã¾ã™...続行" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "SOIã®ä½ç½®ãŒ%dãƒã‚¤ãƒˆã«èª¿æ•´ã—ã¾ã—ãŸ" #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "mmalcamクリーンアップã®å‘¼ã³å‡ºã—" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "ãƒãƒƒãƒˆã‚«ãƒ¡ãƒ©ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ã®å‘¼ã³å‡ºã—" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "netcam rtspクリーンアップã®å‘¼ã³å‡ºã—" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "V4L2デãƒã‚¤ã‚¹ã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "BKTRデãƒã‚¤ã‚¹ã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "カメラデãƒã‚¤ã‚¹ã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ãªã—(MMALã€Netcamã€V4L2ã€BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "MMALカムを開ã" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "MMALカムを開ã‘ã¾ã›ã‚“ã§ã—ãŸ" #: src/video_common.c msgid "Opening Netcam" msgstr "Netcamã‚’é–‹ã" #: src/video_common.c msgid "Netcam failed to open" msgstr "Netcamã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Netcam RTSPã‚’é–‹ã" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Netcam RTSPã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ" #: src/video_common.c msgid "Opening V4L2 device" msgstr "V4L2デãƒã‚¤ã‚¹ã‚’é–‹ã" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "V4L2デãƒã‚¤ã‚¹ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/video_common.c msgid "Opening BKTR device" msgstr "BKTRデãƒã‚¤ã‚¹ã‚’é–‹ã" #: src/video_common.c msgid "BKTR device failed to open" msgstr "BKTRデãƒã‚¤ã‚¹ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "カメラデãƒã‚¤ã‚¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“(MMALã€Netcamã€V4L2ã€BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "「 %sã€ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ" #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "ãƒãƒƒãƒ•ã‚¡ã®æŒ‡å®šã‚¨ãƒ©ãƒ¼: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "é–‹å§‹ãƒãƒƒãƒ•ã‚¡: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "読ã¿å–りãƒãƒƒãƒ•ã‚¡: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "ビデオデãƒã‚¤ã‚¹ '%s' %dãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "パイプ出力ã¨ã—㦠%sã‚’é–‹ãã¾ã—ãŸ" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "パイプ出力ã¨ã—ã¦ã® %sã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "オリジナルパイプ仕様" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "ææ¡ˆã•れãŸãƒ‘イプã®ä»•様" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "最終パイプ仕様" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "デãƒã‚¤ã‚¹ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "---------コントロール---------" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr "V4L2 IDã®åå‰ã¨ç¯„囲" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "ユーザー値ã®ãƒªã‚»ãƒƒãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "コントロール %s \"%s\" ã‚’ %d ã«è¨­å®šã—ãŸã¾ã¾ã«ã—ã¾ã™" #: src/video_v4l2.c msgid "Device not ready" msgstr "デãƒã‚¤ã‚¹ã®æº–å‚™ãŒã§ãã¦ã„ã¾ã›ã‚“" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "コントロール\"%s\"を値 %dã«è¨­å®šã—ã¾ã™" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "コントロール %s \"%s\" ã‚’ %d ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "%s 制御オプション値 %s ãŒæœ€å°å€¤ã‚’下回ã£ã¦ã„ã¾ã™.æœ€å° %d を使用 " #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "%s 制御オプション値 %s ãŒæœ€å¤§å€¤ã‚’è¶…ãˆã¦ã„ã¾ã™.最大 %d を使用 " #: src/video_v4l2.c msgid "control type not supported yet" msgstr "制御タイプã¯ã¾ã ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "VIDIOC_ENUMINPUT 入力をWEBCAM(-1)ã«ã™ã‚‹å ´åˆã€%dを指定ã§ãã¾ã›ã‚“" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "åå‰= \"%s\"ã€ã‚¿ã‚¤ãƒ—0x %08Xã€ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "åå‰= \"%s\",- TUNER" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "åå‰= \"%s\"- CAMERA" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "入力 %d VIDIOC_S_INPUTã®é¸æŠžæ™‚ã®ã‚¨ãƒ©ãƒ¼" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "デãƒã‚¤ã‚¹ã¯PAL/NTSC normã®æŒ‡å®šã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "-ビデオ標準 %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "標準メソッド %d VIDIOC_S_STD é¸æŠžæ™‚ã®ã‚¨ãƒ©ãƒ¼" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "ビデオ標準をNTSCã«è¨­å®š" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "ビデオ標準をSECAMã«è¨­å®š" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "ビデオ標準をPALã«è¨­å®š" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "ãƒãƒ¥ãƒ¼ãƒŠãƒ¼ %d VIDIOC_G_TUNER" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "ãƒãƒ¥ãƒ¼ãƒŠãƒ¼ %dを設定" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "周波数 %ul VIDIOC_S_FREQUENCY" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "周波数を%ulã¸è¨­å®š" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "%c%c%c%c (%dx%d) を使用ã§ãã¾ã›ã‚“" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "パレット %c%c%c%c (%dx%d)ã®ãƒ†ã‚¹ãƒˆä¸­" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "ストライド %d ã§ç”»åƒã‚µã‚¤ã‚º %dx%d ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "デãƒã‚¤ã‚¹ã‹ã‚‰ã‚¹ãƒˆãƒ©ã‚¤ãƒ‰å€¤ãŒæä¾›ã•れã¦ã„ã¾ã›ã‚“。" #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "å¹… (%d) ã¯ã‚¹ãƒˆãƒ©ã‚¤ãƒ‰ (%d) よりå°ã•ããªã‘れã°ãªã‚Šã¾ã›ã‚“" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "ç”»åƒã®å¹… (%d) ãŒã‚¹ãƒˆãƒ©ã‚¤ãƒ‰ (%d) ã®å€æ•°ã§ã¯ã‚りã¾ã›ã‚“" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "ä¸å¯èƒ½ãªæ¡ä»¶: å¹…(%d)ã€æ­©å¹…(%d)ã€æ­©å¹…(%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "ç”»åƒã®å¹…ã« %d ãƒã‚¤ãƒˆãŒåŸ‹ã‚è¾¼ã¾ã‚Œã¾ã™" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "è§£åƒåº¦ã‚’%ix%iã‹ã‚‰%ix%iã«èª¿æ•´ã—ã¾ã™" #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "8ã®å‰°ä½™ã¨ã—ãªã„è§£åƒåº¦ã¸èª¿æ•´ã—ã¾ã—ãŸ" #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "設定ファイルã¨ç•°ãªã‚‹ãƒ‘レットã¾ãŸã¯å¹…/高ã•を指定ã—ã¾ã™" #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "ピクセル形å¼ã®è¨­å®šã‚¨ãƒ©ãƒ¼ã€‚" #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "パレット %c%c%c%c (%dx%d)を使用ã—ã¾ã™" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "幅を調整(%d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "高ã•を調整(%d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "設定パレットã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹%d. (%s)寸法%dx%dã¯æ©Ÿèƒ½ã—ã¾ã›ã‚“" #: src/video_v4l2.c msgid "Supported palettes:" msgstr "サãƒãƒ¼ãƒˆã•れã¦ã„るパレット:" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d - %s(圧縮: %d)(%#x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "é¸æŠžã—ãŸãƒ‘レット %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "å½¢å¼ %sã®ãƒ‘ãƒ¬ãƒƒãƒˆé¸æŠžã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "äº’æ›æ€§ã®ã‚るパレット形å¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "メモリマップ用ã®ãƒãƒƒãƒ•ã‚¡ %dã®è¦æ±‚エラー.VIDIOC REQBUFS" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "mmap情報:frames = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "ãƒãƒƒãƒ•ァメモリãŒä¸è¶³ã—ã¦ã„ã¾ã™ %d %s< >%s< >%s<" msgstr "無効ãªã‚¢ã‚¯ã‚·ãƒ§ãƒ³ãŒè¦æ±‚ã•れã¾ã—ãŸ: >%s< >%s< >%s<" #: src/webu.c msgid "Native Language : on" msgstr "æ¯å›½èªž:オン" #: src/webu.c msgid "Native Language : off" msgstr "æ¯å›½èªž:オフ" #: src/webu.c msgid "Set the value to null/zero" msgstr "値をnull/ゼロã«è¨­å®šã—ã¾ã™" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "%s ã‹ã‚‰ã®æŽ¥ç¶šã‚’無視ã—ã¾ã™" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "%sã‹ã‚‰ã®èªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "web制御 user:pass ã¯ã‚りã¾ã›ã‚“" #: src/webu.c msgid "No stream user:pass provided" msgstr "ストリーム user:pass ã¯ã‚りã¾ã›ã‚“" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "無効ãªå¿œç­”" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "web制御ヘッダ %s %s ã®è¿½åР䏭ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "ストリームヘッダ %s %sã®è¿½åР䏭ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "無効ãªãƒ¡ã‚½ãƒƒãƒ‰ãŒè¦æ±‚ã•れã¾ã—ãŸ: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "接続元: %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "ページã®é€ä¿¡ã«å¤±æ•—ã—ã¾ã—㟠%d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "ストリーム画åƒã¯ã¾ã æº–å‚™ãŒã§ãã¦ã„ã¾ã›ã‚“" #: src/webu.c msgid "Stream process requested to finish." msgstr "ストリームプロセスã®çµ‚了ãŒè¦æ±‚ã•れã¾ã—ãŸ" #: src/webu.c msgid "Send page failed." msgstr "ページã®é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ" #: src/webu.c msgid "Basic authentication: available" msgstr "基本èªè¨¼:利用å¯èƒ½" #: src/webu.c msgid "Basic authentication: disabled" msgstr "基本èªè¨¼:無効" #: src/webu.c msgid "Digest authentication: available" msgstr "ダイジェストèªè¨¼:利用å¯èƒ½" #: src/webu.c msgid "Digest authentication: disabled" msgstr "ダイジェストèªè¨¼:無効" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpdライブラリãŒå¤ã™ãŽã‚‹ãŸã‚ipv6ã¯ç„¡åйã§ã™" #: src/webu.c msgid "IPV6: available" msgstr "IPV6:利用å¯èƒ½" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6:無効" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpdライブラリãŒå¤ã™ãŽã‚‹ãŸã‚SSL/TLSã¯ç„¡åйã§ã™" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL/TLS:利用å¯èƒ½" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL/TLS:無効" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "SSL/TLSサãƒãƒ¼ãƒˆç”¨ã®ãƒ•ァイルã®èª­ã¿å–りエラー" #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "SSL/TLSãŒè¦æ±‚ã•れã¾ã—ãŸãŒã€è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ãŒæä¾›ã•れã¦ã„ã¾ã›ã‚“.SSL/TLSã¯ç„¡åйã§" "ã™" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "" "SSL/TLSãŒè¦æ±‚ã•れã¾ã—ãŸãŒã€ã‚­ãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ãŒæä¾›ã•れã¦ã„ã¾ã›ã‚“.SSL/TLSã¯ç„¡åйã§ã™" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "ãƒãƒ¼ãƒˆ %dã§web制御を開始中ã§ã™" #: src/webu.c msgid "Unable to start MHD" msgstr "MHDã‚’é–‹å§‹ã§ãã¾ã›ã‚“" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "ãƒãƒ¼ãƒˆ %dã§web制御を開始ã—ã¾ã—ãŸ" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "ãƒãƒ¼ãƒˆ/カメラID %d/%dã§ã‚«ãƒ¡ãƒ© %dストリームを開始ã—ã¾ã—ãŸ" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "カメラ %dストリーム(port %d)ã‚’é–‹å§‹ã—ã¾ã—ãŸ" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "port %dã§å…¨ã¦ã®ã‚«ãƒ¡ãƒ©ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’開始中ã§ã™" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "カメラ(%d)ストリームをport %dã§é–‹å§‹ä¸­ã§ã™" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "カメラ(%d)ã®ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’é–‹å§‹ã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "é‡è¤‡ã—ãŸãƒãƒ¼ãƒˆãŒè¦æ±‚ã—ã¾ã—㟠%d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "無効ãªwebåˆ¶å¾¡ãƒ­ãƒƒã‚¯ã®æœ€å¤§ips.25ã«ç­‰ã—ã„設定. " #: src/webu_html.c msgid "Cameras" msgstr "カメラ" #: src/webu_html.c msgid "Camera" msgstr "カメラ" #: src/webu_html.c msgid "All" msgstr "ã™ã¹ã¦" #: src/webu_html.c msgid "Action" msgstr "アクション" #: src/webu_html.c msgid "Start Event" msgstr "イベント開始" #: src/webu_html.c msgid "End Event" msgstr "イベント終了" #: src/webu_html.c msgid "Snapshot" msgstr "スナップショット" #: src/webu_html.c msgid "Change Configuration" msgstr "設定ã®å¤‰æ›´" #: src/webu_html.c msgid "Write Configuration" msgstr "è¨­å®šã®æ›¸è¾¼" #: src/webu_html.c msgid "Tracking" msgstr "トラッキング" #: src/webu_html.c msgid "Pause" msgstr "ä¸€æ™‚åœæ­¢" #: src/webu_html.c msgid "Start" msgstr "é–‹å§‹" #: src/webu_html.c msgid "Restart" msgstr "å†èµ·å‹•" #: src/webu_html.c msgid "Quit" msgstr "終了ã™ã‚‹" #: src/webu_html.c msgid "Help" msgstr "ヘルプ" #: src/webu_html.c msgid "No Configuration Options" msgstr "設定オプションã¯ã‚りã¾ã›ã‚“" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "制é™ã•れãŸè¨­å®šã‚ªãƒ—ション" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "高度ãªè¨­å®šã‚ªãƒ—ション" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "é™å®šçš„ãªè¨­å®šã‚ªãƒ—ション" #: src/webu_html.c msgid "All Cameras" msgstr "ã™ã¹ã¦ã®ã‚«ãƒ¡ãƒ©" #: src/webu_html.c msgid "Not running" msgstr "éžæ´»å‹•中" #: src/webu_html.c msgid "Lost connection" msgstr "接続ãŒåˆ‡ã‚Œã¾ã—ãŸ" #: src/webu_html.c msgid "Paused" msgstr "ä¸€æ™‚åœæ­¢" #: src/webu_html.c msgid "Active" msgstr "アクティブ" #: src/webu_html.c msgid "Select option" msgstr "ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠž" #: src/webu_html.c msgid "Save" msgstr "セーブ" #: src/webu_html.c msgid "Pan/Tilt" msgstr "カメラã®å‘ã" #: src/webu_html.c msgid "Absolute Change" msgstr "絶対値変更" #: src/webu_html.c msgid "Center" msgstr "中央" #: src/webu_html.c msgid "Pan" msgstr "パン(å·¦å³ã®å‘ã)" #: src/webu_html.c msgid "Tilt" msgstr "ティルト(上下ã®å‚¾ã)" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "無効ãªã‚¹ãƒ¬ãƒƒãƒ‰ãŒæŒ‡å®šã•れã¾ã—ãŸ: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "カメラspecificã®ãƒãƒ¼ãƒˆã®ç„¡åйãªURL: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "カメラspecificファイルを使用ã™ã‚‹å ´åˆã€ã‚¹ãƒ¬ãƒƒãƒ‰0ã®URLã¯ç„¡åйã§ã™: %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "カメラspecificãƒãƒ¼ãƒˆã¸ä¸æ­£ãªURL: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "ストリーミングã™ã‚‹ç”»åƒã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "'%s'オプションã¯éžæŽ¨å¥¨ã«ãªã‚Šã¾ã—ãŸ.æ–°ã—ã„オプションåã¯'%s'ã§ã™" motion-release-4.6.0/po/ko.po000066400000000000000000003343641452402535500160550ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:35-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "버전 %s ì´í›„ %s" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "알 수없는 구성 옵션 \" %s \"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "구성 파ì¼ì„ %sì— ì“°ëŠ” 중" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "구성 íŒŒì¼ %sì„ (를) ì°¾ì„ ìˆ˜ 없습니다. ê¸°ë³¸ê°’ì„ ì‹œë„합니다." #: src/conf.c msgid "Error getcwd" msgstr "getcwd 오류" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "구성 íŒŒì¼ %sì„ (를) ì—´ 수 없습니다." #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "ìž˜ëª»ëœ íŒŒì¼ ì´ë¦„ %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "스레드 0 처리-구성 íŒŒì¼ %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "ê¸°ë³¸ê°’ì„ ì‚¬ìš©í•˜ì—¬ 처리 í•  구성 파ì¼ì´ 없습니다." #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "모든 파ì¼ì—서 구성 매개 변수 쓰기 ( %d) :" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "스레드 %d-구성 íŒŒì¼ : %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s <편집 ë¨>" #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "구성 íŒŒì¼ %s 처리 중" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "ì¹´ë©”ë¼ ë””ë ‰í† ë¦¬ 구성 %s를 ì°¾ì„ ìˆ˜ 없습니다" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "ì¹´ë©”ë¼ êµ¬ì„± íŒŒì¼ %s를 ì°¾ì„ ìˆ˜ 없습니다" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "ì¹´ë©”ë¼ êµ¬ì„± íŒŒì¼ %s 처리 중" #: src/conf.c msgid "daemon" msgstr "악마" #: src/conf.c msgid "setup_mode" msgstr "설정 모드" #: src/conf.c msgid "pid_file" msgstr "pid 파ì¼" #: src/conf.c msgid "log_file" msgstr "로그 파ì¼" #: src/conf.c msgid "log_level" msgstr "로그 레벨" #: src/conf.c msgid "log_type" msgstr "로그 유형" #: src/conf.c msgid "quiet" msgstr "조용한" #: src/conf.c msgid "watchdog_tmo" msgstr "ì›Œì¹˜ë… í‹°ëª¨" #: src/conf.c msgid "watchdog_kill" msgstr "ê°ì‹œê²¬ 죽ì´ê¸°" #: src/conf.c msgid "native_language" msgstr "모국어" #: src/conf.c msgid "camera_name" msgstr "ì¹´ë©”ë¼ ì´ë¦„" #: src/conf.c msgid "camera_id" msgstr "ì¹´ë©”ë¼ ì•„ì´ë””" #: src/conf.c msgid "target_dir" msgstr "ëŒ€ìƒ ë””ë ‰í† ë¦¬" #: src/conf.c msgid "video_device" msgstr "비디오 장치" #: src/conf.c msgid "video_params" msgstr "비디오 매개변수" #: src/conf.c msgid "auto_brightness" msgstr "ìžë™ ë°ê¸°" #: src/conf.c msgid "tuner_device" msgstr "튜너 장치" #: src/conf.c msgid "roundrobin_frames" msgstr "ë¼ìš´ë“œ 로빈 프레임" #: src/conf.c msgid "roundrobin_skip" msgstr "ë¼ìš´ë“œ 로빈 건너 뛰기" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "ë¼ìš´ë“œ 로빈 스위치 í•„í„°" #: src/conf.c msgid "netcam_url" msgstr "넷캠 URL" #: src/conf.c msgid "netcam_params" msgstr "넷캠 매개변수" #: src/conf.c msgid "netcam_high_url" msgstr "넷캠 ë†’ì€ URL" #: src/conf.c msgid "netcam_high_params" msgstr "넷캠 ë†’ì€ ë§¤ê°œë³€ìˆ˜" #: src/conf.c msgid "netcam_userpass" msgstr "넷캠 ì‚¬ìš©ìž íŒ¨ìŠ¤" #: src/conf.c msgid "mmalcam_name" msgstr "mmalcam ì´ë¦„" #: src/conf.c msgid "mmalcam_params" msgstr "mmalcam 매개변수" #: src/conf.c msgid "width" msgstr "í­" #: src/conf.c msgid "height" msgstr "신장" #: src/conf.c msgid "framerate" msgstr "프레임 ì†ë„" #: src/conf.c msgid "minimum_frame_time" msgstr "최소 프레임 시간" #: src/conf.c msgid "rotate" msgstr "회전" #: src/conf.c msgid "flip_axis" msgstr "ì¶• 플립" #: src/conf.c msgid "locate_motion_mode" msgstr "모션 모드 찾기" #: src/conf.c msgid "locate_motion_style" msgstr "모션 ìŠ¤íƒ€ì¼ ì°¾ê¸°" #: src/conf.c msgid "text_left" msgstr "ë‚¨ì€ í…스트" #: src/conf.c msgid "text_right" msgstr "바로 í…스트" #: src/conf.c msgid "text_changes" msgstr "í…스트 변경" #: src/conf.c msgid "text_scale" msgstr "í…스트 스케ì¼" #: src/conf.c msgid "text_event" msgstr "ë¬¸ìž ì´ë²¤íЏ" #: src/conf.c msgid "emulate_motion" msgstr "모션 ì—뮬레ì´ì…˜" #: src/conf.c msgid "pause" msgstr "정지시키다" #: src/conf.c msgid "threshold" msgstr "문지방" #: src/conf.c msgid "threshold_maximum" msgstr "임계 ê°’ 최대" #: src/conf.c msgid "threshold_tune" msgstr "임계 ê°’ ì¡°ì •" #: src/conf.c msgid "noise_level" msgstr "ì†ŒìŒ ìˆ˜ì¤€" #: src/conf.c msgid "noise_tune" msgstr "ì†ŒìŒ ì¡°ì •" #: src/conf.c msgid "despeckle_filter" msgstr "얼룩 제거 í•„í„°" #: src/conf.c msgid "area_detect" msgstr "ì˜ì—­ ê°ì§€" #: src/conf.c msgid "mask_file" msgstr "ë§ˆìŠ¤í¬ íŒŒì¼" #: src/conf.c msgid "mask_privacy" msgstr "ë§ˆìŠ¤í¬ í”„ë¼ì´ë²„시" #: src/conf.c msgid "smart_mask_speed" msgstr "스마트 ë§ˆìŠ¤í¬ ì†ë„" #: src/conf.c msgid "lightswitch_percent" msgstr "전등 스위치 í¼ì„¼íЏ" #: src/conf.c msgid "lightswitch_frames" msgstr "전등 스위치 프레임" #: src/conf.c msgid "minimum_motion_frames" msgstr "최소 모션 프레임" #: src/conf.c msgid "event_gap" msgstr "ì´ë²¤íЏ ê°­" #: src/conf.c msgid "pre_capture" msgstr "사전 캡처" #: src/conf.c msgid "post_capture" msgstr "캡처 후" #: src/conf.c msgid "on_event_start" msgstr "ì´ë²¤íЏ 시작시" #: src/conf.c msgid "on_event_end" msgstr "ì´ë²¤íЏ 종료시" #: src/conf.c msgid "on_picture_save" msgstr "사진 저장" #: src/conf.c msgid "on_area_detected" msgstr "ê°ì§€ ëœ ì˜ì—­" #: src/conf.c msgid "on_motion_detected" msgstr "움ì§ìž„ ê°ì§€" #: src/conf.c msgid "on_movie_start" msgstr "ì˜í™”를 시작할 때" #: src/conf.c msgid "on_movie_end" msgstr "ì˜í™” ëì—서" #: src/conf.c msgid "on_camera_lost" msgstr "ì¹´ë©”ë¼ë¥¼ 잃어버린" #: src/conf.c msgid "on_camera_found" msgstr "ì¹´ë©”ë¼ì—서 발견" #: src/conf.c msgid "picture_output" msgstr "사진 출력" #: src/conf.c msgid "picture_output_motion" msgstr "사진 출력 ë™ìž‘" #: src/conf.c msgid "picture_type" msgstr "사진 종류" #: src/conf.c msgid "picture_quality" msgstr "화질" #: src/conf.c msgid "picture_exif" msgstr "사진 EXIF" #: src/conf.c msgid "picture_filename" msgstr "사진 íŒŒì¼ ì´ë¦„" #: src/conf.c msgid "snapshot_interval" msgstr "스냅 샷 간격" #: src/conf.c msgid "snapshot_filename" msgstr "스냅 샷 íŒŒì¼ ì´ë¦„" #: src/conf.c msgid "movie_output" msgstr "ì˜í™” 출력" #: src/conf.c msgid "movie_output_motion" msgstr "ì˜í™” 출력 ë™ìž‘" #: src/conf.c msgid "movie_max_time" msgstr "ì˜í™” 최대 시간" #: src/conf.c msgid "movie_bps" msgstr "ì˜í™” bps" #: src/conf.c msgid "movie_quality" msgstr "ì˜í™” 품질" #: src/conf.c msgid "movie_codec" msgstr "ì˜í™” ì½”ë±" #: src/conf.c msgid "movie_duplicate_frames" msgstr "ì˜í™” 복제 프레임" #: src/conf.c msgid "movie_passthrough" msgstr "ì˜í™” 통과" #: src/conf.c msgid "movie_filename" msgstr "ì˜í™” íŒŒì¼ ì´ë¦„" #: src/conf.c msgid "movie_extpipe_use" msgstr "ì˜í™” extpipe 사용" #: src/conf.c msgid "movie_extpipe" msgstr "ì˜í™” extpipe" #: src/conf.c msgid "timelapse_interval" msgstr "ì €ì† ê°„ê²©" #: src/conf.c msgid "timelapse_mode" msgstr "ì €ì† ëª¨ë“œ" #: src/conf.c msgid "timelapse_fps" msgstr "ì €ì† fps" #: src/conf.c msgid "timelapse_codec" msgstr "ì €ì† ì´¬ì˜ ì½”ë±" #: src/conf.c msgid "timelapse_filename" msgstr "timelapse íŒŒì¼ ì´ë¦„" #: src/conf.c msgid "video_pipe" msgstr "비디오 파ì´í”„" #: src/conf.c msgid "video_pipe_motion" msgstr "비디오 파ì´í”„ 모션" #: src/conf.c msgid "webcontrol_port" msgstr "webcontrol í¬íЏ" #: src/conf.c msgid "webcontrol_ipv6" msgstr "webcontrol ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "webcontrol localhost" #: src/conf.c msgid "webcontrol_parms" msgstr "webcontrol parms" #: src/conf.c msgid "webcontrol_interface" msgstr "웹 컨트롤 ì¸í„°íŽ˜ì´ìФ" #: src/conf.c msgid "webcontrol_auth_method" msgstr "webcontrol ì¸ì¦ 방법" #: src/conf.c msgid "webcontrol_authentication" msgstr "웹 컨트롤 ì¸ì¦" #: src/conf.c msgid "webcontrol_tls" msgstr "webcontrol tls" #: src/conf.c msgid "webcontrol_cert" msgstr "웹 컨트롤 ì¸ì¦ì„œ" #: src/conf.c msgid "webcontrol_key" msgstr "webcontrol 키" #: src/conf.c msgid "webcontrol_header_params" msgstr "webcontrol í—¤ë” ë§¤ê°œë³€ìˆ˜" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "webcontrol 잠금 시간" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "webcontrol 잠금 시ë„" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "webcontrol 잠금 최대 ips" #: src/conf.c msgid "stream_port" msgstr "스트림 í¬íЏ" #: src/conf.c msgid "stream_localhost" msgstr "로컬 호스트 스트림" #: src/conf.c msgid "stream_auth_method" msgstr "스트림 ì¸ì¦ 방법" #: src/conf.c msgid "stream_authentication" msgstr "스트림 ì¸ì¦" #: src/conf.c msgid "stream_tls" msgstr "스트림 tls" #: src/conf.c msgid "stream_header_params" msgstr "스트림 í—¤ë” ë§¤ê°œë³€ìˆ˜" #: src/conf.c msgid "stream_preview_scale" msgstr "스트림 미리보기 스케ì¼" #: src/conf.c msgid "stream_preview_newline" msgstr "스트림 미리보기 개행" #: src/conf.c msgid "stream_preview_method" msgstr "스트림 미리보기 방법" #: src/conf.c msgid "stream_quality" msgstr "스트림 품질" #: src/conf.c msgid "stream_grey" msgstr "스트림 그레ì´" #: src/conf.c msgid "stream_motion" msgstr "스트림 모션" #: src/conf.c msgid "stream_maxrate" msgstr "스트림 최대" #: src/conf.c msgid "stream_limit" msgstr "스트림 제한" #: src/conf.c msgid "database_type" msgstr "ë°ì´í„°ë² ì´ìФ 유형" #: src/conf.c msgid "database_dbname" msgstr "ë°ì´í„°ë² ì´ìФ DB ì´ë¦„" #: src/conf.c msgid "database_host" msgstr "ë°ì´í„°ë² ì´ìФ 호스트" #: src/conf.c msgid "database_port" msgstr "ë°ì´í„°ë² ì´ìФ í¬íЏ" #: src/conf.c msgid "database_user" msgstr "ë°ì´í„°ë² ì´ìФ 사용ìž" #: src/conf.c msgid "database_password" msgstr "ë°ì´í„°ë² ì´ìФ 비밀번호" #: src/conf.c msgid "database_busy_timeout" msgstr "ë°ì´í„°ë² ì´ìФ 사용 중 시간 초과" #: src/conf.c msgid "sql_log_picture" msgstr "SQL 로그 사진" #: src/conf.c msgid "sql_log_snapshot" msgstr "SQL 로그 스냅 샷" #: src/conf.c msgid "sql_log_movie" msgstr "SQL 로그 ì˜í™”" #: src/conf.c msgid "sql_log_timelapse" msgstr "SQL 로그 ì €ì†" #: src/conf.c msgid "sql_query_start" msgstr "SQL 쿼리 시작" #: src/conf.c msgid "sql_query_stop" msgstr "SQL 쿼리 중지" #: src/conf.c msgid "sql_query" msgstr "SQL 쿼리" #: src/conf.c msgid "track_type" msgstr "트랙 타입" #: src/conf.c msgid "track_auto" msgstr "ìžë™ ì¶”ì " #: src/conf.c msgid "track_port" msgstr "트랙 í¬íЏ" #: src/conf.c msgid "track_motorx" msgstr "motorx를 ì¶”ì " #: src/conf.c msgid "track_motorx_reverse" msgstr "motorx ì—­ ì¶”ì " #: src/conf.c msgid "track_motory" msgstr "ìš´ë™ ì¶”ì " #: src/conf.c msgid "track_motory_reverse" msgstr "ìš´ë™ ì—­ ì¶”ì " #: src/conf.c msgid "track_maxx" msgstr "맥스를 ì¶”ì " #: src/conf.c msgid "track_minx" msgstr "ë§ê´„ëŸ‰ì´ ì¶”ì " #: src/conf.c msgid "track_maxy" msgstr "맥시를 ì¶”ì í•˜ë‹¤" #: src/conf.c msgid "track_miny" msgstr "마ì´ë„ˆë¥¼ ì¶”ì í•˜ë‹¤" #: src/conf.c msgid "track_homex" msgstr "Homex ì¶”ì " #: src/conf.c msgid "track_homey" msgstr "ê³ í–¥ì„ ì¶”ì í•˜ë‹¤" #: src/conf.c msgid "track_iomojo_id" msgstr "ì´ì˜¤ 모조 ID ì¶”ì " #: src/conf.c msgid "track_step_angle_x" msgstr "ìŠ¤í… ê°ë„ x ì¶”ì " #: src/conf.c msgid "track_step_angle_y" msgstr "ìŠ¤í… ìŠ¤í… ê°ë„ y" #: src/conf.c msgid "track_move_wait" msgstr "트랙 ì´ë™ 대기" #: src/conf.c msgid "track_speed" msgstr "트랙 ì†ë„" #: src/conf.c msgid "track_stepsize" msgstr "ë‹¨ê³„ì  ì¶”ì " #: src/conf.c msgid "track_generic_move" msgstr "ì¼ë°˜ ì´ë™ ì¶”ì " #: src/conf.c msgid "camera" msgstr "ì¹´ë©”ë¼" #: src/conf.c msgid "camera_dir" msgstr "ì¹´ë©”ë¼ ë””ë ‰í† ë¦¬" #: src/dbse.c msgid "Closing MySQL library" msgstr "MySQL ë¼ì´ë¸ŒëŸ¬ë¦¬ 닫기" #: src/dbse.c msgid "Closing MariaDB library" msgstr "MariaDB ë¼ì´ë¸ŒëŸ¬ë¦¬ 닫기" #: src/dbse.c msgid "Database closed" msgstr "ë°ì´í„°ë² ì´ìФ 닫힘" #: src/dbse.c msgid "Initializing database" msgstr "ë°ì´í„°ë² ì´ìФ 초기화" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "ì‚¬ìš©ìž %s로 호스트 %sì˜ MySQL ë°ì´í„°ë² ì´ìФ %sì— ì—°ê²°í•  수 없습니다." #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "MySQL 오류는 %s입니다" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "" "ì‚¬ìš©ìž %sì´(ê°€) 있는 호스트 %sì˜ MariaDB ë°ì´í„°ë² ì´ìФ %sì— ì—°ê²°í•  수 없습니" "다." #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "MariaDB 오류는 %s입니다." #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "ë°ì´í„°ë² ì´ìФ %sì„(를) 여는 중" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "SQLite3 ë°ì´í„°ë² ì´ìФ %sì„(를) ì—´ 수 없습니다. 오류 %d: %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "ë°”ìœ ì‹œê°„ 초과를 %d msec로 설정" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "ë°”ìœ ì‹œê°„ 초과를 설정하지 못했습니다. 오류 %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "PostgreSQL ë°ì´í„°ë² ì´ìФ ' %s'ì— ì—°ê²°í•˜ì§€ 못했습니다 : %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "ë°ì´í„°ë² ì´ìФ 유형 %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "MySQL 쿼리 실행" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "MySQL 쿼리 실패 %s 오류 코드 %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "" "ì‚¬ìš©ìž %s MySQL 오류로 호스트 %sì—서 MySQL ë°ì´í„°ë² ì´ìФ %sì— ë‹¤ì‹œ ì—°ê²°í•  수 " "없습니다.%sì´ì—ˆë‹¤" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "MySQL ë°ì´í„°ë² ì´ìФ '%s'ì— ëŒ€í•œ 재연결 성공" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "재연결 후 MySQL 쿼리 실패 %s 오류 코드 %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "MariaDB 쿼리 실행" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "MariaDB 쿼리 실패 %s 오류 코드 %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "ì‚¬ìš©ìž %s MariaDBê°€ 있는 %s í˜¸ìŠ¤íŠ¸ì˜ MariaDB ë°ì´í„°ë² ì´ìФ %sì— ë‹¤ì‹œ ì—°ê²°í•  " "수 없습니다.오류는 %s입니다." #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "MariaDB ë°ì´í„°ë² ì´ìФ '%s'ì— ëŒ€í•œ 재연결 성공" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "재연결 후 MariaDB 쿼리 실패 %s 오류 코드 %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "PostgreSQL ë°ì´í„°ë² ì´ìФ '%s'ì— ë‹¤ì‹œ ì—°ê²°ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "PostgreSQL 쿼리 실행" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "PostgreSQL ë°ì´í„°ë² ì´ìФ '%s'ì— ëŒ€í•œ 재연결 시ë„: %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "PGSQL 쿼리 실패 : [%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "%s 실행 중" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "SQLite3 오류 %d: %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "빈 SQL 쿼리 무시" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "외부 명령 ' %s'ì„ (를) 시작할 수 없습니다" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "외부 명령 ' %s'실행" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "파ì¼ì— ì´ë¯¸ì§€ 쓰기: %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "파ì¼ì— ë™ì˜ìƒ 쓰기: %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "파ì¼ì— ì´ë¯¸ì§€ 저장: %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "파ì¼ì— ì €ìž¥ëœ ë™ì˜ìƒ: %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "비디오 파ì´í”„ì— ì´ë¯¸ì§€ë¥¼ 넣지 못했습니다" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "기호 ë§í¬ë¥¼ 만들 수 없습니다 [ %s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "미리보기 파ì´í”„ ì´ë¦„ %d %s 작성 중 오류" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "íŒŒì¼ ì´ë¦„ 기본 %d %sì„ (를) 작성하는 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "미리보기 ì´ë¦„ %d %s 작성 중 오류" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "닫기 : extpipe íŒŒì¼ ì„¤ëª… %d, 오류 ìƒíƒœ %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "반품 ë§ˆê° : %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "소스 FPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "ì˜í™” 경로 : %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "ëŒ€ìƒ ë””ë ‰í† ë¦¬ %sì— ëŒ€í•œ 쓰기 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤." #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "경로를 ì°¾ì„ ìˆ˜ 없습니다. %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "오류가 ë°œìƒí•˜ëŠ” 경로 %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "명령 í–‰ 지정 오류 : %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "파ì´í”„ : %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt-> moviefps : %d" #: src/event.c msgid "popen failed" msgstr "실패 했어" #: src/event.c msgid "Using extpipe" msgstr "extpipe 사용" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "파ì´í”„ 쓰기 오류, ìƒíƒœ 오류 %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "파ì´í”„ %sì´ (ê°€) 작성ë˜ì§€ 않았거나 닫혔습니다" #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "ogg 컨테ì´ë„ˆëŠ” ë” ì´ìƒ ì§€ì›ë˜ì§€ 않습니다. mpeg4로 변경" #: src/event.c msgid "Running test of the various output formats." msgstr "다양한 출력 형ì‹ì˜ 테스트를 실행합니다." #: src/event.c msgid "Error opening context for movie output." msgstr "ì˜í™” ì¶œë ¥ì— ëŒ€í•œ 컨í…스트를 여는 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffopen 열기 오류 ìƒì„± (ë™ìž‘) íŒŒì¼ [ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "" "timelapse ìš© swf 컨테ì´ë„ˆëŠ” ë” ì´ìƒ ì§€ì›ë˜ì§€ 않습니다. mpg 컨테ì´ë„ˆë¥¼ 사용합" "니다." #: src/event.c msgid "Timelapse using mpg codec." msgstr "mpg ì½”ë±ì„ 사용하는 ì €ì† ì´¬ì˜." #: src/event.c msgid "Events will be appended to file" msgstr "ì´ë²¤íŠ¸ê°€ 파ì¼ì— 추가ë©ë‹ˆë‹¤" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "mpeg4 ì½”ë±ì„ 사용하는 ì €ì† ì´¬ì˜." #: src/event.c msgid "Events will be trigger new files" msgstr "ì´ë²¤íŠ¸ëŠ” 새 파ì¼ì„ 트리거합니다" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffopen 열기 오류 ìƒì„± (timelapse) íŒŒì¼ [ %s]" #: src/event.c msgid "Error encoding image" msgstr "ì´ë¯¸ì§€ ì¸ì½”딩 오류" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "ì½”ë± ì´ë¦„ì— ë©”ëª¨ë¦¬ë¥¼ 할당하지 못했습니다" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "ì§€ì •ëœ í”„ë ˆìž„ ì†ë„ê°€ ì§€ì •ëœ ffmpeg ë™ì˜ìƒ ìœ í˜•ì— ë¹„í•´ 너무 높습니다.다른 " "ffmpeg 컨테ì´ë„ˆ ë˜ëŠ” ë‚®ì€ í”„ë ˆìž„ ì†ë„를 ì„ íƒí•˜ì‹­ì‹œì˜¤." #: src/ffmpeg.c msgid "Error setting base file name" msgstr "기본 íŒŒì¼ ì´ë¦„ 설정 오류" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "ì½”ë± %sì— ëŒ€í•œ timelapse 추가 설정 오류" #: src/ffmpeg.c msgid "Error setting file name" msgstr "íŒŒì¼ ì´ë¦„ 설정 오류" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "ì½”ë± ì˜µì…˜ ê°’ %sì´ (ê°€) ì§€ì›ë˜ì§€ 않습니다" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "ì½”ë±ì„ ì–»ì„ ìˆ˜ 없습니다" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "ì¸ì½”딩ì„위한 프레임 전송 오류 : %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "수신 패킷ì—서 EAGAINì´ -2 코드를 반환 함 : %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "ì¸ì½”딩 ëœ íŒ¨í‚· 비디오 수신 오류 : %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "비디오 ì¸ì½”딩 오류 : %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "비디오 ì¸ì½”딩 오류" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "PTS % 기본 PTS % ms 간격 % 타임베ì´ìФ %d- %d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "ë‚˜ìœ íƒ€ì´ë°! í”„ë ˆìž„ì„ ê±´ë„ˆ ëœë‹ˆë‹¤." #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "" "PTS % 기본 PTS % ms 간격 % 타임베ì´ìФ %d-%d 변경%d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s ì½”ë± vbr / crf / 비트 ì†ë„ : %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "기본 ì½”ë± %sì´ (ê°€) ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì— ì¶”ê°€ë˜ì—ˆìŠµë‹ˆë‹¤ : %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "ì½”ë± %s를 ì°¾ì„ ìˆ˜ 없습니다" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "ì½”ë± %s 사용" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "ìŠ¤íŠ¸ë¦¼ì„ í• ë‹¹ í•  수 없습니다" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "ì½”ë±ì„ 할당하지 못했습니다!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "ë‚®ì€ fps. %d í”„ë ˆìž„ì„ %d 프레임 컨테ì´ë„ˆì— ì¸ì½”딩" #: src/ffmpeg.c msgid "Unable to set quality" msgstr "í’ˆì§ˆì„ ì„¤ì •í•  수 없습니다" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "ë³´ê³  ëœ FPS ì§€ì› %d / %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "ì½”ë± %sì„ (를) ì—´ 수 없습니다." #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "ë””ì½”ë” ë§¤ê°œ 변수를 복사하지 못했습니다! : %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "í”„ë ˆìž„ì„ í• ë‹¹ í•  수 없습니다" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "%s 버í¼ë¥¼ 할당 í•  수 없습니다" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "íŒŒì¼ %sì„ (를) 여는 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "ê¶Œí•œì´ ê±°ë¶€ë˜ì—ˆìŠµë‹ˆë‹¤. %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "íŒŒì¼ %sì„ (를) 여는 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "ffmpeg í—¤ë” %sì„ (를) 쓸 수 없습니다." #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "배수 모드 ì§„ìž… 오류 : %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "ì½”ë± ë°°ìˆ˜ 오류 : %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "배수 비디오 í”„ë ˆìž„ì„ ì“°ëŠ” 중 오류" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "ì‚¬ì§„ì„ ì¸ì½”딩하는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "비디오 í”„ë ˆìž„ì„ ì“°ëŠ” 중 오류" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet : %s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "비디오 í”„ë ˆìž„ì„ ì“°ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤ : %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "RTSP 컨í…스트를 사용할 수 없습니다." #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "rtsp ì¹´ë©”ë¼ê°€ 통과 준비가ë˜ì§€ 않았습니다." #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "통과 모드가 활성화ë˜ì—ˆìŠµë‹ˆë‹¤. MP4 컨테ì´ë„ˆë¡œ 변경" #: src/ffmpeg.c msgid "Could not get codec!" msgstr "ì½”ë±ì„ ì–»ì„ ìˆ˜ 없습니다!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "ì½”ë± ë§¤ê°œ 변수를 복사 í•  수 없습니다" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "통과가 비활성화ë˜ì—ˆìŠµë‹ˆë‹¤. 너무 ì˜¤ëž˜ëœ ffmpeg" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "통과 ìŠ¤íŠ¸ë¦¼ì´ ì—´ë ¸ìŠµë‹ˆë‹¤" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "ffmpeg libavcodec 버전 %d. %d. %d libavformat 버전 %d. %d. %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "av lockmgr ë“±ë¡ ì‹¤íŒ¨ ( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "ffmpeg ê¸°ëŠ¥ì´ í¬í•¨ë˜ì–´ 있지 않습니다" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "정리시 av lockmgr 레지스터 재설정 실패" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "출력 컨í…스트를 할당 í•  수 없습니다" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "경유를 설정할 수 없습니다!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "ìŠ¤íŠ¸ë¦¼ì„ ì„¤ì •í•  수 없습니다" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "ì½”ë± í”ŒëŸ¬ì‹œ 오류" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "버í¼ë§ ëœ íŒ¨í‚·ì„ ì§€ìš°ë ¤ëŠ” ê³¼ë„한 시ë„" #: src/ffmpeg.c msgid "Buffered packet" msgstr "버í¼ë§ ëœ íŒ¨í‚·" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s : JPEG 버í¼ê°€ 너무 ìž‘ì„ ë•Œ" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "ìž˜ëª»ëœ JPEG ì´ë¯¸ì§€ í¬ê¸°" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "JPEG ì´ë¯¸ì§€ í¬ê¸° %dx %d, JPEG는 %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "예기치 ì•Šì€ ì¹´ë©”ë¼ ì œì–´ 콜백 ì´ë²¤íЏ 수신 : 0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "ë†’ì€ í”„ë ˆìž„ ì†ë„는 ì´ë¯¸ì§€ ë…¸ì¶œì— ë¬¸ì œë¥¼ ì¼ìœ¼í‚¬ 수 있습니다" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "ìžë™ ë…¸ì¶œì´ ìž‘ë™í•˜ì§€ 않으면 ë” ë‚®ì€ í”„ë ˆìž„ ì†ë„를 시ë„하십시오." #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "MMAL ì¹´ë©”ë¼ êµ¬ì„± 요소 %s를 만들지 못했습니다." #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "MMAL ì¹´ë©”ë¼ %sì— ì¶œë ¥ í¬íŠ¸ê°€ 없습니다" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "제어 í¬íŠ¸ë¥¼ 활성화 í•  수 없습니다 : 오류 %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "MMAL 패딩 ì—†ìŒ ì„¤ì • 실패" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "ì¹´ë©”ë¼ ë¹„ë””ì˜¤ 형ì‹ì„ 설정할 수 없습니다" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "ì¹´ë©”ë¼ êµ¬ì„± 요소를 사용할 수 없습니다" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "MMAL ì¹´ë©”ë¼ ì»´í¬ë„ŒíЏ ìƒì„±" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "MMAL ì¹´ë©”ë¼ ë²„í¼ í’€ ìƒì„± 실패" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "MMAL ì¹´ë©”ë¼ ë²„í¼ í ìƒì„± 실패" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "í’€ íì—서 필요한 ë²„í¼ %dì„ (를) 가져올 수 없습니다." #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "í¬íŠ¸ë¡œ 버í¼ë¥¼ 보낼 수 없습니다 ( %d)." #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "MMAL ì¹´ë©”ë¼ ìŠ¤ë ˆë“œ 시작 중 ... ì¹´ë©”ë¼ (%s). %d x %d ì—서 %d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "ì¹´ë©”ë¼ ë§¤ê°œ 변수를 할당 í•  수 없습니다" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "MMAL ì¹´ë©”ë¼ ìº¡ì²˜ í¬íЏ 활성화 실패" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "MMAL ì¹´ë©”ë¼ ìº¡ì²˜ 시작 실패" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "MMAL ì¹´ë©”ë¼ ì •ë¦¬" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %d 플래그 %08x í¬ê¸° %d / %dì—서 %08x, img í¬ê¸° = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "ì¹´ë©”ë¼ ë¹„ë””ì˜¤ í¬íŠ¸ë¡œ 버í¼ë¥¼ 반환 í•  수 없습니다" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "사전 캡처 ë²„í¼ í¬ê¸°ë¥¼ %d ê°œ 항목으로 ì¡°ì •" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "프로세스 ID íŒŒì¼ (pid 파ì¼)ì„ ì œê±°í–ˆìŠµë‹ˆë‹¤." #: src/motion.c msgid "Error removing pid file" msgstr "pid íŒŒì¼ ì œê±° 오류" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "로그 파ì¼ì„ 닫는 중 ( %s)." #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "움ì§ìž„ì´ ê°ì§€ë˜ì—ˆìŠµë‹ˆë‹¤ - 시작 ì´ë²¤íЏ %d." #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "ì˜í™”ì— %d 필러 프레임 추가" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "ì¹´ë©”ë¼ ìœ í˜•ì„ í™•ì¸í•  수 없습니다 (MMAL, Netcam, V4L2, BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "프ë¼ì´ë²„시 ë§ˆìŠ¤í¬ íŒŒì¼ ì—´ê¸°" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "ê³ í•´ìƒë„ 프ë¼ì´ë²„시 ë§ˆìŠ¤í¬ íŒŒì¼ ì—´ê¸°" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "ë§ˆìŠ¤í¬ íŒŒì¼ %sì„ (를) 여는 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "ë§ˆìŠ¤í¬ ê°œì¸ ì •ë³´ 보호 ì´ë¯¸ì§€ë¥¼ ì½ì§€ 못했습니다. ë§ˆìŠ¤í¬ ê°œì¸ ì •ë³´ 보호 ê¸°ëŠ¥ì´ " "비활성화ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "ë§ˆìŠ¤í¬ ê°œì¸ ì •ë³´ íŒŒì¼ \" %s \"ì´ (ê°€)로드ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "í…스트 í¬ê¸°ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤. %d (으)로 ì¡°ì •" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "ì¹´ë©”ë¼ %d 시작 : 움ì§ìž„ ê°ì§€ %s" #: src/motion.c msgid "Disabled" msgstr "비활성화" #: src/motion.c msgid "Enabled" msgstr "가능" #: src/motion.c msgid "Pass-through processing disabled." msgstr "통과 처리가 비활성화ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "ìž˜ëª»ëœ êµ¬ì„± ì°¨ì› %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "기본 치수 %dx %d 사용" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "요청한 ì´ë¯¸ì§€ 너비 ( %d)ê°€ 모듈로 8ì´ ì•„ë‹™ë‹ˆë‹¤." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "너비를 ë‹¤ìŒ 8ì˜ ë°°ìˆ˜ ( %d)로 조정합니다." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "요청한 ì´ë¯¸ì§€ ë†’ì´ ( %d)는 모듈로 8ì´ ì•„ë‹™ë‹ˆë‹¤." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "높ì´ë¥¼ ë‹¤ìŒ 8ì˜ ë°°ìˆ˜ë¡œ 조정합니다 ( %d)." #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "ì¹´ë©”ë¼ì—서 초기 ì´ë¯¸ì§€ë¥¼ 가져올 수 없습니다" #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "구성 파ì¼ì—서 너비와 높ì´ë¥¼ ê³„ì† ì‚¬ìš©í•˜ì—¬ 모션" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "ëª¨ì…˜ì€ ë„ˆë¹„ì™€ ë†’ì´ ë§Œ ì§€ì›í•©ë‹ˆë‹¤" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "요청한 ì´ë¯¸ì§€ 너비 ( %d) ë˜ëŠ” ë†’ì´ ( %d)ê°€ 모듈로 8ì´ ì•„ë‹™ë‹ˆë‹¤." #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "ëª¨ì…˜ì€ 64 %dx %d ì´ìƒì˜ 너비와 ë†’ì´ ë§Œ ì§€ì›í•©ë‹ˆë‹¤" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "서브 ìŠ¤íŠ¸ë¦¼ì„ ì‚¬ìš©í•  수 없습니다. 모듈로가 아닌 ì´ë¯¸ì§€ í¬ê¸° 16." #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "jpeg로 실패한 webp ì´ë¯¸ì§€ 형ì‹ì„ 사용할 수 없습니다." #: src/motion.c msgid "Error capturing first image" msgstr "첫 번째 ì´ë¯¸ì§€ 캡처 오류" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "ì¼ë°˜ 사진ì„위한 비디오 루프백 장치 열기" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "ì¼ë°˜ ì‚¬ì§„ì˜ ë¹„ë””ì˜¤ ë£¨í”„ë°±ì„ ì—´ì§€ 못했습니다." #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "ë™ì˜ìƒ ìš© 비디오 루프백 장치 열기" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "ë™ì˜ìƒì˜ 비디오 ë£¨í”„ë°±ì„ ì—´ì§€ 못했습니다." #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "ë§ˆìŠ¤í¬ ì´ë¯¸ì§€ë¥¼ ì½ì§€ 못했습니다. ë§ˆìŠ¤í¬ ê¸°ëŠ¥ì´ ë¹„í™œì„±í™”ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "ë§ˆìŠ¤í¬ íŒŒì¼ \" %s \"ì´ (ê°€)로드ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/motion.c msgid "Emulating motion" msgstr "모션 모방" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "%d ì˜ì—­ì˜ ëª¨ì…˜ì´ ê°ì§€ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "ì¹´ë©”ë¼ì™€ 성공ì ìœ¼ë¡œ ì—°ê²°ë  ë•Œê¹Œì§€ 재시ë„" #: src/motion.c msgid "Camera has become available." msgstr "ì¹´ë©”ë¼ë¥¼ 사용할 수 있게 ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "ëª¨ì…˜ì„ ë‹¤ì‹œ 시작하는 중입니다.\n" "요청한 ì´ë¯¸ì§€ 너비(%d) ë˜ëŠ” 높ì´(%d)ê°€ 모듈로 8ì´ ì•„ë‹™ë‹ˆë‹¤." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "ëª¨ì…˜ì„ ë‹¤ì‹œ 시작하는 중입니다.\n" "ëª¨ì…˜ì€ 64 %dx%d ì´ìƒì˜ 너비와 높ì´ë§Œ ì§€ì›í•©ë‹ˆë‹¤." #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "ëª¨ì…˜ì„ ë‹¤ì‹œ 시작하는 중입니다.\n" "ì¹´ë©”ë¼ì—서 ë†’ì´ ë˜ëŠ” 너비가 변경ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "ëª¨ì…˜ì„ ë‹¤ì‹œ 시작하는 중입니다.\n" "ì¹´ë©”ë¼ì—서 ê³ í•´ìƒë„ê°€ 변경ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/motion.c msgid "Video signal re-acquired" msgstr "비디오 신호 재 íšë“" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "비디오 장치 ì¹˜ëª…ì  ì˜¤ë¥˜-비디오 장치 닫기" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "모든 ì´ë¯¸ì§€ 버í¼ë¥¼ 다시 초기화하기 위해 모션 스레드 재시작" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "비디오 신호 ì†ì‹¤-회색 ì´ë¯¸ì§€ 추가" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "비디오 신호가 여전히 ì†ì‹¤ ë¨-비디오 장치를 닫으려고합니다." #: src/motion.c msgid "Lightswitch detected" msgstr "전등 스위치 ê°ì§€" #: src/motion.c msgid "Switchfilter detected" msgstr "스위치 í•„í„° ê°ì§€" #: src/motion.c msgid "micro-lightswitch!" msgstr "마ì´í¬ë¡œ 전등 스위치!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "ì´ë²¤íЏ 종료 %d" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "변경 사항 : %5d- ' %s'ì´í›„ì˜ ë³€ê²½ 사항 : %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr "-ë¼ë²¨ : %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "변경 사항 : %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr "-ì†ŒìŒ ìˆ˜ì¤€ : %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr "-임계 ê°’ : %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "유효하지 ì•Šì€ timelapse 모드 ì¸ìˆ˜ ' %s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%: s ìˆ˜ë™ íƒ€ìž„ 랩스 모드 기본값" #: src/motion.c msgid "Thread exiting" msgstr "스레드 종료" #: src/motion.c msgid "Motion going to daemon mode" msgstr "ë°ëª¬ 모드로 ì´ë™í•˜ëŠ” 모션" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "모션 종료, 프로세스 ID íŒŒì¼ (pid 파ì¼)ì„ ë§Œë“¤ 수 없습니다. %s" #: src/motion.c msgid "Could not change directory" msgstr "디렉토리를 변경할 수 없습니다" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "프로세스 ID íŒŒì¼ %sì„ (를) ìƒì„±í–ˆìŠµë‹ˆë‹¤. 프로세스 ID는 %d입니다" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "" "Camara ID는 고유하지 않거나 32,000 ì´ìƒì˜ ê°’ì„ ê°–ìŠµë‹ˆë‹¤. 다시 떨어지는스레드 " "번호" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2 : 사용 가능" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2 : 사용할 수 ì—†ìŒ" #: src/motion.c msgid "bktr : available" msgstr "bktr : 사용 가능" #: src/motion.c msgid "bktr : not available" msgstr "bktr : 사용할 수 ì—†ìŒ" #: src/motion.c msgid "webp : available" msgstr "webp : 가능" #: src/motion.c msgid "webp : not available" msgstr "webp : 사용할 수 ì—†ìŒ" #: src/motion.c msgid "mmal : available" msgstr "mmal : 가능" #: src/motion.c msgid "mmal : not available" msgstr "mmal : ìžë£Œ ì—†ìŒ" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg : 가능" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg : 사용할 수 ì—†ìŒ" #: src/motion.c msgid "mysql : available" msgstr "MySQL : 사용 가능" #: src/motion.c msgid "mysql : not available" msgstr "mysql : 사용할 수 ì—†ìŒ" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB : 사용 가능" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB : 사용할 수 ì—†ìŒ" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3 : 가능" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3 : 사용할 수 ì—†ìŒ" #: src/motion.c msgid "pgsql : available" msgstr "pgsql : 사용 가능" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql : 사용할 수 ì—†ìŒ" #: src/motion.c msgid "nls : available" msgstr "nls : 사용 가능" #: src/motion.c msgid "nls : not available" msgstr "nls : 사용할 수 ì—†ìŒ" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "기본 로그 수준 ( %s) 사용 ( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "파ì¼ì— 로깅 ( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "종료 모션, 로그 íŒŒì¼ %sì„ (를) 만들 수 없습니다" #: src/motion.c msgid "Logging to syslog" msgstr "syslogì— ë¡œê¹…" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "모션 %s 시작" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "기본 로그 유형 ( %s) 사용" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "로그 유형 ( %s) 사용 로그 수준 ( %s)" #: src/motion.c msgid "Motion running as daemon process" msgstr "ë°ëª¬ 프로세스로 실행ë˜ëŠ” 모션" #: src/motion.c msgid "Motion running in setup mode." msgstr "설정 모드ì—서 ë™ìž‘하는 모션." #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "ì¹´ë©”ë¼ ID : %dì€ (는) %s 출신" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "ì¹´ë©”ë¼ ID : %d ì¹´ë©”ë¼ ì´ë¦„ : %s 서비스 : %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "ì¹´ë©”ë¼ ID : %d ì¹´ë©”ë¼ ì´ë¦„ : %s 장치 : %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "스레드 %dì˜ ìŠ¤íŠ¸ë¦¼ í¬íЏ 번호 %dì´ (ê°€) 제어 í¬íŠ¸ì™€ ì¶©ëŒí•©ë‹ˆë‹¤" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "스레드 %dì— ëŒ€í•œ 스트림 ê¸°ëŠ¥ì´ ë¹„í™œì„±í™”ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "스레드 %dì˜ ìŠ¤íŠ¸ë¦¼ í¬íЏ 번호 %dì´ (ê°€) 스레드 %dê³¼ (와) ì¶©ëŒí•©ë‹ˆë‹¤" #: src/motion.c msgid "Restarting motion." msgstr "모션 재시작." #: src/motion.c msgid "Motion restarted" msgstr "모션 재시작" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "스레드 %d-워치 ë… ì‹œê°„ 초과. ì •ìƒì ìœ¼ë¡œ 다시 시작하려고" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "스레드 %d-워치 ë… ì‹œê°„ 초과가 다시 시작ë˜ì§€ 않아 종료ë˜ì—ˆìŠµë‹ˆë‹¤!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "스레드 %d-청소 스레드." #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "%d를 실행하는 DEBUG-1 스레드 %d를 실행하는 모션 스레드, %d 완료" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "스레드가 완료ë˜ê¸°ë¥¼ 기다리는 중, pid : %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "모션 스레드 %d 다시 시작" #: src/motion.c msgid "Threads finished" msgstr "스레드 완료" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "모션 종료" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "ìž˜ëª»ëœ URL. ê°’ì„ êµ¬ë¬¸ ë¶„ì„ í•  수 없습니다." #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "ì¹´ë©”ë¼ ì²˜ë¦¬ê¸° 스레드 [ %d]ì´ (ê°€) 시작ë˜ì—ˆìŠµë‹ˆë‹¤" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "Keep-Alive ì‹œê°„ì´ ì¢…ë£Œë˜ë©´ netcam ì†Œì¼“ì„ ë‹«ëŠ” 중입니다 (ì¹´ë©”ë¼ê°€ 필드 닫기를 " "보냄). ì—ì´ë‹¤ì‹œ 연결해야합니다." #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "ì¹´ë©”ë¼ ë‹¤ì‹œ 열기 (비 스트리ë°)" #: src/netcam.c msgid "camera re-connected" msgstr "ì¹´ë©”ë¼ ìž¬ ì—°ê²°" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "ì¸ì‹ í•  수없는 ì´ë¯¸ì§€ í—¤ë” ( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "í—¤ë” ì˜¤ë¥˜ ( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "ì¹´ë©”ë¼ ë‹¤ì‹œ 열기 (스트리ë°)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "JPEG ì´ë¯¸ì§€ë¥¼ 가져 오는 중 오류" #: src/netcam.c msgid "Trying to re-connect" msgstr "다시 연결하려고" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "넷캠 ì¹´ë©”ë¼ í•¸ë“¤ëŸ¬ : 설정 완료, 종료" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "ì¹´ë©”ë¼ í•¸ë“¤ëŸ¬ì˜ ì‘ë‹µì´ ì—†ìŠµë‹ˆë‹¤. ì´ë¯¸ ì‚¬ë§ í–ˆì–´ì•¼í•©ë‹ˆë‹¤." #: src/netcam.c msgid "called with no data in buffer" msgstr "버í¼ì— ë°ì´í„°ì—†ì´ 호출" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "ì¹´ë©”ë¼ì˜ ë„¤íŠ¸ì›Œí¬ ì¹´ë©”ë¼ ì‹œìž‘ ( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "ìž˜ëª»ëœ ë„·ìº  프ë¡ì‹œ ( %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "프ë¡ì‹œ URLì—서 ì‚¬ìš©ìž ì´ë¦„ / 암호를 사용할 수 없습니다" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "ìž˜ëª»ëœ ë„·ìº  서비스 ' %s'" #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "ì¹´ë©”ë¼ì— 대한 ìž˜ëª»ëœ ë„·ìº  URL ( %s)" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "Netcam http 매개 변수 ' %s'ì€ (는) 플래그로 변환합니다. HTTP / 1.0 : %s " "HTTP / 1.1 : %s Keep-살아있는 %s." #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "ì´ì œ netcam setup html () 호출" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "ì´ì œ netcam setup ftp를 호출" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "ì´ì œ netcam 설정 íŒŒì¼ () 호출" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "ì´ì œ netcam setupì„ í˜¸ì¶œí•©ë‹ˆë‹¤. mjpg ()" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "ìž˜ëª»ëœ ë„·ìº  서비스 '%s' - mjpeg, ftp, mjpg ë˜ëŠ” jpeg여야 합니다." #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "첫 번째 ì´ë¯¸ì§€ë¥¼ ì½ì§€ 못했습니다-retval : %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "첫 번째 프레임ì—서 libjpeg ì••ì¶• í•´ì œ 실패-í¬ê¸°!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "너비 / ë†’ì´ ( %dx %d)는 8ì˜ ë°°ìˆ˜ 여야합니다" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "ì¹´ë©”ë¼ ì²˜ë¦¬ê¸° 스레드 시작 오류 [ %d]" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "ftpì—서 recvê°€ 실패했습니다." #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "서버 ì‘답 : %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "ftp send userì—서 전송 실패" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "ftpì—서 전송 실패" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "ftpì—서 전송 실패" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "ftp ì—°ê²°ì—서 gethostbynameì´ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤." #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "ftp ì—°ê²°ì—서 gethostbyname 주소가 ì¼ì¹˜í•˜ì§€ 않습니다" #: src/netcam_ftp.c msgid "socket failed" msgstr "소켓 고장" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "ì—°ê²°ì„ ë§Œë“¤ì§€ 못했습니다" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "ìµëª…ì˜ ACCT를 요구하는 FTP 서버" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "소켓 옵션 설정 SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "ftp get ì—°ê²°ì—서 전송 실패" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "PASVì— ëŒ€í•œ ìž˜ëª»ëœ ë‹µë³€" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "ë°ì´í„° ì—°ê²°ì„ ë§Œë“¤ì§€ 못했습니다" #: src/netcam_ftp.c msgid "bind failed" msgstr "ë°”ì¸ë“œ 실패" #: src/netcam_ftp.c msgid "listen failed" msgstr "듣지 못했습니다" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "ftp get 소켓ì—서 전송 실패" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "ftp get 소켓ì—서 수ë½" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "FTP ì½ê¸°ì—서 recv 실패" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "ftp get 소켓 실패" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "유형 I를 FTP 서버로 보내는 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "ìž˜ëª»ëœ í† í° Content-Lengthì´ì§€ë§Œ ê°’ %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "콘í…츠 ê¸¸ì´ %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "콘í…츠 유형 %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "ì´ë¯¸ì§€ í—¤ë”를 ì½ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. ìŠ¤íŠ¸ë¦¬ë° ëª¨ë“œ (1). ë„ í—¤ë”." #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "" "ì´ë¯¸ì§€ í—¤ë”를 ì½ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. ìŠ¤íŠ¸ë¦¬ë° ëª¨ë“œ (1). 알 수없는 í—¤ë” " "' %s'" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "ì´ë¯¸ì§€ í—¤ë”를 ì½ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤ (2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "JPEGê°€ 아닌 í—¤ë”" #: src/netcam_http.c msgid "Content-Length 0" msgstr "콘í…츠 ê¸¸ì´ 0" #: src/netcam_http.c msgid "Found image header record" msgstr "발견 ëœ ì´ë¯¸ì§€ í—¤ë” ë ˆì½”ë“œ" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "'ì—°ê²°'요청 전송 중 오류" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "첫 번째 í—¤ë”를 받았습니다 ( ' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "첫 번째 í—¤ë”를 ì½ëŠ” 중 오류 ( %s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "HTTP ê²°ê³¼ 코드 %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "" "명백한 닫힌 HTTP 연결로 ì¸í•´ netcam Keep-Alive 플래그가 제거ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "비 ìŠ¤íŠ¸ë¦¬ë° ì¹´ë©”ë¼ (ì—°ê²° 유지 세트)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "비 ìŠ¤íŠ¸ë¦¬ë° ì¹´ë©”ë¼ (ì—°ê²° 유지 설정 안 ë¨)" #: src/netcam_http.c msgid "Streaming camera" msgstr "ìŠ¤íŠ¸ë¦¬ë° ì¹´ë©”ë¼" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "경계 문ìžì—´ [ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "í—¤ë”ì— ê²½ê³„ 문ìžì—´ì´ 없습니다." #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "" "ì•„ë§ˆë„ MJPG 블ë¡ì„ 사용하는 ìŠ¤íŠ¸ë¦¬ë° ì¹´ë©”ë¼, mjpg : // ì‚¬ìš©ì„ ê³ ë ¤í•˜ì‹­ì‹œì˜¤ë„·" "캠 URL." #: src/netcam_http.c msgid "Unrecognized content type" msgstr "ì¸ì‹ í•  수없는 콘í…츠 유형" #: src/netcam_http.c msgid "Content-length present" msgstr "ë‚´ìš© ê¸¸ì´ ì„ ë¬¼" #: src/netcam_http.c msgid "Content-length 0" msgstr "ë‚´ìš© ê¸¸ì´ 0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "Conn 발견 : í—¤ë” ë‹«ê¸° ( ' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "" "'ì—°ê²° : ì—°ê²° 유지'ë° 'ì—°ê²° : 닫기'í—¤ë”ê°€ ëª¨ë‘ ìˆ˜ì‹ ë˜ì—ˆìŠµë‹ˆë‹¤.ë™ìž‘ì€ keepalive" "를 제거합니다." #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "" "'ì—°ê²° : ì—°ê²° 유지'ë° 'ì—°ê²° : 닫기'í—¤ë”ê°€ ëª¨ë‘ ìˆ˜ì‹ ë˜ì—ˆìŠµë‹ˆë‹¤.ëª¨ì…˜ì€ ë³€ê²½ë˜ì§€ " "않습니다." #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "ì´ í—¤ë” ì„¸íŠ¸ì—서 Keep-Alive 필드를 받았습니다." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "'ì—°ê²° : ì—°ê²° 유지'ë˜ëŠ” 'ì—°ê²° : 닫기'í—¤ë”ê°€ 없습니다. \n" "ë™ìž‘ì€ keepalive를 제거합니다." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "'ì—°ê²° : ì—°ê²° 유지'ë˜ëŠ” 'ì—°ê²° : 닫기'í—¤ë”ê°€ 없습니다. \n" "ëª¨ì…˜ì€ ë³€ê²½ë˜ì§€ 않습니다." #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "'Connection : close'í—¤ë”ê°€ 수신ë˜ì–´ netcam Keep-Alive 플래그가 제거ë˜ì—ˆìŠµë‹ˆ" "다. \n" "Netcamì€ Keep-Alive를 ì§€ì›í•˜ì§€ 않습니다. 비 Keep-Aliveì—서 ëª¨ì…˜ì´ ê³„ì†ë©ë‹ˆë‹¤." #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "ì—°ê²° 유지 ê¸°ê°„ì´ ë§Œë£Œë˜ì—ˆìŠµë‹ˆë‹¤. \n" "ëª¨ì…˜ì´ ë„·ìº ì„ ë‹«ì€ ë‹¤ìŒ ìƒˆ 소켓으로 Keep-Alive를 다시 시작합니다." #: src/netcam_http.c msgid "disconnect" msgstr "분리" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo () 실패 ( %s) : %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "넷캠 ì—°ê²° í•´ì œ (1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "ì—°ê²° 유지가 설정ë˜ì§€ 않았으므로 넷캠 ì—°ê²°ì„ ëŠìŠµë‹ˆë‹¤." #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "keepaliveì—†ì´ ì†Œì¼“ 작성 시ë„ê°€ 실패했습니다." #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "keepalive가없고 새로운 ì†Œì¼“ì´ ìƒì„±ë¨ fd %d" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "keepaliveê°€ 설정ë˜ì–´ 있고 유효하지 ì•Šì€ ì†Œì¼“ì´ ìžˆìŠµë‹ˆë‹¤. 만들기새로운 ê²ƒì´ ì‹¤" "패했습니다." #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "keepaliveê°€ 설정ë˜ì–´ 있고 유효하지 ì•Šì€ ì†Œì¼“ì´ ìžˆìŠµë‹ˆë‹¤.fd %d가있는 것" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "KEEPALIVE는 %s입니다." #: src/netcam_http.c msgid "ON" msgstr "ì—" #: src/netcam_http.c msgid "OFF" msgstr "떨어져서" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "ì†Œì¼“ì— KEEPALIVEê°€ 설정ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "ì†Œì¼“ì˜ fcntl (1)" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "ì†Œì¼“ì˜ fcntl (2)" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "connect () 실패 ( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "넷캠 ì—°ê²° í•´ì œ (4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "connect ()ì˜ íƒ€ìž„ 아웃" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "넷캠 ì—°ê²° í•´ì œ (2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "ì—°ê²° 후 getsockopt" #: src/netcam_http.c msgid "connect returned error" msgstr "ì—°ê²° 오류 반환" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "넷캠 ì—°ê²° í•´ì œ (3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "버í¼ë¥¼ [ %d / %d]ì—서 [ %d / %d] ë°”ì´íŠ¸ë¡œ 확장" #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "ìž ìž¬ì  ë¶„í•  경계- %d ë¬¸ìž ì‚­ì œ, %d 위치 변경" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "경계 문ìžì—´ 다ìŒì— recv () 실패" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "netcamì„ ì—°ê²° 한 ìƒíƒœë¡œ 둡니다." #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "ì—°ê²° ì‹œë„ ì¤‘, 시간 # %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "ì¹´ë©”ë¼ë¥¼ ì—´ì§€ 못했습니다-êµ¬ì„±ì„ í™•ì¸í•˜ê³  netcameraê°€ 온ë¼ì¸ì¸ì§€ 확ì¸í•˜ì‹­ì‹œì˜¤" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "첫 번째 í—¤ë” ì½ê¸° 오류-재시ë„" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "첫 번째 ì¹´ë©”ë¼ í—¤ë”를 ì½ì§€ 못했습니다-지금 í¬ê¸°" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "" "Netcamì—는 HTTP / 1.0 : %s HTTP / 1.1 : %s Keep-Alive %s 플래그가 있습니다." #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "" "프ë¡ì‹œ 설정으로 ì¸í•´ netcam keepalive 플래그가 제거ë˜ì—ˆìŠµë‹ˆë‹¤.ì‚´ì•„ 유지." #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "첫 번째 스트림 í—¤ë”를 ì½ì§€ 못했습니다-지금 í¬ê¸°" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "ì—°ê²°ë˜ì–´ ì´ë¯¸ì§€ë¥¼ ì½ìŠµë‹ˆë‹¤." #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "다시 연결하려는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤." #: src/netcam_http.c msgid "lost the cam." msgstr "ìº ì„ ìžƒì—ˆë‹¤." #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "네트워í¬ì—서 [ %d] ë°”ì´íŠ¸ì˜ ë²„í¼ë¥¼ 리필했습니다." #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "[ %d / %d] í—¤ë” ë°”ì´íŠ¸ë¥¼ ì½ìŠµë‹ˆë‹¤." #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "ìž˜ëª»ëœ í—¤ë”를 수신하고 다시 ì—°ê²°" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "[ %d / %d] ì²­í¬ ë°”ì´íЏ ì½ê¸°, [ %d / %d] ì´" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "ì²­í¬ ì™„ë£Œ, ë²„í¼ ì‚¬ìš©ë¥  [ %d] ë°”ì´íЏ" #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "ì´ë¯¸ì§€ 완료, ë²„í¼ ì‚¬ìš©ë¥  [ %d] ë°”ì´íЏ" #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "MJPG ì²­í¬ë¥¼ ì½ê³  디코딩합니다." #: src/netcam_http.c msgid "Begin" msgstr "시작" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "통계 ( %s) 오류" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]! = 마지막 st mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "새 íŒŒì¼ ì´ë¯¸ì§€ 대기 시간 초과" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "새 íŒŒì¼ ì´ë¯¸ì§€ 대기 지연" #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "새 íŒŒì¼ ì´ë¯¸ì§€ 처리 중-st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "열기 ( %s) 오류 : %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "ì½ê¸° ( %s) 오류 : %d" #: src/netcam_http.c msgid "End" msgstr "종료" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> 파ì¼-> 경로 %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "ë„·ìº ì˜ ë°ì´í„°ê°€ 충분하지 않습니다." #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> jpeg 오류 %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "*** 새로운 사진 지연 성공 ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "JPEG 오류 %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "JPEG ì´ë¯¸ì§€ 처리-콘í…츠 ê¸¸ì´ %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "JPEG ì´ë¯¸ì§€ì™€ ì¹´ë©”ë¼ ë„ˆë¹„ / ë†’ì´ ë¶ˆì¼ì¹˜-ì˜ˆìƒ %dx %d, JPEG %dx %d회귀 율 %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s : 패킷 ë°°ì—´ì˜ í¬ê¸°ë¥¼ %d (으)로 ì¡°ì •" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s : av 카피 패킷 : %s, ì¸í„°ëŸ½íЏ : %s" #: src/netcam_rtsp.c msgid "True" msgstr "ì°¸ëœ" #: src/netcam_rtsp.c msgid "False" msgstr "그릇ëœ" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: ìž˜ëª»ëœ ë°ì´í„°ê°€ 있는 íŒ¨í‚·ì„ ë¬´ì‹œí•©ë‹ˆë‹¤." #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: 녹화 프레임 오류: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "유효하지 ì•Šì€ ë°ì´í„°ê°€ìžˆëŠ” 패킷 무시" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "패킷 디코딩 오류 : %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "%s: ë””ì½”ë”©ëœ HW를 시스템 메모리로 전송하는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "ì½”ë±ìœ¼ë¡œ íŒ¨í‚·ì„ ë³´ë‚´ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤ : %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "비디오 패킷 디코딩 오류 : 버í¼ë¡œ 복사" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: 하드웨어 장치:" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s(사용 가능)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s(구현ë˜ì§€ 않ìŒ)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s: 넷캠 ë””ì½”ë” %sì´(ê°€) 비활성화ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "vaapi pix 형ì‹ì„ 가져오지 못했습니다." #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "cuda pix 형ì‹ì„ 가져오지 못했습니다." #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s: 중단ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: 실패" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s: ë””ì½”ë” %sì´(ê°€) ìž‘ë™í•˜ì§€ 않았습니다." #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "%s: 사용ìžê°€ 요청한 ë””ì½”ë” %s 무시 ë° ì œê±°" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s: vaapi ë””ì½”ë” ì´ˆê¸°í™” 중" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: vaapi hw 장치를 ì°¾ì„ ìˆ˜ 없습니다." #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s: cuda ë””ì½”ë” ì´ˆê¸°í™” 중" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: cuda hw 장치를 ì°¾ì„ ìˆ˜ 없습니다." #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s: ë””ì½”ë” ì´ˆê¸°í™” 중" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s : ë””ì½”ë” ì‚¬ìš© %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: 디코ë”ê°€ 열렸습니다." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s : ì¹´ë©”ë¼ ì½ê¸° ( %s)ê°€ 시간 초과ë˜ì—ˆìŠµë‹ˆë‹¤" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s : ì¹´ë©”ë¼ ( %s) 시간 초과" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "swsframeì„ í• ë‹¹ í•  수 없습니다." #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "swsframeì„ í• ë‹¹ í•  수 없습니다." #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "스케ì¼ë§ 컨í…스트를 할당 í•  수 없습니다." #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "프레임 아웃 í¬ê¸° ê²°ì • 오류" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "%sì˜ ì‚¬ì§„ 할당 오류" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "그림 할당 오류 : %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "í¬ê¸° ì¡°ì • / 재 í¬ë§· 오류 : %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "출력 버í¼ì— í”„ë ˆìž„ì„ ë„£ëŠ” 중 오류 ë°œìƒ : %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s: 중단ë¨" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: av ì½ê¸° 프레임: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: ì¹´ë©”ë¼ %dì—서 ë°ì´í„°ë¥¼ 가져오려고 너무 ë§Žì´ ì‹œë„했습니다." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "%s: netcam ë§¤ê°œë³€ìˆ˜ì— ìº¡ì²˜ ì†ë„ê°€ 지정ë˜ì§€ 않았습니다. %d 사용" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s: netcam ë§¤ê°œë³€ìˆ˜ì— ìº¡ì²˜ ì†ë„ê°€ 지정ë˜ì§€ 않았습니다. 프레임 ì†ë„ %d 사용 중" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "ë„¤íŠ¸ì›Œí¬ ì¹´ë©”ë¼ê°€ 다른 ì‚¬ì§„ì„ ë³´ë‚´ê³  있습니다" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "êµ¬ì„±ì— ì§€ì •ëœ í¬ê¸° ë°" #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "다른 사진 형ì‹. 사진ì€" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "YUV420P로 트랜스 코딩ë˜ê³  요청 ëœ í¬ê¸°ë¡œ" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "구성 파ì¼ì—서. 가능한 경우 ë„·ìº ì„ ë‹¤ìŒìœ¼ë¡œ 변경하십시오." #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "YUV420P 형ì‹ì´ì–´ì•¼í•˜ë©° í¬ê¸°ëŠ”" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "CPU ì‚¬ìš©ëŸ‰ì„ ì¤„ ì´ë„ë¡ êµ¬ì„±í•˜ì‹­ì‹œì˜¤." #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "구성 파ì¼ì— ì§€ì •ëœ í¬ê¸°ë³´ë‹¤ í½ë‹ˆë‹¤." #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "ì‚¬ì§„ì´ í¬ê¸°ë¡œ 트랜스 코딩ë˜ê³  있습니다" #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "구성ì—서 요청했습니다. 가능한 경우 변경" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "ë™ì¼í•œ í¬ê¸°ë¥¼ 나타내는 netcam ë˜ëŠ” 구성" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "CPU ì‚¬ìš©ëŸ‰ì„ ì¤„ì¼ ìˆ˜ 있습니다." #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "넷캠 : %dx %d => 구성 : %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "전송 ëœ ì´ë¯¸ì§€ê°€" #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "YUV420P로 트랜스 코딩 ë¨. 가능한 경우 넷캠 변경" #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "CPU ì‚¬ìš©ë¥ ì„ ë‚®ì¶”ë ¤ë©´ YUV420P로 사진 형ì‹ì„ 지정하십시오." #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: rtsp/rtmp 설정 중" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: ìž…ë ¥ í˜•ì‹ mjpeg 설정 중" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: ìž…ë ¥ í˜•ì‹ video4linux2 설정" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: ë™ì˜ìƒ íŒŒì¼ ì„¤ì • 중" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s: %s 설정 중" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: 옵션: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "netcamì„ í†µí•´ v4l2 설정" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "ë„·ìº ì„ í†µí•œ íŒŒì¼ ì„¤ì •" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "netcamì„ í†µí•´ %s 설정" #: src/netcam_rtsp.c msgid "highres" msgstr "ê³ í•´ìƒë„" #: src/netcam_rtsp.c msgid "norm" msgstr "표준" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "%s ìŠ¤íŠ¸ë¦¼ì„ ì„¤ì • 중입니다." #: src/netcam_rtsp.c msgid "Unknown" msgstr "알 수 없는" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "통과를 위해 복사 ëœ ìŠ¤íŠ¸ë¦¼" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "ë„ ê²½ë¡œë¥¼ 통과하여 ì—°ê²°" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s : ì¹´ë©”ë¼ë¥¼ ì—´ 수 없습니다 ( %s) : %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s : ì¹´ë©”ë¼ë¥¼ 열었습니다 ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s : 스트림 정보를 ì°¾ì„ ìˆ˜ 없습니다 : %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s : ì½”ë± ì»¨í…스트를 ì—´ 수 없습니다 : %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s : ì¹´ë©”ë¼ ì´ë¯¸ì§€ í¬ê¸°ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s : í”„ë ˆìž„ì„ í• ë‹¹ í•  수 없습니다." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s : 통과를 위해 ìŠ¤íŠ¸ë¦¼ì„ ë³µì‚¬í•˜ì§€ 못했습니다." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s : 첫 번째 ì´ë¯¸ì§€ë¥¼ ì½ì§€ 못했습니다" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s : ì¹´ë©”ë¼ ( %s) ì—°ê²°" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s: Netcam 캡처 ì†ë„는 %d입니다." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s: ì¹´ë©”ë¼ ì†ŒìŠ¤ëŠ” %d FPS입니다." #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s: ì¹´ë©”ë¼ ì†ŒìŠ¤ FPS를 ê²°ì •í•  수 없습니다." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s: 캡처 ì†ë„ê°€ ì¹´ë©”ë¼ FPS보다 낮습니다." #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s: 디코딩 오류가 ë°œìƒí•©ë‹ˆë‹¤." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "%s: ì¹´ë©”ë¼ FPS보다 약간 ë” í° ìº¡ì²˜ ì†ë„를 권장합니다." #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s : ì¹´ë©”ë¼ì™€ 다시 ì—°ê²° 중 ..." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s : ì¹´ë©”ë¼ê°€ 다시 ì—°ê²°ë˜ì§€ 않았습니다." #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s : 10 초마다 ì¹´ë©”ë¼ í™•ì¸." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s : ì¹´ë©”ë¼ ì²˜ë¦¬ê¸° 스레드 [ %d]ì´ (ê°€) 시작ë˜ì—ˆìŠµë‹ˆë‹¤" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s : 처리기 루프가 완료ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s : 처리기 스레드 시작 오류" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s : 핸들러ì—서 첫 번째 ì´ë¯¸ì§€ë¥¼ 기다리는 중입니다." #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "RTSP 컨í…스트를 만들 수 없습니다" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "RTSP ë†’ì€ ì»¨í…스트를 만들 수 없습니다" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "FFmpeg ì§€ì› ì—†ìŒ" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s : ë„¤íŠ¸ì›Œí¬ ì¹´ë©”ë¼ë¥¼ 종료하고 있습니다." #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s : 처리기 스레드ì—서 ì‘ë‹µì´ ì—†ìŠµë‹ˆë‹¤." #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "ì •ìƒ í•´ìƒë„ : 종료 완료" #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "ê³ í•´ìƒë„ : 시스템 종료가 완료ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "EXIF를 webp chunk로 설정할 수 없습니다" #: src/picture.c msgid "libwebp version error" msgstr "libwebp 버전 오류" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "libwebp ì´ë¯¸ì§€ ë²„í¼ í• ë‹¹ 오류" #: src/picture.c msgid "libwebp image compression error" msgstr "libwebp ì´ë¯¸ì§€ ì••ì¶• 오류" #: src/picture.c msgid "unable to assemble webp image" msgstr "webp ì´ë¯¸ì§€ë¥¼ 조립할 수 없습니다" #: src/picture.c msgid "unable to save webp image to file" msgstr "webp ì´ë¯¸ì§€ë¥¼ 파ì¼ë¡œ 저장할 수 없습니다" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "%s 파ì¼ì— ê·¸ë¦¼ì„ ì“¸ 수 없습니다-ëŒ€ìƒ ë””ë ‰í† ë¦¬ì— ëŒ€í•œ 액세스 ê¶Œí•œì„ í™•ì¸í•˜ì‹­ì‹œ" "오 \n" "ì´ ì¹˜ëª…ì ì¸ 오류로 ì¸í•´ 스레드가 완료ë©ë‹ˆë‹¤." #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "%s 파ì¼ì— ê·¸ë¦¼ì„ ì“¸ 수 없습니다" #: src/picture.c msgid "Error getting PGM vars." msgstr "PGM 변수를 가져오는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "ì´ê²ƒì€ pgm 파ì¼ì´ 아니며 ' %s'로 시작합니다" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "마법 %s: 너비 %s(%d): ë†’ì´ %s(%d): 최대값: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "pgm 파ì¼ì—서 ì´ë¯¸ì§€ ë°ì´í„°ë¥¼ ì½ì§€ 못했습니다" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "ì§€ì •ëœ ë§ˆìŠ¤í¬ íŒŒì¼ì´ ì¹´ë©”ë¼ì˜ ì´ë¯¸ì§€ì™€ í¬ê¸°ê°€ 다릅니다." #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "ë§ˆìŠ¤í¬ ì´ë¯¸ì§€ì˜ í¬ê¸°ë¥¼ %dx %dì—서 %dx %d (으)로 조정하려고합니다" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "" "ë§ˆìŠ¤í¬ íŒŒì¼ %sì„ (를) 쓸 수 없습니다. ëŒ€ìƒ ë””ë ‰í† ë¦¬ì— ëŒ€í•œ 액세스 ê¶Œí•œì„ í™•ì¸" "하십시오." #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "ë§ˆìŠ¤í¬ íŒŒì¼ %sì„ (를) 쓸 수 없습니다" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "기본 마스í¬ë¥¼ pgm 파ì¼ë¡œ ì“°ì§€ 못했습니다." #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "빈 ë§ˆìŠ¤í¬ %s ìƒì„± \n" "ë§ˆìŠ¤í¬ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë ¤ë©´ì´ íŒŒì¼ì„ 편집하고 ëª¨ì…˜ì„ ë‹¤ì‹œ 실행하십시오." #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "구성 옵션 \"rotate \"는 90ì˜ ë°°ìˆ˜ê°€ 아닙니다 : %d" #: src/track.c msgid "internal error" msgstr "ë‚´ë¶€ 오류" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "ë‚´ë¶€ 오류, %huì€ (는) 알려진 트랙 ìœ í˜•ì´ ì•„ë‹™ë‹ˆë‹¤" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "í¬íЏ %s dev fd %i, 모터 %hu 명령 %hu ë°ì´í„° %hu" #: src/track.c msgid "Status byte timeout!" msgstr "ìƒíƒœ ë°”ì´íЏ 타임 아웃!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "ì§ë ¬ 장치 %sì„ (를) 열려고 시ë„하십시오." #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "ì§ë ¬ 장치 %sì„ (를) ì—´ 수 없습니다" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "ì§ë ¬ 장치 %sì„ (를) 초기화 í•  수 없습니다" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "ì§ë ¬ 장치 %sì„ (를) ì—´ê³  초기화했습니다. fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "ìŠ¤í…Œí¼ ì„¼í„° ()를 시ë„하는 중 %s 장치가 ì•„ì§ ì‹œìž‘ë˜ì§€ 않았습니다." #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "%sì—서 ìŠ¤í…Œí¼ ìž¥ì¹˜ë¥¼ 초기화하지 못했습니다 (fd [ %i])." #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "성공, 장치 시작 %s, fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "SENDS í¬íЏ %s dev fd %i, 모터 %hu 명령 %hu ë°ì´í„° %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "명령 반환 %d" #: src/track.c msgid "Problem opening servo!" msgstr "서보 개방 문제!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d, cent-> y %d, reversex %d, reversey %d ìˆ˜ë™ %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d ê°’ì´ ë²”ìœ„ë¥¼ 벗어났습니다! ( %d- %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d ê°’ì´ ë²”ìœ„ë¥¼ 벗어났습니다! (%d-%d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "X 오프셋 %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "X cent->x %d, cent->y %d, reversex %d, reversey %d motorx %d ë°ì´í„° %d 명령%d" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Y 오프셋 %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Y cent->x %d, cent->y %d, reversex %d, reversey %d motory %d data %d 명령%d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "X 오프셋 %d, Y 오프셋 %d, x 위치 %d. y 위치 %d, ì—­ %d, 역순%d, 단계 í™” %d" #: src/track.c msgid "Return byte timeout!" msgstr "ë°”ì´íЏ 타임 ì•„ì›ƒì„ ë°˜í™˜!" #: src/track.c msgid "Unable to set camera speed" msgstr "ì¹´ë©”ë¼ ì†ë„를 설정할 수 없습니다" #: src/track.c msgid "succeed" msgstr "성공하다" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "pwc ì¹´ë©”ë¼ë¥¼ 시작 위치로 재설정하지 못했습니다! ì´ìœ " #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "VIDIOCPWCMPTGRANGE 실패" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "ì¹´ë©”ë¼ë¥¼ 팬 / 틸트하지 못했습니다! ì´ìœ " #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "UVC ì¹´ë©”ë¼ë¥¼ 시작 위치로 재설정하지 못했습니다! ì´ìœ " #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "UVC ì¹´ë©”ë¼ë¥¼ 시작 위치로 재설정" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl 쿼리 제어" #: src/track.c msgid "Getting camera range" msgstr "ì¹´ë©”ë¼ ë²”ìœ„ 얻기" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "" "ìž…ë ¥ 매개 변수 ABS 팬 최소 %d, 팬 최대 %d, 기울기 최소 %d, 기울기 최대 %d" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "ìž…ë ¥ 매개 변수 ABS X Angel %d, Y Angel %d" #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "SET ABS ì´ë™ X %dì˜ ê²½ìš° Y %d ì´ë™" #: src/track.c msgid "Failed to move UVC camera!" msgstr "UVC ì¹´ë©”ë¼ë¥¼ ì´ë™í•˜ì§€ 못했습니다!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "발견 ëœ MINMAX = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "ABS Y Angel ì „ : x = %d, Y = %d," #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "ABS Y Angel 후 : x = %d, Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "SET REL 팬 최소 %d, 팬 최대 %d, 기울기 최소 %d, 기울기 최대 %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "SET REL 트랙 팬 엔젤 %dì˜ ê²½ìš°, 트랙 기울기 엔젤 %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "SET REL ì´ë™ X %dì˜ ê²½ìš° Y %d ì´ë™" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, control S = %d, Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, 제어 S = %d, Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "REL Y Angel ì´ì „ : x = %d, Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "REL Y Angel 후 : x = %d, Y = %d" #: src/translate.c msgid "Language: English" msgstr "언어 : ì˜ì–´" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "%llu ë°”ì´íŠ¸ì˜ ë©”ëª¨ë¦¬ë¥¼ 할당 í•  수 없습니다!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "경고! %s 함수는 %pì—서 0 ë°”ì´íŠ¸ë¡œ 메모리 ë¸”ë¡ í¬ê¸°ë¥¼ 조정하려고합니다!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "오프셋 %pì—서 메모리 블ë¡ì˜ í¬ê¸°ë¥¼ %llu ë°”ì´íЏ (기능 %s)로 ì¡°ì •í•  수 없습니" "다!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "디렉토리 %s를 만드는 ì¤‘ì— ë¬¸ì œê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤" #: src/util.c #, c-format msgid "creating directory %s" msgstr "디렉토리 %s를 만드는 중" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "%s 모드ì—서 %s 파ì¼ì„ 여는 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤" #: src/util.c msgid "Error closing file" msgstr "íŒŒì¼ ë‹«ê¸° 오류" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbventid}는 ì§€ì›ë˜ì§€ 않습니다. ì´ë²¤íЏ ì•„ì´ë””를 사용하세요." #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "유효하지 ì•Šì€ í˜•ì‹ ì§€ì •ìž í‚¤ì›Œë“œ %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "스레드 ì´ë¦„ %sì„ (를) 설정할 수 없습니다" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "FFMPEG ë²„ì „ì´ ë„ˆë¬´ 오래ë˜ì—ˆìŠµë‹ˆë‹¤. 통과 처리 비활성화" #: src/util.c msgid "pass-through enabled." msgstr "통과 가능." #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "매개변수 >%s<ì„(를) 설정하는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "구문 ë¶„ì„: >%s< >%s<" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "구문 ë¶„ì„: >수정ë¨< >수정ë¨<" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "parm nm ì»¨íŠ¸ë¡¤ì„ êµ¬ë¬¸ ë¶„ì„하는 ë™ì•ˆ 오류 ë°œìƒ: %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "parm vl ì»¨íŠ¸ë¡¤ì„ êµ¬ë¬¸ ë¶„ì„하는 ë™ì•ˆ 오류 ë°œìƒ: %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "ì˜¨ë„ ì„¤ì • 오류: %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "ì»¨íŠ¸ë¡¤ì„ ë‹¤ì‹œ ë¶„ì„하는 ë™ì•ˆ 오류 ë°œìƒ: %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "구문 ë¶„ì„: %s" #: src/util.c msgid "Parsing: " msgstr "구문 ë¶„ì„: <편집ë¨>" #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "컨트롤 구문 ë¶„ì„ ì˜¤ë¥˜: %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "오류: %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "새 넷캠 매개변수: %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "새 netcam ìƒìœ„ 매개변수: %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "새 비디오 매개변수: %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "새 웹 컨트롤 í—¤ë” ë§¤ê°œë³€ìˆ˜: %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "새로운 webcontrol í—¤ë” ë§¤ê°œë³€ìˆ˜: <편집ë¨>" #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "새 스트림 í—¤ë” ë§¤ê°œë³€ìˆ˜: %s" #: src/util.c msgid "New stream_header_params: " msgstr "새 스트림 í—¤ë” ë§¤ê°œë³€ìˆ˜: <편집ë¨>" #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "í”„ë¡œê·¸ëž˜ë° ì˜¤ë¥˜ìž…ë‹ˆë‹¤. 알 수 없는 구성 항목: %s " #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE 색조 설정 오류 [ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "[ %d]까지" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE 색조를 얻는 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT ì±„ë„ ì„¤ì • 오류 [ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT 채ë„를 얻는 중 오류" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT 오류 설정 대비 [ %d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT 대비를 얻는 중 오류" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "METEORSBRIG ë°ê¸° [ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIGì˜ ë°ê¸°" #: src/video_bktr.c msgid "Not implemented" msgstr "구현ë˜ì§€ 않ìŒ" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "장치 ìž…ë ¥ %dì´ (ê°€) 범위를 벗어났습니다 (0-4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d 유효하지 않ìŒ-복합 %d ì‹œë„ ì¤‘" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "" "BT848SFMT, ìž…ë ¥ 형ì‹ì„ 설정할 수 없습니다. 기본값으로 다시 시ë„하십시오." #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "BT848SFMT, ìž…ë ¥ 형ì‹ì„ 기본값으로 설정할 수 없습니다" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "지오메트리를 설정할 수 없습니다" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "[ %d / %d]까지 규범 %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "유효하지 ì•Šì€ ë¹ˆë„[%ld]입니다. 소스 ìž…ë ¥ [%i]ì˜ ê²½ìš°" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "주파수 [%ld] 소스 ìž…ë ¥ [%i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "ìž…ë ¥ 설정 [ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "ìž…ë ¥ í˜•ì‹ ì„¤ì • [ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "í˜•ìƒ ì„¤ì • [ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "주파수 설정 (ì•„ì§ êµ¬í˜„ë˜ì§€ 않ìŒ)" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "사ì´ì§• ë²„í¼ 3 ë°°" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "í¬ê¸° ì¡°ì • 버í¼ë¥¼ 3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap 실패" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "ë‹¨ì¼ ë°©ë²•ì„ ì‚¬ìš©í•œ METEORCAPTUR 오류 캡처" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "ë‹¨ì¼ ë°©ë²•ì„ ì‚¬ìš©í•˜ì—¬ 캡처 오류" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "비디오 장치를 ì°¾ì„ ìˆ˜ 없습니다" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "비디오 장치 %s 닫기" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "" "여전히 %d ê°œì˜ ì—°ê²°ì´ ìžˆìŠµë‹ˆë‹¤. 장치 %sì˜ ê²½ìš°. 우리는 지금 ë‹«ì§€ 않습니다" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "구성 ì´ë¯¸ì§€ 너비 ( %d)ê°€ 모듈로가 아닙니다 8" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "구성 ì´ë¯¸ì§€ ë†’ì´ ( %d)ê°€ 모듈로가 아님 8" #: src/video_bktr.c msgid "Stopping capture" msgstr "캡처 중지" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "[ %s] ìž…ë ¥ 재사용 [ %d, %d] 캡처 방법 변경 METEOR CAP SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "비디오 팔레트 YUV420P 설정 imgs.size 표준 ë° imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "열린 비디오 장치 %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "열린 튜너 장치 %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "ì†ìƒëœ ì´ë¯¸ì§€ ... 계ì†" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "SOI 위치가 %d ë°”ì´íЏ 씩 ì¡°ì •ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "mmalcam 정리 호출" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "넷캠 정리 호출" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "netcam rtsp 정리 호출" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "V4L2 장치 정리" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "BKTR 장치 정리" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "ì¹´ë©”ë¼ ìž¥ì¹˜ 정리 ì—†ìŒ (MMAL, Netcam, V4L2, BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "MMAL 캠 열기" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "MMAL ìº ì„ ì—´ì§€ 못했습니다" #: src/video_common.c msgid "Opening Netcam" msgstr "넷캠 열기" #: src/video_common.c msgid "Netcam failed to open" msgstr "ë„·ìº ì„ ì—´ì§€ 못했습니다" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Netcam RTSP 열기" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Netcam RTSP를 ì—´ì§€ 못했습니다" #: src/video_common.c msgid "Opening V4L2 device" msgstr "V4L2 장치 열기" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "V4L2 장치를 ì—´ì§€ 못했습니다" #: src/video_common.c msgid "Opening BKTR device" msgstr "BKTR 장치 열기" #: src/video_common.c msgid "BKTR device failed to open" msgstr "BKTR 장치를 ì—´ì§€ 못했습니다" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "ì¹´ë©”ë¼ ìž¥ì¹˜ë¥¼ 지정하지 않았습니다 (MMAL, Netcam, V4L2, BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "' %s'ì„ (를) ì—´ì§€ 못했습니다." #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "ë²„í¼ ì§€ì • 오류 : %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "ì˜¤í”„ë‹ ë²„í¼ : %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "ì½ê¸° ë²„í¼ : %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "비디오 장치 ' %s'ì„ (를) 찾았습니다. %d" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "파ì´í”„ 출력으로 %sì„ (를) 열었습니다." #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "파ì´í”„ 출력 실패로 %s 열기" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "ì˜¤ë¦¬ì§€ë„ íŒŒì´í”„ 사양" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "제안 ëœ íŒŒì´í”„ 사양" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "최종 파ì´í”„ 사양" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "ìž¥ì¹˜ì— ëŒ€í•œ ì»¨íŠ¸ë¡¤ì´ ì—†ìŠµë‹ˆë‹¤." #: src/video_v4l2.c msgid "---------Controls---------" msgstr "---------통제 수단---------" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr "V4L2 ID ì´ë¦„ ë° ë²”ìœ„" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "ì‚¬ìš©ìž ê°’ì„ ìž¬ì„¤ì •í•˜ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "제어 %s \"%s\"ì„(를) %d(으)로 설정한 ìƒíƒœë¡œ 둡니다." #: src/video_v4l2.c msgid "Device not ready" msgstr "장치가 준비ë˜ì§€ 않았습니다" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "제어 \" %s \"를 ê°’ %d (으)로 설정" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "제어 %s \"%s\"ì„(를) %d(으)로 설정하지 못했습니다." #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "%s 제어 옵션 ê°’ %sì´(ê°€) 최소값 미만입니다. 최소 %d 사용 " #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "%s 제어 옵션 ê°’ %sì´(ê°€) ìµœëŒ€ê°’ì„ ì´ˆê³¼í•©ë‹ˆë‹¤. 최대 %d 사용 " #: src/video_v4l2.c msgid "control type not supported yet" msgstr "ì•„ì§ ì§€ì›ë˜ì§€ 않는 제어 유형" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "ìž…ë ¥ %dì„ (를) 쿼리 í•  수 ​​없습니다. WEBCAM 변경 ìž…ë ¥ì„ ì‚¬ìš©í•˜ëŠ” 경우 VIDIOC " "ENUMINPUTconfì˜ ê°’ -1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "ì´ë¦„ = \" %s \", 유형 0x %08X, ìƒíƒœ %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "ì´ë¦„ = \" %s \",-튜너" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "ì´ë¦„ = \" %s \"-ì¹´ë©”ë¼" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "ìž…ë ¥ ì„ íƒ ì˜¤ë¥˜ %d VIDIOC S INPUT" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "장치는 PAL / NTSC 규범 ì§€ì •ì„ ì§€ì›í•˜ì§€ 않습니다" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "-비디오 표준 %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "표준 방법 ì„ íƒ ì˜¤ë¥˜ %d VIDIOC S STD" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "NTSC로 ì„¤ì •ëœ ë¹„ë””ì˜¤ 표준" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "비디오 í‘œì¤€ì„ SECAM으로 설정" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "PAL로 ì„¤ì •ëœ ë¹„ë””ì˜¤ 표준" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "튜너 %d VIDIOC G 튜너" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "튜너 %d 설정" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "주파수 %ul VIDIOC S 주파수" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "빈ë„를 %ul로 설정" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "%c%c%c%c(%dx%d)를 사용할 수 없습니다." #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "테스트 팔레트 %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "ë³´í­ %d로 ì´ë¯¸ì§€ í¬ê¸° %dx%d í™•ì¸ ì¤‘" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "장치ì—서 ë³´í­ ê°’ì´ ì œê³µë˜ì§€ 않았습니다." #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "너비(%d)는 ë³´í­(%d)보다 작아야 합니다." #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "ì´ë¯¸ì§€ 너비(%d)ê°€ ë³´í­(%d)ì˜ ë°°ìˆ˜ê°€ 아닙니다." #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "불가능한 ì¡°ê±´: 너비(%d), ë³´í­(%d), ë³´í­ë‹¹(%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "ì´ë¯¸ì§€ 너비가 %dë°”ì´íŠ¸ë¡œ 채워집니다." #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "%ix %iì—서 %ix %i로 í•´ìƒë„ ì¡°ì •" #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "모듈로가 아닌 ì¡°ì • ëœ í•´ìƒë„ 8." #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "구성 파ì¼ì—서 다른 팔레트 ë˜ëŠ” 너비 / 높ì´ë¥¼ 지정하십시오." #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "픽셀 형ì‹ì„ 설정하는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "팔레트 사용 %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "너비 ( %d)로 ì¡°ì •" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "ë†’ì´ ( %d)로 ì¡°ì •" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "구성 팔레트 ìƒ‰ì¸ %d (%s)ì´ ìž‘ë™í•˜ì§€ 않습니다. 사용 ëœ ì¹˜ìˆ˜ %dx%d." #: src/video_v4l2.c msgid "Supported palettes:" msgstr "ì§€ì›ë˜ëŠ” 팔레트 :" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d- %s (ì••ì¶• : %d) ( %# x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "ì„ íƒëœ 팔레트 %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "%s 형ì‹ì— 대한 팔레트 ì„ íƒì— 실패했습니다" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "호환ë˜ëŠ” 팔레트 형ì‹ì„ ì°¾ì„ ìˆ˜ 없습니다." #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "" "메모리 ë§µì— ë²„í¼ %dì„ (를) 요청하는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. VIDIOC REQBUFS" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "mmap ì •ë³´ : 프레임 = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "ë²„í¼ ë©”ëª¨ë¦¬ê°€ 충분하지 않습니다 %d %s< >%s< >%s<" msgstr "요청 ëœ ìž˜ëª»ëœ ì¡°ì¹˜ :> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "모국어 : 켜기" #: src/webu.c msgid "Native Language : off" msgstr "모국어 : í•´ì œ" #: src/webu.c msgid "Set the value to null/zero" msgstr "ê°’ì„ null / zero로 설정" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "ì—°ê²° 무시: %s" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "%sì˜ ì¸ì¦ 실패" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "웹 컨트롤 ì‚¬ìš©ìž ì—†ìŒ : 패스 제공" #: src/webu.c msgid "No stream user:pass provided" msgstr "스트림 ì‚¬ìš©ìž ì—†ìŒ : 패스 제공" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "ìž˜ëª»ëœ ë‹µë³€" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "웹 컨트롤 í—¤ë” %s %sì„(를) 추가하는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "스트림 í—¤ë” %s %sì„(를) 추가하는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "요청 ëœ ìž˜ëª»ëœ ë°©ë²• : %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "ì—°ê²° : %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "페ì´ì§€ 전송 실패 %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "스트림 ì‚¬ì§„ì´ ì•„ì§ ì¤€ë¹„ë˜ì§€ 않았습니다." #: src/webu.c msgid "Stream process requested to finish." msgstr "스트림 프로세스가 완료ë˜ë„ë¡ ìš”ì²­ë˜ì—ˆìŠµë‹ˆë‹¤." #: src/webu.c msgid "Send page failed." msgstr "페ì´ì§€ ë³´ë‚´ê¸°ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤." #: src/webu.c msgid "Basic authentication: available" msgstr "기본 ì¸ì¦ : 가능" #: src/webu.c msgid "Basic authentication: disabled" msgstr "기본 ì¸ì¦ : 비활성화" #: src/webu.c msgid "Digest authentication: available" msgstr "다ì´ì œìŠ¤íŠ¸ ì¸ì¦ : 사용 가능" #: src/webu.c msgid "Digest authentication: disabled" msgstr "다ì´ì œìŠ¤íŠ¸ ì¸ì¦ : 비활성화" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd ë¼ì´ë¸ŒëŸ¬ë¦¬ê°€ 너무 ì˜¤ëž˜ëœ ipv6 비활성화" #: src/webu.c msgid "IPV6: available" msgstr "IPV6 : 사용 가능" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6 : 비활성화" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd ë¼ì´ë¸ŒëŸ¬ë¦¬ê°€ 너무 ì˜¤ëž˜ëœ SSL / TLS 비활성화" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS : 사용 가능" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS : 비활성화" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "SSL / TLS ì§€ì›ì„위한 파ì¼ì„ ì½ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "SSL / TLSê°€ 요청했지만 ì¸ì¦ì„œ 파ì¼ì´ 제공ë˜ì§€ 않았습니다. SSL / TLS 비활성화" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "" "SSL / TLSê°€ 요청ë˜ì—ˆì§€ë§Œ 키 파ì¼ì´ 제공ë˜ì§€ 않았습니다. SSL / TLS 비활성화" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "í¬íЏ %dì—서 webcontrol 시작" #: src/webu.c msgid "Unable to start MHD" msgstr "MHD를 시작할 수 없습니다" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "í¬íЏ %dì—서 웹 컨트롤 시작" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "í¬íЏ / ì¹´ë©”ë¼ ID %d / %dì—서 ì¹´ë©”ë¼ %d ìŠ¤íŠ¸ë¦¼ì„ ì‹œìž‘í–ˆìŠµë‹ˆë‹¤." #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "í¬íЏ %dì—서 ì¹´ë©”ë¼ %d ìŠ¤íŠ¸ë¦¼ì„ ì‹œìž‘í–ˆìŠµë‹ˆë‹¤." #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "í¬íЏ %dì—서 모든 ì¹´ë©”ë¼ ìŠ¤íŠ¸ë¦¼ 시작" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "í¬íЏ %dì—서 ì¹´ë©”ë¼ %d 스트림 시작" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "ì¹´ë©”ë¼ %dì˜ ìŠ¤íŠ¸ë¦¼ì„ ì‹œìž‘í•  수 없습니다" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "중복 í¬íЏ 요청 %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "ìž˜ëª»ëœ webcontrol 잠금 최대 IP입니다. 25와 ë™ì¼í•˜ê²Œ 설정합니다. " #: src/webu_html.c msgid "Cameras" msgstr "ì¹´ë©”ë¼" #: src/webu_html.c msgid "Camera" msgstr "ì¹´ë©”ë¼" #: src/webu_html.c msgid "All" msgstr "모든" #: src/webu_html.c msgid "Action" msgstr "ë™ìž‘" #: src/webu_html.c msgid "Start Event" msgstr "시작 ì´ë²¤íЏ" #: src/webu_html.c msgid "End Event" msgstr "종료 ì´ë²¤íЏ" #: src/webu_html.c msgid "Snapshot" msgstr "스냅 샷" #: src/webu_html.c msgid "Change Configuration" msgstr "구성 변경" #: src/webu_html.c msgid "Write Configuration" msgstr "쓰기 구성" #: src/webu_html.c msgid "Tracking" msgstr "ì¶”ì " #: src/webu_html.c msgid "Pause" msgstr "ì¼ì‹œ 중지" #: src/webu_html.c msgid "Start" msgstr "스타트" #: src/webu_html.c msgid "Restart" msgstr "재시작" #: src/webu_html.c msgid "Quit" msgstr "종료" #: src/webu_html.c msgid "Help" msgstr "ë„움ë§" #: src/webu_html.c msgid "No Configuration Options" msgstr "구성 옵션 ì—†ìŒ" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "ì œí•œëœ êµ¬ì„± 옵션" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "고급 구성 옵션" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "기밀 구성 옵션" #: src/webu_html.c msgid "All Cameras" msgstr "모든 ì¹´ë©”ë¼" #: src/webu_html.c msgid "Not running" msgstr "활성화ë˜ì§€ 않ì€" #: src/webu_html.c msgid "Lost connection" msgstr "ì—°ê²°ì´ ëŠì–´ì¡ŒìŠµë‹ˆë‹¤" #: src/webu_html.c msgid "Paused" msgstr "ì¼ì‹œ 중지ë¨" #: src/webu_html.c msgid "Active" msgstr "유효한" #: src/webu_html.c msgid "Select option" msgstr "옵션 ì„ íƒ" #: src/webu_html.c msgid "Save" msgstr "저장" #: src/webu_html.c msgid "Pan/Tilt" msgstr "회전 / 틸트" #: src/webu_html.c msgid "Absolute Change" msgstr "절대 변경" #: src/webu_html.c msgid "Center" msgstr "센터" #: src/webu_html.c msgid "Pan" msgstr "회전" #: src/webu_html.c msgid "Tilt" msgstr "틸트" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "유효하지 ì•Šì€ ìŠ¤ë ˆë“œê°€ 지정ë˜ì—ˆìŠµë‹ˆë‹¤ : %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "ì¹´ë©”ë¼ ë³„ í¬íŠ¸ì— ëŒ€í•œ ìž˜ëª»ëœ URL : %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "ì¹´ë©”ë¼ íŠ¹ì • 파ì¼ì„ 사용할 때 스레드 0ì˜ URLì´ ìœ íš¨í•˜ì§€ 않습니다. : %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "ì¹´ë©”ë¼ íŠ¹ì • í¬íŠ¸ì˜ ìž˜ëª»ëœ URL : %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "ì´ë¯¸ì§€ë¥¼ ìŠ¤íŠ¸ë¦¬ë° í•  수 없습니다." #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "' %s'ì˜µì…˜ì´ ê°ê°€ ìƒê°ë˜ì—ˆìŠµë‹ˆë‹¤. 새로운 옵션 ì´ë¦„ì€ '%s' 입니다" motion-release-4.6.0/po/li.po000066400000000000000000003260711452402535500160440ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:35-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: li\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "%s po %s versijos" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "Nežinoma konfigÅ«racijos parinktis \" %s \"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "KonfigÅ«racijos failo raÅ¡ymas %s" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "KonfigÅ«racija %s nerasta - bandoma numatytosios reikÅ¡mÄ—s." #: src/conf.c msgid "Error getcwd" msgstr "Klaida „getcwd“" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "Nepavyko atidaryti %s failo" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "Neteisingas failo vardas %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "Apdorojama gija 0 - konfigÅ«racijos failas %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "" "Nereikia apdoroti konfigÅ«racijos failo, naudojant numatytÄ…sias reikÅ¡mes" #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "KonfigÅ«ravimo parametrų raÅ¡ymas iÅ¡ visų failų ( %d):" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "Gija %d - KonfigÅ«racijos failas: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s " #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "Apdorojamas konfigÅ«racijos failas %s" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "Kameros katalogo konfigÅ«racija %s nerasta" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "Kameros konfigÅ«racijos failas %s nerastas" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "Apdorojamas fotoaparato konfigÅ«racijos failas %s" #: src/conf.c msgid "daemon" msgstr "demonas" # Configuration Option Hints #: src/conf.c msgid "setup_mode" msgstr "KonfigÅ«ravimo režimas" #: src/conf.c msgid "pid_file" msgstr "pid failas" #: src/conf.c msgid "log_file" msgstr "žurnalo failas" #: src/conf.c msgid "log_level" msgstr "žurnalo lygis" #: src/conf.c msgid "log_type" msgstr "žurnalo tipas" #: src/conf.c msgid "quiet" msgstr "tyliai" #: src/conf.c msgid "watchdog_tmo" msgstr "waakhond tmo" #: src/conf.c msgid "watchdog_kill" msgstr "waakhond doden" #: src/conf.c msgid "native_language" msgstr "Gimtoji kalba" #: src/conf.c msgid "camera_name" msgstr "kameros pavadinimas" #: src/conf.c msgid "camera_id" msgstr "kameros ID" #: src/conf.c msgid "target_dir" msgstr "taikinys rež" #: src/conf.c msgid "video_device" msgstr "videoapparaat" #: src/conf.c msgid "video_params" msgstr "video parameters" #: src/conf.c msgid "auto_brightness" msgstr "automatinis ryÅ¡kumas" #: src/conf.c msgid "tuner_device" msgstr "tunerapparaat" #: src/conf.c msgid "roundrobin_frames" msgstr "apvaliojo rÄ—mo rÄ—mai" #: src/conf.c msgid "roundrobin_skip" msgstr "roundrobin praleisti" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "apvaliojo robino komutatoriaus filtras" #: src/conf.c msgid "netcam_url" msgstr "„netcam“ URL" #: src/conf.c msgid "netcam_params" msgstr "netcam parameters" #: src/conf.c msgid "netcam_high_url" msgstr "netcam hoge url" #: src/conf.c msgid "netcam_high_params" msgstr "netcam hoge parameters" #: src/conf.c msgid "netcam_userpass" msgstr "„netcam“ vartotojo pasas" #: src/conf.c msgid "mmalcam_name" msgstr "mmalcam vardas" #: src/conf.c msgid "mmalcam_params" msgstr "mmalcam params" #: src/conf.c msgid "width" msgstr "plotis" #: src/conf.c msgid "height" msgstr "Å«gio" #: src/conf.c msgid "framerate" msgstr "kadrų dažnis" #: src/conf.c msgid "minimum_frame_time" msgstr "minimalus kadro laikas" #: src/conf.c msgid "rotate" msgstr "pasukti" #: src/conf.c msgid "flip_axis" msgstr "apversta aÅ¡is" #: src/conf.c msgid "locate_motion_mode" msgstr "nustatyti judesio režimÄ…" #: src/conf.c msgid "locate_motion_style" msgstr "nustatyti judesio stilių" #: src/conf.c msgid "text_left" msgstr "tekstas liko" #: src/conf.c msgid "text_right" msgstr "tekstas teisingas" #: src/conf.c msgid "text_changes" msgstr "teksto pokyÄiai" #: src/conf.c msgid "text_scale" msgstr "teksto skalÄ—" #: src/conf.c msgid "text_event" msgstr "tekstinis įvykis" #: src/conf.c msgid "emulate_motion" msgstr "mÄ—gdžioja judesį" #: src/conf.c msgid "pause" msgstr "pauze" #: src/conf.c msgid "threshold" msgstr "slenkstis" #: src/conf.c msgid "threshold_maximum" msgstr "riba maksimali" #: src/conf.c msgid "threshold_tune" msgstr "slenksÄio melodija" #: src/conf.c msgid "noise_level" msgstr "triukÅ¡mo lygis" #: src/conf.c msgid "noise_tune" msgstr "triukÅ¡mo melodija" #: src/conf.c msgid "despeckle_filter" msgstr "despeckle filtras" #: src/conf.c msgid "area_detect" msgstr "ploto aptikimas" #: src/conf.c msgid "mask_file" msgstr "kaukÄ—s failas" #: src/conf.c msgid "mask_privacy" msgstr "kaukÄ—s privatumas" #: src/conf.c msgid "smart_mask_speed" msgstr "iÅ¡maniosios kaukÄ—s greitis" #: src/conf.c msgid "lightswitch_percent" msgstr "Å¡viesos jungiklio procentas" #: src/conf.c msgid "lightswitch_frames" msgstr "žibintų jungiklių rÄ—mai" #: src/conf.c msgid "minimum_motion_frames" msgstr "minimalÅ«s judesio kadrai" #: src/conf.c msgid "event_gap" msgstr "įvykių atotrÅ«kis" #: src/conf.c msgid "pre_capture" msgstr "iÅ¡ankstinis fiksavimas" #: src/conf.c msgid "post_capture" msgstr "po fiksavimo" #: src/conf.c msgid "on_event_start" msgstr "renginio pradžioje" #: src/conf.c msgid "on_event_end" msgstr "renginio pabaigoje" #: src/conf.c msgid "on_picture_save" msgstr "iÅ¡saugoti paveikslÄ—lyje" #: src/conf.c msgid "on_area_detected" msgstr "aptiktame plote" #: src/conf.c msgid "on_motion_detected" msgstr "aptiktas judesys" #: src/conf.c msgid "on_movie_start" msgstr "pradedant filmÄ…" #: src/conf.c msgid "on_movie_end" msgstr "filmo pabaigoje" #: src/conf.c msgid "on_camera_lost" msgstr "dingo kamera" #: src/conf.c msgid "on_camera_found" msgstr "rastas fotoaparatas" #: src/conf.c msgid "picture_output" msgstr "vaizdo iÅ¡vestis" #: src/conf.c msgid "picture_output_motion" msgstr "vaizdo iÅ¡vesties judesys" #: src/conf.c msgid "picture_type" msgstr "paveikslÄ—lio tipas" #: src/conf.c msgid "picture_quality" msgstr "vaizdo kokybÄ—" #: src/conf.c msgid "picture_exif" msgstr "paveikslÄ—lio exif" #: src/conf.c msgid "picture_filename" msgstr "paveikslÄ—lio failo vardas" #: src/conf.c msgid "snapshot_interval" msgstr "momentinio vaizdo intervalas" #: src/conf.c msgid "snapshot_filename" msgstr "momentinio vaizdo failo vardas" #: src/conf.c msgid "movie_output" msgstr "filmo iÅ¡vestis" #: src/conf.c msgid "movie_output_motion" msgstr "filmo iÅ¡vesties judesys" #: src/conf.c msgid "movie_max_time" msgstr "filmo maksimalus laikas" #: src/conf.c msgid "movie_bps" msgstr "filmo bps" #: src/conf.c msgid "movie_quality" msgstr "filmo kokybÄ—" #: src/conf.c msgid "movie_codec" msgstr "filmo kodekas" #: src/conf.c msgid "movie_duplicate_frames" msgstr "filmo kopijavimo kadrai" #: src/conf.c msgid "movie_passthrough" msgstr "filmo peržiÅ«ra" #: src/conf.c msgid "movie_filename" msgstr "filmo failo vardas" #: src/conf.c msgid "movie_extpipe_use" msgstr "filmo galiojimo laikas" #: src/conf.c msgid "movie_extpipe" msgstr "filmo galiojimas" #: src/conf.c msgid "timelapse_interval" msgstr "laiko tarpas" #: src/conf.c msgid "timelapse_mode" msgstr "„timelapse“ režimas" #: src/conf.c msgid "timelapse_fps" msgstr "timelapse fps" #: src/conf.c msgid "timelapse_codec" msgstr "„timelapse“ kodekas" #: src/conf.c msgid "timelapse_filename" msgstr "„timelapse“ failo vardas" #: src/conf.c msgid "video_pipe" msgstr "vaizdo vamzdis" #: src/conf.c msgid "video_pipe_motion" msgstr "vaizdo vamzdžio judesys" #: src/conf.c msgid "webcontrol_port" msgstr "interneto valdymo prievadas" #: src/conf.c msgid "webcontrol_ipv6" msgstr "„webcontrol ipv6“" #: src/conf.c msgid "webcontrol_localhost" msgstr "žiniatinklio valdymas" #: src/conf.c msgid "webcontrol_parms" msgstr "interneto valdymo parms" #: src/conf.c msgid "webcontrol_interface" msgstr "interneto valdymo sÄ…saja" #: src/conf.c msgid "webcontrol_auth_method" msgstr "interneto valdymo auth metodas" #: src/conf.c msgid "webcontrol_authentication" msgstr "interneto valdymo autentifikavimas" #: src/conf.c msgid "webcontrol_tls" msgstr "interneto valdymo tls" #: src/conf.c msgid "webcontrol_cert" msgstr "interneto valdymo sertifikatas" #: src/conf.c msgid "webcontrol_key" msgstr "interneto valdymo raktas" #: src/conf.c msgid "webcontrol_header_params" msgstr "webcontrol header parameters" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "žiniatinklio valdymo blokavimo minutÄ—s" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "žiniatinklio valdymo blokavimo bandymai" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "interneto valdymo užraktas max ips" #: src/conf.c msgid "stream_port" msgstr "srauto uostas" #: src/conf.c msgid "stream_localhost" msgstr "srautas localhost" #: src/conf.c msgid "stream_auth_method" msgstr "srauto autentifikacijos metodas" #: src/conf.c msgid "stream_authentication" msgstr "srauto autentifikavimas" #: src/conf.c msgid "stream_tls" msgstr "srautas tls" #: src/conf.c msgid "stream_header_params" msgstr "stream header parameters" #: src/conf.c msgid "stream_preview_scale" msgstr "srauto peržiÅ«ros skalÄ—" #: src/conf.c msgid "stream_preview_newline" msgstr "srauto peržiÅ«ra nauja eilutÄ—" #: src/conf.c msgid "stream_preview_method" msgstr "srauto peržiÅ«ros metodas" #: src/conf.c msgid "stream_quality" msgstr "srauto kokybÄ—" #: src/conf.c msgid "stream_grey" msgstr "srautas pilkas" #: src/conf.c msgid "stream_motion" msgstr "srauto judesys" #: src/conf.c msgid "stream_maxrate" msgstr "srautas maksimalus" #: src/conf.c msgid "stream_limit" msgstr "srauto riba" #: src/conf.c msgid "database_type" msgstr "duomenų bazÄ—s tipas" #: src/conf.c msgid "database_dbname" msgstr "duomenų bazÄ—s dbname" #: src/conf.c msgid "database_host" msgstr "duomenų bazÄ—s priegloba" #: src/conf.c msgid "database_port" msgstr "duomenų bazÄ—s prievadas" #: src/conf.c msgid "database_user" msgstr "duomenų bazÄ—s vartotojas" #: src/conf.c msgid "database_password" msgstr "duomenų bazÄ—s slaptažodis" #: src/conf.c msgid "database_busy_timeout" msgstr "duomenų bazÄ—s užimtas laikas" #: src/conf.c msgid "sql_log_picture" msgstr "sql žurnalo nuotrauka" #: src/conf.c msgid "sql_log_snapshot" msgstr "sql žurnalo momentinÄ— nuotrauka" #: src/conf.c msgid "sql_log_movie" msgstr "SQL žurnalo filmas" #: src/conf.c msgid "sql_log_timelapse" msgstr "sql log timelapse" #: src/conf.c msgid "sql_query_start" msgstr "SQL užklausos pradžia" #: src/conf.c msgid "sql_query_stop" msgstr "sql užklausos stotelÄ—" #: src/conf.c msgid "sql_query" msgstr "sql užklausa" #: src/conf.c msgid "track_type" msgstr "takelio tipas" #: src/conf.c msgid "track_auto" msgstr "bÄ—gių auto" #: src/conf.c msgid "track_port" msgstr "trasos uostas" #: src/conf.c msgid "track_motorx" msgstr "sekti motorx" #: src/conf.c msgid "track_motorx_reverse" msgstr "sekti motorx reversu" #: src/conf.c msgid "track_motory" msgstr "takelio motyvas" #: src/conf.c msgid "track_motory_reverse" msgstr "kelio motyvas atvirkÅ¡tinis" #: src/conf.c msgid "track_maxx" msgstr "takelis maxx" #: src/conf.c msgid "track_minx" msgstr "takelis minx" #: src/conf.c msgid "track_maxy" msgstr "takelis maks" #: src/conf.c msgid "track_miny" msgstr "sekti minia" #: src/conf.c msgid "track_homex" msgstr "sekti homex" #: src/conf.c msgid "track_homey" msgstr "sekti namie" #: src/conf.c msgid "track_iomojo_id" msgstr "takelis iomojo id" #: src/conf.c msgid "track_step_angle_x" msgstr "bÄ—gių žingsnio kampas x" #: src/conf.c msgid "track_step_angle_y" msgstr "bÄ—gių žingsnio kampas y" #: src/conf.c msgid "track_move_wait" msgstr "bÄ—gių kelio laukti" #: src/conf.c msgid "track_speed" msgstr "trasos greitis" #: src/conf.c msgid "track_stepsize" msgstr "sekti žingsnį" #: src/conf.c msgid "track_generic_move" msgstr "sekti bendrÄ…jį žingsnį" #: src/conf.c msgid "camera" msgstr "fotoaparatas" #: src/conf.c msgid "camera_dir" msgstr "kameros rež" #: src/dbse.c msgid "Closing MySQL library" msgstr "MySQL-bibliotheek sluiten" #: src/dbse.c msgid "Closing MariaDB library" msgstr "MariaDB-bibliotheek sluiten" #: src/dbse.c msgid "Database closed" msgstr "Database gesloten" #: src/dbse.c msgid "Initializing database" msgstr "Inicijuojama duomenų bazÄ—" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "" "Neįmanoma prisijungti prie „MySQL“ duomenų bazÄ—s %s pagrindiniame %s su " "vartotoju %s" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "„MySQL“ klaida buvo %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "" "Kan geen verbinding maken met MariaDB-database %s op host %s met gebruiker %s" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "MariaDB-fout was %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "Atidaroma duomenų bazÄ— %s" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "Nepavyko atidaryti SQLite3 duomenų bazÄ—s %s. Klaida %d: %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "Nustatomas užimtumo laikas į %d ms" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "Nepavyko nustatyti užimtumo skirtojo laiko. Klaida %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "Nepavyko prisijungti prie „PostgreSQL“ duomenų bazÄ—s „ %s“: %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "Duomenų bazÄ—s tipas %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "MySQL-query uitvoeren" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "MySQL-query mislukt %s foutcode %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "" "Neįmanoma iÅ¡ naujo prisijungti prie „MySQL“ duomenų bazÄ—s %s, esanÄioje %s, " "su vartotojo %s „MySQL“ klaidabuvo %s" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "Opnieuw verbinding maken met MySQL-database '%s' geslaagd" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "na opnieuw verbinden MySQL-query mislukt %s foutcode %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "MariaDB-query uitvoeren" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "MariaDB-query mislukt %s foutcode %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "Kan niet opnieuw verbinding maken met MariaDB-database %s op host %s met " "gebruiker %s MariaDBfout was %s" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "Opnieuw verbinding maken met MariaDB-database '%s' geslaagd" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "na opnieuw verbinden MariaDB-query mislukt %s foutcode %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "Opnieuw verbonden met PostgreSQL-database '%s'" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "PostgreSQL-query uitvoeren" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "Poging om opnieuw verbinding te maken met PostgreSQL-database '%s': %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "PGSQL užklausa nepavyko: [%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "Vykdomas %s" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "SQLite3 klaida %d : %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "Nepaisoma tuÅ¡Äios sql užklausos" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "Neįmanoma paleisti iÅ¡orinÄ—s komandos „ %s“" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "Vykdo iÅ¡orinÄ™ komandÄ… „ %s“" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "Vaizdas įraÅ¡omas į failÄ…: %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "Filmas įraÅ¡omas į failÄ…: %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "Vaizdas iÅ¡saugotas faile: %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "Filmas iÅ¡saugotas faile: %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "Nepavyko įkelti vaizdo į vaizdo vamzdį" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "Nepavyko sukurti simbolinÄ—s nuorodos [ %s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "Klaida kuriant peržiÅ«ros vamzdžio pavadinimÄ… %d %s" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "Klaida kuriant failo pavadinimo bazÄ™ %d %s" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "Klaida kuriant peržiÅ«ros vardÄ… %d %s" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "UŽDARYMAS: iÅ¡trinkite failo aprašą %d, klaidos bÅ«sena %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "grąžinimas: %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "Å altinis FPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "filmo kelias: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "nÄ—ra raÅ¡ymo prieigos prie tikslinio katalogo %s" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "kelias nerastas, bandant jį sukurti %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "klaida prisijungiant prie kelio %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "Klaida nurodant komandinÄ™ eilutÄ™: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "vamzdis: %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt-> filmavimas: %d" #: src/event.c msgid "popen failed" msgstr "popenas nepavyko" #: src/event.c msgid "Using extpipe" msgstr "Naudojant extpipe" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "Klaida raÅ¡ant vamzdyje, bÅ«senos klaida %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "vamzdis %s dar nÄ—ra sukurtas arba uždarytas" #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "„Ogg“ talpykla nebepalaikoma. Pakeitus į MPEG4" #: src/event.c msgid "Running test of the various output formats." msgstr "Ä®vairių iÅ¡vesties formatų bandymas." #: src/event.c msgid "Error opening context for movie output." msgstr "Klaida atidarant filmo iÅ¡vesties kontekstÄ…." #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffopen atidaryti klaida kuriant (judesio) failÄ… [ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "Laikinas „swf“ laikiklis nebepalaikomas. Naudojant mpg konteinerį." #: src/event.c msgid "Timelapse using mpg codec." msgstr "„Timelapse“ naudojant MPG kodekÄ…." #: src/event.c msgid "Events will be appended to file" msgstr "Ä®vykiai bus pridedami prie bylos" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "„Timelapse“ naudojant „mpeg4“ kodekÄ…." #: src/event.c msgid "Events will be trigger new files" msgstr "Ä®vykiai suaktyvins naujus failus" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffopen atidaryti klaidÄ… kuriant (timelapse) failÄ… [ %s]" #: src/event.c msgid "Error encoding image" msgstr "Klaida koduojant vaizdÄ…" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "Nepavyko skirti atminties kodeko pavadinimui" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "Nurodytas kadrų dažnis yra per didelis nurodytam „ffmpeg“ filmo tipui." "Pasirinkite kitÄ… „ffmpeg“ konteinerį arba mažesnį kadrų dažnį." #: src/ffmpeg.c msgid "Error setting base file name" msgstr "Klaida nustatant pagrindinio failo pavadinimÄ…" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "Klaida nustatant „timelapse“ priedÄ… kodekui %s" #: src/ffmpeg.c msgid "Error setting file name" msgstr "Klaida nustatant failo vardÄ…" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "kodeko parinkties vertÄ— %s nepalaikoma" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "Nepavyko gauti kodeko" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "SiunÄiant kodavimo klaidÄ… įvyko klaida: %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "Priimtas paketas iÅ¡metÄ— EAGAIN, pateikdamas -2 kodÄ…: %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "Klaida gaunant užkoduotÄ… paketinį vaizdo įrašą: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "Klaida koduojant vaizdo įrašą: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "Klaida koduojant vaizdo įrašą" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "" "PTS % bazinis PTS % ms intervalas % laiko bazÄ— %d- %d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "BLOGAS LAIKAS!! RÄ—melis praleistas." #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "" "PTS % bazinis PTS % ms intervalas % laiko bazÄ— %d- " "%d Pakeisti%d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s kodekas vbr / crf / bit rate: %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "Pageidaujamas kodekas %s įtrauktas į juodÄ…jį sÄ…rašą: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "Kodekas %s nerastas" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "Naudojant kodekÄ… %s" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "Nepavyko paskirstyti srauto" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "Nepavyko paskirstyti kodeko!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "Žemas fps. Koduojama %d kadrų į %d kadrų konteinerį." #: src/ffmpeg.c msgid "Unable to set quality" msgstr "Neįmanoma nustatyti kokybÄ—s" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "Pateikta FPS palaikoma %d / %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "Nepavyko atidaryti kodeko %s" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "Nepavyko nukopijuoti dekoderio parametrų !: %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "nepavyko paskirstyti rÄ—melio" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "nepavyko paskirstyti buferių %s" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "klaida atidarant failÄ… %s" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "Leidimas nesuteiktas. %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "Klaida atidarant failÄ… %s" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "Nepavyko paraÅ¡yti ffmpeg antraÅ¡tÄ—s %s" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "Klaida įeinant į kanalizacijos režimÄ…: %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "Klaida nusausinant kodekÄ…: %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "Klaida raÅ¡ant nusausintÄ… vaizdo kadrÄ…" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "Klaida koduojant paveikslÄ—lį" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "Klaida raÅ¡ant vaizdo kadrÄ…" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet: %s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "Klaida raÅ¡ant vaizdo kadrÄ…: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "RTSP kontekstas negalimas." #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "rtsp kamera nÄ—ra paruoÅ¡ta perÄ—jimui." #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "įjungtas praÄ—jimo režimas. Perjungimas į MP4 konteinerį." #: src/ffmpeg.c msgid "Could not get codec!" msgstr "Nepavyko gauti kodeko!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "Nepavyko nukopijuoti kodeko parametrų" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "Pravažiavimas neįgalus. ffmpeg per senas" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "PraÄ—jo srautas" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "" "„ffmpeg libavcodec“ versija %d. %d. %d „libavformat“ versija %d. %d. %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "vid. „lockmgr“ registracija nepavyko ( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "NÄ—ra „ffmpeg“ funkcijų" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "iÅ¡valyti nepavyko iÅ¡ naujo nustatyti „lockmgr“" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "Nepavyko paskirstyti iÅ¡vesties konteksto" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "Nepavyko nustatyti „passthru“!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "Nepavyko nustatyti srauto" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "Klaida praplaunant kodekÄ…" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "Per daug bandymų iÅ¡valyti buferinį paketÄ…" #: src/ffmpeg.c msgid "Buffered packet" msgstr "Buferinis paketas" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s: Duotas JPEG buferis buvo per mažas" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "Netinkami JPEG vaizdo matmenys" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "JPEG vaizdo dydis %dx %d, JPEG buvo %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "Gautas netikÄ—tas fotoaparato valdymo atÅ¡aukimo įvykis, 0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "Didelis kadrų dažnis gali sukelti vaizdų ekspozicijos problemų" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "Jei automatinÄ— ekspozicija neveikia, iÅ¡bandykite mažesnÄ™ kadrų dažnį." #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "Nepavyko sukurti MMAL fotoaparato komponento %s" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "MMAL kamera %s neturi iÅ¡vesties prievadų" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "Neįmanoma įjungti valdymo prievado: klaida %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "Nepavyko nustatyti MMAL padÄ—klo" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "Nepavyko nustatyti kameros vaizdo įraÅ¡o formato" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "fotoaparato komponento negalima įgalinti" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "Sukurtas MMAL fotoaparato komponentas" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "Nepavyko sukurti MMAL fotoaparato buferio" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "Nepavyko sukurti MMAL fotoaparato buferio eilÄ—s" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "Nepavyko gauti reikiamo buferio %d iÅ¡ baseino eilÄ—s" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "Neįmanoma nusiųsti buferio į uostÄ… ( %d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "MMAL kameros siÅ«las prasideda ... kamerai ( %s) %dx %d, %d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "fotoaparato parametrų nebuvo galima paskirstyti" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "Nepavyko įjungti MMAL fotoaparato jungties" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "Nepavyko užfiksuoti MMAL fotoaparato" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "MMAL fotoaparato valymas" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %d vÄ—liavos %08x dydis %d / %d at %08x, img size = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "Neįmanoma grąžinti buferio į fotoaparato vaizdo prievadÄ…" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "IÅ¡ankstinio surinkimo buferio dydžio keitimas iki %d elementų" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "PaÅ¡alintas proceso ID failas (pid failas)." #: src/motion.c msgid "Error removing pid file" msgstr "Klaida paÅ¡alinant pid failÄ…" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "Uždaryti logfile ( %s)." #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "Aptiktas judesys – prasideda įvykis %d." #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "Ä® filmÄ… pridÄ—ta %d užpildų kadrų" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "Neįmanoma nustatyti kameros tipo (MMAL, „Netcam“, V4L2, BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "Privatumo kaukÄ—s failo atidarymas" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "DidelÄ—s skyros privatumo kaukÄ—s failo atidarymas" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "Klaida atidarant kaukÄ—s failÄ… %s" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "Nepavyko nuskaityti kaukÄ—s privatumo vaizdo. KaukÄ—s privatumo funkcija " "iÅ¡jungta." #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "KaukÄ—s privatumo failas \" %s \" įkeltas." #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "Neteisinga teksto skalÄ—. Pritaikyta %d" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "PradÄ—ta kamera %d: judesio aptikimas %s" #: src/motion.c msgid "Disabled" msgstr "Neįgalus" #: src/motion.c msgid "Enabled" msgstr "Ä®jungtas" #: src/motion.c msgid "Pass-through processing disabled." msgstr "Leidimas apdoroti neleidžiamas." #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "Netinkami konfigÅ«racijos matmenys %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "Naudojant numatytuosius matmenis %dx %d" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "PraÅ¡omas vaizdo plotis ( %d) nÄ—ra 8 modulis." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "Reguliuojamas plotis iki kito didesnio kartotinio 8 ( %d)." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "Reikalaujamas vaizdo aukÅ¡tis ( %d) nÄ—ra 8 modulis." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "AukÅ¡Äio nustatymas kitam aukÅ¡tesniam kartotiniui iÅ¡ 8 ( %d)." #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "Nepavyko gauti pradinio vaizdo iÅ¡ fotoaparato" #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "Judesys tÄ™siamas naudojant konfigÅ«racijos failo (-ų) plotį ir aukÅ¡tį" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "Judesys palaiko tik „modulo 8“ plotį ir aukÅ¡tį" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "PraÅ¡omas vaizdo plotis ( %d) arba aukÅ¡tis ( %d) nÄ—ra modulo 8." #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Judesys palaiko tik tokį plotį ir aukÅ¡tį, kuris yra lygus arba lygus 64 %dx " "%d" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "Pasroviui nÄ—ra. Vaizdo dydžiai nÄ—ra modulo 16." #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "„webp“ vaizdo formatas negalimas, nesugrįžus į „JPEG“" #: src/motion.c msgid "Error capturing first image" msgstr "Klaida užfiksuojant pirmÄ…jį vaizdÄ…" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "Atidaromas vaizdo atkÅ«rimo įtaisas įprastoms nuotraukoms" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "" "Nepavyko atidaryti vaizdo įraÅ¡o atgalinio vaizdo, skirto įprastoms " "nuotraukoms" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "Atidaromas vaizdo filmų atgalinio ryÅ¡io įrenginys" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "Nepavyko atidaryti vaizdo filmų atgalinio vaizdo" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "Nepavyko nuskaityti kaukÄ—s vaizdo. KaukÄ—s funkcija iÅ¡jungta." #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "Ä®kelta maskuotÄ— \" %s \"." #: src/motion.c msgid "Emulating motion" msgstr "Emuliuojantis judesys" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "Aptikta judesio %d srityje." #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "Bandoma dar kartÄ…, kol nebus sÄ—kmingai užmegztas ryÅ¡ys su kamera" #: src/motion.c msgid "Camera has become available." msgstr "Fotoaparatas tapo prieinamas." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "IÅ¡ naujo paleidžiamas judÄ—jimas.\n" "Vaizdo plotis (%d) arba aukÅ¡tis (%d) nÄ—ra 8 modulio." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "IÅ¡ naujo paleidžiamas judÄ—jimas.\n" "JudÄ—jimas palaiko tik plotį ir aukÅ¡tį, didesnį arba lygų 64 %dx%d" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "IÅ¡ naujo paleidžiamas judÄ—jimas.\n" "PasikeitÄ— fotoaparato aukÅ¡tis arba plotis." #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "IÅ¡ naujo paleidžiamas judÄ—jimas.\n" "Kameroje pasikeitÄ— didelÄ— raiÅ¡ka." #: src/motion.c msgid "Video signal re-acquired" msgstr "Vaizdo signalas vÄ—l įgytas" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "Vaizdo įrenginio mirtina klaida - uždaromas vaizdo įtaisas" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "" "IÅ¡ naujo paleisdami „Motion“ siÅ«lÄ…, kad iÅ¡ naujo inicijuotumÄ—te visus vaizdo " "buferius" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "Prarastas vaizdo signalas - pridedamas pilkas vaizdas" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "Vis tiek prarastas vaizdo signalas - bandoma uždaryti vaizdo įrenginį" #: src/motion.c msgid "Lightswitch detected" msgstr "Aptiktas Å¡viesos jungiklis" #: src/motion.c msgid "Switchfilter detected" msgstr "Aptiktas jungiklio filtras" #: src/motion.c msgid "micro-lightswitch!" msgstr "mikrojungiklis!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "Renginio pabaiga %d" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "Neapdoroti pokyÄiai: %5d - pokyÄiai po „ %s“: %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr "- etiketÄ—s: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "Pakeitimai: %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr "- triukÅ¡mo lygis: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr "- riba: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "Netinkamas laiko atkÅ«rimo režimo argumentas ' %s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%: s Numatytasis rankinio laiko atkÅ«rimo režimas" #: src/motion.c msgid "Thread exiting" msgstr "Sriegis iÅ¡eina" #: src/motion.c msgid "Motion going to daemon mode" msgstr "JudÄ—jimas vyksta į demono režimÄ…" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "IÅ¡eiti iÅ¡ judesio, negalima sukurti proceso ID failo (pid failo) %s" #: src/motion.c msgid "Could not change directory" msgstr "Nepavyko pakeisti katalogo" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "Sukurtas proceso ID failas %s. Proceso ID yra %d" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "" "„Camara“ ID nÄ—ra unikalÅ«s arba jų vertÄ— didesnÄ— nei 32 000. Grįžta įgijų " "skaiÄiai" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2: yra" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2: nÄ—ra" #: src/motion.c msgid "bktr : available" msgstr "bktr: yra" #: src/motion.c msgid "bktr : not available" msgstr "bktr: nÄ—ra" #: src/motion.c msgid "webp : available" msgstr "„webp“: yra" #: src/motion.c msgid "webp : not available" msgstr "„webp“: nÄ—ra" #: src/motion.c msgid "mmal : available" msgstr "Mmal: yra" #: src/motion.c msgid "mmal : not available" msgstr "Mmal: nÄ—ra" #: src/motion.c msgid "ffmpeg : available" msgstr "„ffmpeg“: yra" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg: nÄ—ra" #: src/motion.c msgid "mysql : available" msgstr "mysql: yra" #: src/motion.c msgid "mysql : not available" msgstr "mysql: nÄ—ra" #: src/motion.c msgid "MariaDB: available" msgstr "„MariaDB“: yra" #: src/motion.c msgid "MariaDB: not available" msgstr "„MariaDB“: nÄ—ra" #: src/motion.c msgid "sqlite3: available" msgstr "„sqlite3“: yra" #: src/motion.c msgid "sqlite3: not available" msgstr "„sqlite3“: nÄ—ra" #: src/motion.c msgid "pgsql : available" msgstr "pgsql: yra" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql: nÄ—ra" #: src/motion.c msgid "nls : available" msgstr "nls: yra" #: src/motion.c msgid "nls : not available" msgstr "nls: nÄ—ra" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "Numatytojo žurnalo lygio naudojimas ( %s) ( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "Prisijungimas prie failo ( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "IÅ¡eiti iÅ¡ judesio, negalima sukurti žurnalo failo %s" #: src/motion.c msgid "Logging to syslog" msgstr "Prisijungimas prie syslog" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "PradÄ—tas judesys %s" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "Naudojant numatytÄ…jį žurnalo tipÄ… ( %s)" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "Naudojamas žurnalo tipas ( %s) žurnalo lygis ( %s)" #: src/motion.c msgid "Motion running as daemon process" msgstr "Judesys veikia kaip demono procesas" #: src/motion.c msgid "Motion running in setup mode." msgstr "Judesys veikia nustatymo režimu." #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "Kameros ID: %d yra iÅ¡ %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "Kameros ID: %d Fotoaparato pavadinimas: %s Paslauga: %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "Kameros ID: %d Fotoaparato pavadinimas: %s Ä®renginys: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "" "Srauto prievado numeris %d, kai srautas %d, prieÅ¡tarauja valdymo prievadui" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "%d gijos srauto funkcija yra iÅ¡jungta." #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "Srauto %d srauto prievado numeris %d nesuderinamas su gija %d" #: src/motion.c msgid "Restarting motion." msgstr "IÅ¡ naujo paleisti judesį." #: src/motion.c msgid "Motion restarted" msgstr "Judesys vÄ—l paleistas" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "Gija %d - sargybinio laikas. Bando padaryti grakÅ¡tų paleidimÄ…" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "" "SiÅ«las %d - sargybinio laikas nebebuvo paleistas iÅ¡ naujo, jį užmuÅ¡ant!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "Sriegis %d - valymo siÅ«las." #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "" "DEBUG-1 sriegiai, einantys %d judesio sriegiai, einantys %d, pabaiga %d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "Laukiu, kol baigsis siÅ«lai, pid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "Judesio gija %d paleidžiama iÅ¡ naujo" #: src/motion.c msgid "Threads finished" msgstr "Gijos baigtos" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "Judesys baigiasi" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "Neteisingas URL. Neįmanoma iÅ¡analizuoti reikÅ¡mių." #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "PradÄ—tas fotoaparato prižiÅ«rÄ—tojo siÅ«las [ %d]" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "„Netcam“ lizdo uždarymas, nes pasibaigia „Keep-Alive“ laikas (fotoaparatas " "siunÄiamas Uždaryti laukÄ…). AturÄ—tų įvykti iÅ¡ naujo." #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "iÅ¡ naujo atidaroma kamera (neperduodama srautui)" #: src/netcam.c msgid "camera re-connected" msgstr "kamera vÄ—l prijungta" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "Neatpažinta vaizdo antraÅ¡tÄ— ( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "Klaida antraÅ¡tÄ—je ( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "iÅ¡ naujo atidaroma kamera (transliacija)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "Klaida gaunant JPEG vaizdÄ…" #: src/netcam.c msgid "Trying to re-connect" msgstr "Bandoma vÄ—l prisijungti" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "„netcam“ fotoaparatų prižiÅ«rÄ—tojas: baigtas komplektas, iÅ¡einama" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "Jokio fotoaparato prižiÅ«rÄ—tojo atsakymo - jis jau turÄ—jo bÅ«ti mirÄ™s" #: src/netcam.c msgid "called with no data in buffer" msgstr "skambinama be duomenų buferyje" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "Tinklo kameros paleidimas kamerai ( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "Netinkamas „netcam“ tarpinis serveris ( %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "Naudotojo vardas / slaptažodis neleidžiamas įgaliotojo URL" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "Netinkama „Netcam“ paslauga „ %s“" #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "Netinkamas kameros „netcam“ URL ( %s)" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "„Netcam“ http parametras „ %s“ virsta vÄ—liavomis: HTTP / 1.0: %s HTTP / 1.1: " "%s Keep-Gyvas %s." #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "dabar skambina „netcam“ sÄ…rankos html ()" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "dabar skambina netcam setup ftp" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "dabar skambina „netcam“ sÄ…rankos failui ()" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "dabar skambina netcam setup mjpg ()" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "Ongeldige netcam-service '%s' - moet mjpeg, ftp, mjpg of jpeg zijn." #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "Nepavyko nuskaityti pirmo vaizdo - atnaujinimas: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "libjpeg dekompresijos gedimas pirmame kadre - atsisakykite!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "Plotis / aukÅ¡tis ( %dx %d) turi bÅ«ti kartotiniai iÅ¡ 8" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "Klaida paleidžiant fotoaparato prižiÅ«rÄ—tojo sriegį [ %d]" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "recv nepavyko ftp gauti daugiau" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "Serverio atsakymas: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "siųsti nepavyko ftp siųsti vartotojÄ…" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "siųsti nepavyko ftp siųsti slaptažodžius" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "siųsti nepavyko ftp mesti" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "gethostbyname nepavyko prisijungti" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "„gethostbyname“ adreso neatitikimas „ftp connect“" #: src/netcam_ftp.c msgid "socket failed" msgstr "lizdas nepavyko" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "Nepavyko sukurti ryÅ¡io" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "FTP serveris praÅ¡o ACCT anonimiÅ¡kai" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "nustatymo lizdo parinktis SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "siųsti nepavyko ftp gauti ryšį" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "Neteisingas atsakymas į PASV" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "Nepavyko sukurti duomenų ryÅ¡io" #: src/netcam_ftp.c msgid "bind failed" msgstr "suriÅ¡ti nepavyko" #: src/netcam_ftp.c msgid "listen failed" msgstr "klausytis nepavyko" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "siųsti nepavyko ftp gauti lizdÄ…" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "priimti ftp gauti lizdÄ…" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "recv nepavyko skaityti ftp" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "FTP gauti lizdÄ… nepavyko" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "Klaida siunÄiant I TYPE į FTP serverį" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "netinkamai suformuoto žetono turinio ilgis, bet vertÄ— %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "Turinio ilgis %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "Turinio tipas %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "" "Klaida skaitant vaizdo antraÅ¡tÄ™, srautinio perdavimo režimÄ… (1). NulinÄ— " "antraÅ¡tÄ—." #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "" "Klaida skaitant vaizdo antraÅ¡tÄ™, srautinio perdavimo režimÄ… (1). Nežinoma " "antraÅ¡tÄ— „ %s“" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "Klaida skaitant vaizdo antraÅ¡tÄ™ (2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "AntraÅ¡tÄ— ne JPEG" #: src/netcam_http.c msgid "Content-Length 0" msgstr "Turinio ilgis 0" #: src/netcam_http.c msgid "Found image header record" msgstr "Rastas vaizdo antraÅ¡tÄ—s įraÅ¡as" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "SiunÄiant prisijungimo užklausÄ… įvyko klaida" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "Gauta pirmoji antraÅ¡tÄ— (' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "Klaida skaitant pirmÄ… antraÅ¡tÄ™ ( %s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "HTTP rezultato kodas %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "PaÅ¡alinta „netcam“ „Keep-Alive“ vÄ—liava dÄ—l neva uždaryto HTTP ryÅ¡io." #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "Fotoaparatas, neturintis srauto („gyvas“ rinkinys)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "Neperduodanti kamera („gyvas“ nenustatyta)" #: src/netcam_http.c msgid "Streaming camera" msgstr "Srautinio vaizdo kamera" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "RibinÄ— eilutÄ— [ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "AntraÅ¡tÄ—je nerasta ribų eilutÄ—" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "" "Srautinio vaizdo kamera, turbÅ«t naudojanti MJPG blokus, apsvarstykite " "galimybÄ™ naudoti mjpg: //„netcam“ URL." #: src/netcam_http.c msgid "Unrecognized content type" msgstr "Neatpažintas turinio tipas" #: src/netcam_http.c msgid "Content-length present" msgstr "Turinio ilgio" #: src/netcam_http.c msgid "Content-length 0" msgstr "Turinio ilgis 0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "Rasta Conn: uždaryti antraÅ¡tÄ™ (' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "" "Gauta tiek „Connection: Keep-Alive“, tiek „Connection: close“ antraÅ¡tÄ—." "Judesys paÅ¡alina iÅ¡laikymÄ…." #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "" "Gauta tiek „Connection: Keep-Alive“, tiek „Connection: close“ antraÅ¡tÄ—." "Judesys nesikeiÄia." #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "Å iame antraÅ¡Äių rinkinyje gautas „Keep-Alive“ laukas." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "Negauta antraÅ¡tÄ— „RyÅ¡ys: iÅ¡likkite gyvas“ ir „RyÅ¡ys: uždarykite“. \n" " Judesys paÅ¡alina iÅ¡laikymÄ…." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "Negauta antraÅ¡tÄ— „RyÅ¡ys: iÅ¡likkite gyvas“ ir „RyÅ¡ys: uždarykite“. \n" " Judesys nesikeiÄia." #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "PaÅ¡alinta „netcam“ „Keep-Alive“ vÄ—liava, nes gauta antraÅ¡tÄ— „Connection: " "close“. \n" " „Netcam“ nepalaiko „Keep-Alive“. Judesys tÄ™siasi nelaikant gyvu." #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "„Keep-Alive“ pasibaigÄ— galiojanÄio laikotarpio pabaigai. \n" " „Motion“ uždarys „netcam“, tada atnaujins „Keep-Alive“ naudodamas naujÄ… " "lizdÄ…." #: src/netcam_http.c msgid "disconnect" msgstr "atjungti" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo () nepavyko ( %s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "„netcam“ atjungimas (1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "atjungti „netcam“, nes nenustatyta." #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "nepavykus iÅ¡laikyti bandymo, nepavyko sukurti lizdo." #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "be nuolatinio, naujas lizdas sukurtas fd %d" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "su „keepalive“ komplektu, netinkamu lizdu. Tai gali bÅ«ti pirmÄ… kartÄ…. " "Sukurtinaujas nepavyko." #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "" "su „keepalive“ rinkiniu, netinkamu lizdu. Tai gali bÅ«ti pirmÄ… kartÄ…, sukurta " "naujavienas su fd %d" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "Taigi KEEPALIVE yra %s" #: src/netcam_http.c msgid "ON" msgstr "Ä®JUNGTA" #: src/netcam_http.c msgid "OFF" msgstr "IÅ JUNGTA" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "SO KEEPALIVE nustatytas ant lizdo." #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "fcntl (1) ant lizdo" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "fcntl (2) ant lizdo" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "prisijungti () nepavyko ( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "„netcam“ atjungimas (4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "prisijungimo laikas ()" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "„netcam“ atjungimas (2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "pasireiÅ¡kia prisijungus" #: src/netcam_http.c msgid "connect returned error" msgstr "prisijungti grąžinta klaida" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "tinklo kameros atjungimas (3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "iÅ¡pleÄiamas buferis nuo [ %d / %d] iki [ %d / %d] baitų." #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "" "Potenciali padalijimo riba - %d simboliai praplatÄ—jÄ™, %d perkelti į kitÄ… " "vietÄ…" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "recv () nepavyksta po ribinÄ—s eilutÄ—s" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "paliekant „netcam“ ryšį." #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "ruoÅ¡iasi prisijungti, laikas # %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "Nepavyko atidaryti fotoaparato - patikrinkite savo konfigÅ«racijÄ… ir ar " "„netcamera“ yra prisijungusi" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "Klaida skaitant pirmÄ… antraÅ¡tÄ™ - bandoma iÅ¡ naujo" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "" "Nepavyko nuskaityti pirmosios fotoaparato antraÅ¡tÄ—s - kol kas jos atsisakiau" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "„Netcam“ turi vÄ—liavas: HTTP / 1.0: %s HTTP / 1.1: %s „Keep-Alive %s“." #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "" "PaÅ¡alinta „netcam“ iÅ¡saugojimo vÄ—liava dÄ—l įgaliotojo serverio rinkinio. " "„Proxy“ nesuderinamas suIÅ¡laikyti gyvÄ…." #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "" "Nepavyko nuskaityti pirmosios srauto antraÅ¡tÄ—s - kol kas jos atsisakiau" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "prijungtas, toliau skaityti vaizdÄ…." #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "Skaitymo klaida, bandant prisijungti iÅ¡ naujo .." #: src/netcam_http.c msgid "lost the cam." msgstr "pametÄ— kumÅ¡telį." #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "IÅ¡ naujo užpildytas buferis su [ %d] baitais iÅ¡ tinklo." #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "Perskaitykite [ %d / %d] antraÅ¡tÄ—s baitus." #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "Gauta netinkama antraÅ¡tÄ—, vÄ—l prisijungiama" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "Perskaitykite [ %d / %d] riekio baitus, iÅ¡ viso [ %d / %d]" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "Rinkinys užpildytas, buferis panaudotas [ %d] baitų." #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "Vaizdas baigtas, naudojamas buferis [ %d] baitų." #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "prijungtas, skaitydamas ir iššifruodamas MJPG gabaliukus." #: src/netcam_http.c msgid "Begin" msgstr "PradÄ—k" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "stat ( %s) klaida" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]! = paskutinysis mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "laukiama naujo failo vaizdo pabaigos" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "atidÄ—tas laukimas naujo failo vaizdo" #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "apdorojamas naujas failo vaizdas - st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "atidaryta ( %s) klaida: %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "skaitymo ( %s) klaida: %d" #: src/netcam_http.c msgid "End" msgstr "Pabaiga" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> failas-> kelias %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "Nepakanka duomenų iÅ¡ „netcam“." #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> JPEG klaida %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "*** sÄ—kmingas naujų nuotraukų atidÄ—jimas ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "JPEG klaida %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "apdorojamas JPEG vaizdas - turinio ilgis %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "Fotoaparato ploÄio / aukÅ¡Äio neatitikimas JPEG vaizdui - laukiama %dx %d, " "JPEG %dx %dretvalis %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d reval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s: pakeistas paketo masyvas į %d" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s: av kopijavimo paketas: %s, pertraukimas: %s" #: src/netcam_rtsp.c msgid "True" msgstr "Tiesa" #: src/netcam_rtsp.c msgid "False" msgstr "Melagingas" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: Pakket met ongeldige gegevens negeren" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: Fout opnameframe: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "Nepaisoma paketo su netinkamais duomenimis" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "Klaida dekoduojant paketÄ…: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "" "%s: Fout bij het overzetten van gedecodeerde HW naar het systeemgeheugen" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "Klaida siunÄiant paketÄ… į kodekÄ…: %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "Klaida dekoduojant vaizdo įraÅ¡o paketÄ…: kopijavimas į buferį" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: HW-apparaten:" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s (beschikbaar)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s (niet geïmplementeerd)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s: netcam-decoder %s uitgeschakeld." #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "Kan vaapi pix-indeling niet ophalen" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "Cuda pix-indeling kan niet worden opgehaald" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s: onderbroken." #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: Mislukt" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s: Decoder %s werkte niet." #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "" "%s: Negeren en verwijderen van de door de gebruiker gevraagde decoder %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s: vaapi-decoder initialiseren" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: kan vaapi hw-apparaat niet vinden" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s: Cuda-decoder initialiseren" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: kan cuda hw-apparaat niet vinden" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s: Decoder initialiseren" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s: Naudojant dekoderį %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: decoder geopend" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s: fotoaparato rodmens ( %s) laikas baigÄ—si" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s: fotoaparato ( %s) laikas baigÄ—si" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "Neįmanoma paskirstyti rÄ—melio." #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "Neįmanoma paskirstyti rÄ—melio." #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "Neįmanoma paskirstyti mastelio keitimo konteksto." #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "Klaida nustatant rÄ—melio dydį" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "Klaida paskirstant paveikslÄ—lį: %s" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "Klaida paskirstant paveikslÄ—lį: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "Klaida keiÄiant dydį / formatuojant: %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "Klaida įdedant kadrÄ… į iÅ¡vesties buferį: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s: onderbroken" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: gem leesframe: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: Per daug bandoma gauti duomenis iÅ¡ fotoaparato %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "" "%s: opnamesnelheid niet gespecificeerd in netcam-parameters. %d . gebruiken" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s: opnamesnelheid niet gespecificeerd in netcam-parameters. Framerate %d . " "gebruiken" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "Tinklo kamera siunÄia nuotraukas kita forma" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "dydžio, nei nurodyta konfigÅ«racijoje, taip pat a" #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "skirtingas vaizdo formatas. Vaizdas yra" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "perkoduojamas į YUV420P ir į norimÄ… dydį" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "konfigÅ«racijos faile. Jei įmanoma, pakeiskite „netcam“ į" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "bÅ«ti YUV420P formatu ir tokio dydžio, kokio praÅ¡oma" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "konfigÅ«racija, kad galbÅ«t sumažėtų procesoriaus naudojimas." #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "dydžio, nei nurodyta konfigÅ«racijos faile." #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "Nuotrauka perkoduojama į dydį" #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "praÅ¡oma konfigÅ«racijoje. Jei įmanoma, pakeiskite" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "„netcam“ arba konfigÅ«racija nurodyti tÄ… patį dydį" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "galbÅ«t sumažins procesoriaus naudojimÄ…." #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "„Netcam“: %dx %d => KonfigÅ«racija: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "Atsiųstas vaizdas yra" #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "koduotas į YUV420P. Jei įmanoma, pakeiskite „netcam“" #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "" "vaizdo formatas į YUV420P, kad bÅ«tų galima naudoti mažiau procesoriaus." #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: rtsp/rtmp . instellen" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: Invoerformaat mjpeg instellen" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: Invoerformaat video4linux2 instellen" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: filmbestand instellen" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s: %s instellen" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: optie: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "v4l2 instellen via netcam" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "Bestand instellen via netcam" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "%s instellen via netcam" #: src/netcam_rtsp.c msgid "highres" msgstr "hoge resolutie" #: src/netcam_rtsp.c msgid "norm" msgstr "norma" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "%s srauto nustatymas." #: src/netcam_rtsp.c msgid "Unknown" msgstr "Nežinoma" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "Srautas nukopijuotas perduoti" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "Nulis kelias praÄ—jo norint prisijungti" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s: Neįmanoma atidaryti kameros ( %s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s: atidaryta kamera ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s: Neįmanoma rasti srauto informacijos: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s: Neįmanoma atidaryti kodeko konteksto: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s: fotoaparato vaizdo dydis netinkamas" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s: Neįmanoma paskirti rÄ—melio." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s: Nepavyko nukopijuoti srauto, kad bÅ«tų galima pereiti." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s: Nepavyko nuskaityti pirmo vaizdo" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s: prijungta kamera ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s: Netcam-opnamesnelheid is %d." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s: Camerabron is %d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s: kan de camerabron-FPS niet bepalen." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s: opnamesnelheid is lager dan camera-FPS." #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s: er zullen decoderingsfouten optreden." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "" "%s: opnamesnelheid die iets groter is dan de FPS van de camera wordt " "aanbevolen." #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s: Prisijungimas prie fotoaparato ..." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s: Fotoaparatas neprisijungÄ—." #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s: tikrinama, ar fotoaparatas kas 10 sekundžių." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s: prasidÄ—jo fotoaparato prižiÅ«rÄ—tojo siÅ«lai [ %d]" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s: prižiÅ«rÄ—tojo kilpa baigta." #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s: Klaida pradedant tvarkyklÄ—s gijÄ…" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s: laukiama pirmo atvaizdo iÅ¡ prižiÅ«rÄ—tojo." #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "nepavyksta sukurti rtsp konteksto" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "nepavyksta sukurti aukÅ¡to rtsp konteksto" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "Geen FFmpeg-ondersteuning" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s: tinklo kameros iÅ¡jungimas." #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s: atsakymo iÅ¡ prižiÅ«rÄ—tojo sriegio nÄ—ra." #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "Normali skiriamoji geba: iÅ¡sijungia." #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "AukÅ¡ta skiriamoji geba: iÅ¡sijungia." #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "Neįmanoma nustatyti EXIF ​​kaip „webp chunk“" #: src/picture.c msgid "libwebp version error" msgstr "„libwebp“ versijos klaida" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "„libwebp“ vaizdo buferio paskirstymo klaida" #: src/picture.c msgid "libwebp image compression error" msgstr "„libwebp“ vaizdo suglaudinimo klaida" #: src/picture.c msgid "unable to assemble webp image" msgstr "nepavyko surinkti webp vaizdo" #: src/picture.c msgid "unable to save webp image to file" msgstr "nepavyko iÅ¡saugoti žiniatinklio failo failo" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "Neįmanoma paraÅ¡yti paveikslÄ—lio į failÄ… %s - patikrinkite prieigos teises į " "tikslinį katalogÄ… \n" "SiÅ«las baigsis dÄ—l Å¡ios lemtingos klaidos" #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "Neįmanoma paraÅ¡yti paveikslÄ—lio į failÄ… %s" #: src/picture.c msgid "Error getting PGM vars." msgstr "Klaida gaunant PGM vars." #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "Tai nÄ—ra pgm failas, prasideda raide ' %s'" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "Stebuklingas %s: plotis %s(%d): aukÅ¡tis %s(%d): maksimalus val.: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "Nepavyko nuskaityti vaizdo duomenų iÅ¡ pgm failo" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "Nurodytas kaukÄ—s failas nÄ—ra tokio dydžio kaip vaizdas iÅ¡ fotoaparato." #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "Bandoma pakeisti kaukÄ—s vaizdÄ… nuo %dx %d iki %dx %d" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "" "negali raÅ¡yti kaukÄ—s failo %s - patikrinkite prieigos teises į tikslinį " "katalogÄ…" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "negaliu paraÅ¡yti kaukÄ—s failo %s" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "Nepavyko paraÅ¡yti numatytosios kaukÄ—s kaip pgm failo" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "Kuriama tuÅ¡Äia kaukÄ— %s \n" "Redaguokite šį failÄ… ir vÄ—l paleiskite judesį, kad įjungtumÄ—te kaukÄ—s " "funkcijÄ…" #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "KonfigÅ«ruoti parinktį \"pasukti \", o ne iÅ¡ 90 kartotinių: %d" #: src/track.c msgid "internal error" msgstr "vidinÄ— klaida" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "vidinÄ— klaida, %hu nÄ—ra žinomas takelio tipas" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "uostas %s dev fd %i, variklis %hu komanda %hu duomenys %hu" #: src/track.c msgid "Status byte timeout!" msgstr "BÅ«senos baito laikas!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "Pabandykite atidaryti %s nuoseklųjį įrenginį" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "Neįmanoma atidaryti serijinio įrenginio %s" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "Neįmanoma inicijuoti serijinio įrenginio %s" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "Atidaromas serijinis įrenginys %s ir inicijuojamas, fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "Dar neįjungtas įrenginys %s, bandoma „stepper centre“ ()" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "nepavyko inicijuoti laiptelių įrenginio %s, fd [ %i]." #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "pavyko, įrenginys paleistas %s, fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "Siųskite prievadÄ… %s dev fd %i, variklis %hu komanda %hu duomenys %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "Komandos grąžinimas %d" #: src/track.c msgid "Problem opening servo!" msgstr "Problema atidarant servÄ…!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d, cent-> y %d, reversex %d, reversey %d manual %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d reikÅ¡mÄ— už diapazono ribų! ( %d - %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d reikÅ¡mÄ— už diapazono ribų! ( %d - %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "X poslinkis %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "X cent-> x %d, cent-> y %d, reversex %d, reversey %d motorx %d data %d " "command%d" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Y poslinkis %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Y cent-> x %d, cent-> y %d, reversex %d, reversey %d motyvas %d data %d " "komanda%d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "%d, X poslinkis, %d, x padÄ—tis %d. y padÄ—tis %d, atvirkÅ¡tinÄ— %d, atvirkÅ¡tinÄ—" "%d, laipsniÅ¡kumas %d" #: src/track.c msgid "Return byte timeout!" msgstr "Grąžinti baito laikÄ…!" #: src/track.c msgid "Unable to set camera speed" msgstr "Neįmanoma nustatyti kameros greiÄio" #: src/track.c msgid "succeed" msgstr "pavyks" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "Nepavyko atkurti „pwc“ kameros į pradinÄ™ padÄ—tį! Priežastis" #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "nepavyko VIDIOCPWCMPTGRANGE" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "„ioctl“ VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "Nepavyko pan. / Pakreipti „pwc“ kameros! Priežastis" #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "Nepavyko atkurti UVC fotoaparato į pradinÄ™ padÄ—tį! Priežastis" #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "UVC kameros atkÅ«rimas į pradinÄ™ padÄ—tį" #: src/track.c msgid "ioctl querycontrol" msgstr "„ioctl“ užklausos valdymas" #: src/track.c msgid "Getting camera range" msgstr "Gaunamas fotoaparatų diapazonas" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "" "Ä®vesties PARAMAS ABS visos minutÄ—s %d, visos maksimalios %d, pokrypio min " "%d, pokrypio maksimalus %d" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "INPUT PARAM ABS X Angelas %d, Y Angelas %d" #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "Jei „SET ABS“ juda X %d, judÄ—kite Y %d" #: src/track.c msgid "Failed to move UVC camera!" msgstr "Nepavyko perkelti UVC fotoaparato!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "Rasta MINMAX = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "PrieÅ¡ ABS Y Angel: x = %d, Y = %d," #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "Po ABS Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "" "„SET REL“ keptuvei min %d, pan. Max %d, pakreipimui min %d, pakreipimui " "maksimaliai %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "„ %d REL“ bÄ—gių pakeliui „Angel REL“, vėžės pakreipimo angelui %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "Jei norite nustatyti SET REL, perkelkite X %d, perkelkite Y %d" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, kontrolÄ— S = %d, Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, kontrolÄ— S = %d, Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "PrieÅ¡ REL Y angelas: x = %d, Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "Po REL Y Angelas: x = %d, Y = %d" #: src/translate.c msgid "Language: English" msgstr "Kalba: Lietuvių" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "Nepavyko paskirstyti %llu atminties baitų!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "Ä®spÄ—jimas! Funkcija %s bando pakeisti atminties blokÄ… %p iki 0 baitų!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "Nepavyko pakeisti atminties bloko dydžio, jei kompensuota %p iki %llu baitų " "(funkcija %s)!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "Problema kuriant katalogÄ… %s" #: src/util.c #, c-format msgid "creating directory %s" msgstr "kuriant katalogÄ… %s" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "Klaida atidarant failÄ… %s, naudojant %s režimÄ…" #: src/util.c msgid "Error closing file" msgstr "Klaida uždarant failÄ…" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbeventid} nepalaikomas. Naudokite eventid." #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "netinkamo formato raktinis žodis %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "Neįmanoma nustatyti gijos pavadinimo %s" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "FFMPEG versija per sena. IÅ¡jungti leidimų apdorojimÄ…." #: src/util.c msgid "pass-through enabled." msgstr "doorgang ingeschakeld." #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "Fout bij instellen parm >%s<" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "Geparseerd: >%s< >%s<" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "Geparseerd: >geredigeerd< >geredigeerd<" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "Fout bij parseren van parm nm-besturingselementen: %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "Fout bij het parseren van pars vl-besturingselementen: %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "Fout bij het instellen van de temperatuur: %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "Fout bij het repareren van besturingselementen: %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "Analizuojama: %s" #: src/util.c msgid "Parsing: " msgstr "Analizuojama: " #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "Fout bij het parseren van besturingselementen: %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "Fout: %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "Nieuwe netcam-parameters: %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "Nieuwe netcam hoge parameters: %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "Nieuwe videoparameters: %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "Nauji žiniatinklio valdymo antraÅ¡tÄ—s parametrai: %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "Nauji žiniatinklio valdymo antraÅ¡tÄ—s parametrai: " #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "Nieuwe stream header-parameters: %s" #: src/util.c msgid "New stream_header_params: " msgstr "Nieuwe stream header-parameters: " #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "Programmeerfout. Onbekend configuratie-item: %s " #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE Klaida nustatant atspalvį [ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "iki [ %d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE Klaida gaunant atspalvį" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT Klaida nustatant sodrumÄ… [ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT Klaida gaunant sodrumÄ…" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT Klaida nustatant kontrastÄ… [ %d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT Klaida gaunant kontrastÄ…" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "METEORSBRIG ryÅ¡kumas [ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIG įgauna ryÅ¡kumÄ…" #: src/video_bktr.c msgid "Not implemented" msgstr "Neįgyvendino" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "Ä®renginio įvestis %d už diapazono ribų (0–4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "„METEORSINPUT %d“ negalioja - bandoma sudÄ—tinÄ— „ %d“" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "" "BT848SFMT, Nepavyko nustatyti įvesties formato, bandykite dar kartÄ… pagal " "numatytuosius nustatymus" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "BT848SFMT, taip pat nebuvo galima nustatyti įvesties formato" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "Nepavyko nustatyti geometrijos" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "iki [ %d / %d] Norma %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "Niet geldig Frequentie [%ld] voor Broninvoer [%i]" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "Frequentie [%ld] Broninvoer [%i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "nustatyti įvestį [ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "nustatyti įvesties formatÄ… [ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "nustatyta geometrija [ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "Nustatytas dažnis (dar neįdiegtas" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "Dydis buferio iki 3x" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "Dydis buferio iki 3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap nepavyko" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "METEORCAPTUR naudojant vienÄ… metodÄ… Klaida užfiksuota" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "Klaida fiksuojant naudojant vienÄ… metodÄ…" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "Neįmanoma rasti vaizdo įrenginio" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "Vaizdo įrenginio „ %s“ uždarymas" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "" "Vis dar %d vaizdo įrašų įrenginio %s vartotojai, todÄ—l jo neuždarome dabar" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "konfig. vaizdo plotis ( %d) nÄ—ra 8 modulis" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "konfigÅ«racijos vaizdo aukÅ¡tis ( %d) nÄ—ra 8 modulis" #: src/video_bktr.c msgid "Stopping capture" msgstr "Sustabdyti gaudymÄ…" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "" "Pakartotinis [ %s] įvesties panaudojimas [ %d, %d] Pakeiskite fiksavimo " "metodÄ… METEOR CAP SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "„VIDEO PALETTE YUV420P“ nustatymas imgs.size normal ir imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "atidaryti vaizdo įrenginį %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "atidaryti tuner įrenginį %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "Sugadintas vaizdas ... tÄ™sti" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "SOI padÄ—tis pakoreguota %d baitais." #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "iÅ¡kvieÄiant „mmalcam“ valymÄ…" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "iÅ¡kvieÄiant „netcam“ valymÄ…" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "iÅ¡kvieÄiant „netcam rtsp“ valymÄ…" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "„V4L2“ įrenginio valymas" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "BKTR prietaiso valymas" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "NÄ—ra fotoaparato įrenginio valymo (MMAL, „Netcam“, V4L2, BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "Atidaroma MMAL kamera" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "MMAL kameros nepavyko atidaryti" #: src/video_common.c msgid "Opening Netcam" msgstr "„Netcam“ atidarymas" #: src/video_common.c msgid "Netcam failed to open" msgstr "„Netcam“ nepavyko atidaryti" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Atidaroma „Netcam RTSP“" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Nepavyko atidaryti „Netcam RTSP“" #: src/video_common.c msgid "Opening V4L2 device" msgstr "Atidaromas V4L2 įrenginys" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "Nepavyko atidaryti V4L2 įrenginio" #: src/video_common.c msgid "Opening BKTR device" msgstr "Atidaromas BKTR įrenginys" #: src/video_common.c msgid "BKTR device failed to open" msgstr "Nepavyko atidaryti BKTR įrenginio" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "Nenurodytas kameros įrenginys (MMAL, „Netcam“, V4L2, BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "Nepavyko atidaryti „ %s“" #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "Klaida nurodant buferį: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "Pradinis buferis: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "Skaitymo buferis: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "rastas vaizdo įrenginys ' %s' %d" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "Atidaryta %s kaip vamzdžio išėjimas" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "%s atidaryti, nes nepavyko iÅ¡vesti vamzdžio" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "Originalios vamzdžių specifikacijos" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "SiÅ«lomos vamzdžių specifikacijos" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "GalutinÄ—s vamzdžių specifikacijos" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "Nerasta įrenginio valdiklių" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "--------- Valdikliai ---------" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr "V4L2 ID pavadinimas ir diapazonas" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "Klaida iÅ¡ naujo nustatant vartotojo vertÄ™" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "Valdymas %s \"%s\" paliekamas kaip %d" #: src/video_v4l2.c msgid "Device not ready" msgstr "Ä®renginys nÄ—ra paruoÅ¡tas" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "Nustatykite valdymo elementÄ… „ %s“ reikÅ¡mei %d" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "nepavyko nustatyti valdiklio %s \"%s\" į %d." #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "" "%s controle optie waarde %s is onder het minimum. Minimaal %d . gebruiken " #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "%s controle optie waarde %s is boven maximum. Maximaal %d . gebruiken " #: src/video_v4l2.c msgid "control type not supported yet" msgstr "valdymo tipas dar nepalaikomas" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "Nepavyko užklausti įvesties %d. VIDIOC ENUMINPUT, jei naudojate WEBCAM " "keitimo įvestįvertÄ— santykinai -1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "Vardas = \" %s \", tipas 0x %08X, bÅ«sena %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "Vardas = \" %s \", - TUNER" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "Vardas = \" %s \" - KAMERA" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "Klaida pasirinkus įvestį %d VIDIOC S INPUT" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "Ä®renginys nepalaiko PAL / NTSC normų nurodymo" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "- vaizdo įraÅ¡o standartas %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "Klaida pasirenkant standartinį metodÄ… %d VIDIOC S STD" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "Vaizdo įraÅ¡o standartas nustatytas kaip NTSC" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "Vaizdo įraÅ¡o standartas nustatytas kaip SECAM" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "Vaizdo įraÅ¡o standartas nustatytas į PAL" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "imtuvas %d VIDIOC G TUNER" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "Nustatykite %d imtuvÄ…" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "Freq %ul VIDIOK SEKMO DAŽNIS" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "Nustatykite dažnį %ul" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "Nepavyko naudoti %c%c%c%c (%dx%d)" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "Testavimo paletÄ— %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "Tikrinamas vaizdo dydis %dx%d su žingsniu %d" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "IÅ¡ įrenginio nepateikta žingsnio vertÄ—." #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "Plotis (%d) turi bÅ«ti mažesnis už žingsnį (%d)" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "Vaizdo plotis (%d) nÄ—ra žingsnio (%d) kartotinis" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "Neįmanoma sÄ…lyga: plotis (%d), žingsnis (%d), žingsnis (%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "Vaizdo plotis bus padidintas %d baitų" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "Sureguliuokite skiriamÄ…jÄ… gebÄ… nuo %ix %i iki %ix %i." #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "Pakoreguota skiriamoji geba ne 8 modulis." #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "KonfigÅ«racijos faile nurodykite skirtingÄ… paletÄ™ arba plotį / aukÅ¡tį." #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "Klaida nustatant pikselių formatÄ…." #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "Naudojant paletÄ™ %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "Reguliuojama pagal plotį ( %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "Sureguliavimas pagal aukÅ¡tį ( %d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "konfigÅ«racijos paletÄ—s rodyklÄ— %d ( %s) neveikia. %dx %d " #: src/video_v4l2.c msgid "Supported palettes:" msgstr "Palaikomos paletÄ—s:" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d - %s (suglaudinta: %d) ( %# x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "Pasirinkta paletÄ— %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "Nepavyko parinkti %s formato paletÄ—s" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "Neįmanoma rasti suderinamo paletÄ—s formato." #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "Klaida, kai praÅ¡oma atminties žemÄ—lapio %d buferių. VIDIOKŲ REQBUFAI" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "mmap informacija: kadrai = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "Nepakanka buferinÄ—s atminties %d %s< >%s< >%s<" msgstr "PraÅ¡ytas neteisingas veiksmas:> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "Gimtoji kalba: įjungta" #: src/webu.c msgid "Native Language : off" msgstr "Gimtoji kalba: ne" #: src/webu.c msgid "Set the value to null/zero" msgstr "Nustatykite reikÅ¡mÄ™ null / zero" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "Ignoruojamas ryÅ¡ys iÅ¡: %s" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "Nepavyko patvirtinti iÅ¡ %s" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "NÄ—ra žiniatinklio valdiklio: leidimas pateiktas" #: src/webu.c msgid "No stream user:pass provided" msgstr "NÄ—ra srauto vartotojo: pateiktas leidimas" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "Netinkamas atsakymas" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "Fout bij het toevoegen van webcontrol-header %s %s" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "Fout bij het toevoegen van streamheader %s %s" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "PraÅ¡ytas netinkamas metodas: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "RyÅ¡ys iÅ¡: %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "siųsti puslapį nepavyko %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "Stream foto is nog niet klaar" #: src/webu.c msgid "Stream process requested to finish." msgstr "Streamproces verzocht om te voltooien." #: src/webu.c msgid "Send page failed." msgstr "Pagina verzenden mislukt." #: src/webu.c msgid "Basic authentication: available" msgstr "Pagrindinis autentifikavimas: galimas" #: src/webu.c msgid "Basic authentication: disabled" msgstr "Pagrindinis autentifikavimas: iÅ¡jungtas" #: src/webu.c msgid "Digest authentication: available" msgstr "Digest autentifikacija: galima" #: src/webu.c msgid "Digest authentication: disabled" msgstr "Digest autentifikacija: iÅ¡jungta" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd libary per senas „ipv6“ iÅ¡jungtas" #: src/webu.c msgid "IPV6: available" msgstr "IPV6: galimas" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6: neleidžiama" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd libary per senas SSL / TLS iÅ¡jungtas" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS: yra" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS: neleidžiama" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "Klaida skaitant SSL / TLS palaikymo failÄ…." #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "PraÅ¡oma SSL / TLS, bet nepateiktas sertifikatų failas. SSL / TLS iÅ¡jungtas" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "PraÅ¡oma SSL / TLS, bet nepateiktas rakto failas. SSL / TLS iÅ¡jungtas" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "Paleidus interneto valdymÄ… prie %d prievado" #: src/webu.c msgid "Unable to start MHD" msgstr "Nepavyko paleisti MHD" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "PradÄ—tas interneto valdymas prievadoje %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "PradÄ—tas kameros %d srautas uoste / kameros ID %d / %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "PradÄ—tas %d kameros srautas %d prievade" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "PradÄ—ti visus fotoaparatų srautus uoste %d" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "Paleidžiamas %d kameros srautas %d prievade" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "Nepavyko pradÄ—ti srauto %d kamerai" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "PraÅ¡oma kopijuoti prievadÄ… %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "Ongeldige webcontrol lock max ips. Instelling gelijk aan 25. " #: src/webu_html.c msgid "Cameras" msgstr "Kameros" #: src/webu_html.c msgid "Camera" msgstr "Kamera" #: src/webu_html.c msgid "All" msgstr "Visi" #: src/webu_html.c msgid "Action" msgstr "Veiksmas" #: src/webu_html.c msgid "Start Event" msgstr "Pradžia Renginys" #: src/webu_html.c msgid "End Event" msgstr "Pabaiga įvykis" #: src/webu_html.c msgid "Snapshot" msgstr "Nuotrauka" #: src/webu_html.c msgid "Change Configuration" msgstr "Keisti nustatymus" #: src/webu_html.c msgid "Write Configuration" msgstr "IÅ¡saugoti nustatymus" #: src/webu_html.c msgid "Tracking" msgstr "Sekimas" #: src/webu_html.c msgid "Pause" msgstr "PauzÄ—" #: src/webu_html.c msgid "Start" msgstr "PradÄ—ti" #: src/webu_html.c msgid "Restart" msgstr "Perkrauti" #: src/webu_html.c msgid "Quit" msgstr "IÅ¡eiti" #: src/webu_html.c msgid "Help" msgstr "Pagalba" #: src/webu_html.c msgid "No Configuration Options" msgstr "NÄ—ra konfigÅ«racijos parametrų" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "Riboti konfigÅ«racijos parametrai" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "IÅ¡plÄ—stiniai konfigÅ«racijos parametrai" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "Apriboti konfigÅ«racijos parametrai" # Webu Module #: src/webu_html.c msgid "All Cameras" msgstr "Visos kameros" #: src/webu_html.c msgid "Not running" msgstr "Neaktyvus" #: src/webu_html.c msgid "Lost connection" msgstr "Prarastas ryÅ¡ys" #: src/webu_html.c msgid "Paused" msgstr "Pristabdytas" #: src/webu_html.c msgid "Active" msgstr "Aktyvus" #: src/webu_html.c msgid "Select option" msgstr "Pasirinkite parametrÄ…" #: src/webu_html.c msgid "Save" msgstr "Sutaupyti" #: src/webu_html.c msgid "Pan/Tilt" msgstr "Pasukti / Pakreipti" #: src/webu_html.c msgid "Absolute Change" msgstr "Absoliutus skirtumas" #: src/webu_html.c msgid "Center" msgstr "Centras" #: src/webu_html.c msgid "Pan" msgstr "Pasukti" #: src/webu_html.c msgid "Tilt" msgstr "Pakreipti" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "Nurodytas netinkamas siÅ«las: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "Neteisingas kameros prievado URL: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "" "0 sriegio URL negalioja, kai naudojami specialÅ«s fotoaparato failai: %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "Netinkamas konkretaus fotoaparato prievado URL: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "Nepavyko gauti vaizdo srautui." #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "„ %s“ galimybÄ— yra nusidÄ—vÄ—jusi. Naujo varianto pavadinimas yra '%s' " motion-release-4.6.0/po/nl.po000066400000000000000000003223701452402535500160470ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:36-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "%s na versie %s" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "Onbekende configuratieoptie \" %s \"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "Configuratiebestand naar %s schrijven" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "Configureer %s niet gevonden - probeert standaardwaarden." #: src/conf.c msgid "Error getcwd" msgstr "Fout getcwd" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "kon configuratiebestand %s niet openen" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "Ongeldige bestandsnaam %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "Bezig met verwerken thread 0 - configuratiebestand %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "Geen configuratiebestand om te verwerken, met standaardwaarden" #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "Configuratieparameters schrijven van alle bestanden ( %d):" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "Thread %d - Configuratiebestand: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s " #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "Het configuratiebestand %s wordt verwerkt" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "Cameramapconfiguratie %s niet gevonden" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "Camera-configuratiebestand %s niet gevonden" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "Bezig met verwerken van camera-configuratiebestand %s" #: src/conf.c msgid "daemon" msgstr "demon" #: src/conf.c msgid "setup_mode" msgstr "instelmodus" #: src/conf.c msgid "pid_file" msgstr "pid-bestand" #: src/conf.c msgid "log_file" msgstr "logbestand" #: src/conf.c msgid "log_level" msgstr "Log niveau" #: src/conf.c msgid "log_type" msgstr "log type" #: src/conf.c msgid "quiet" msgstr "stil" #: src/conf.c msgid "watchdog_tmo" msgstr "waakhond tmo" #: src/conf.c msgid "watchdog_kill" msgstr "waakhond doden" #: src/conf.c msgid "native_language" msgstr "moedertaal" #: src/conf.c msgid "camera_name" msgstr "camera naam" #: src/conf.c msgid "camera_id" msgstr "camera id" #: src/conf.c msgid "target_dir" msgstr "doel richt" #: src/conf.c msgid "video_device" msgstr "videoapparaat" #: src/conf.c msgid "video_params" msgstr "video parameters" #: src/conf.c msgid "auto_brightness" msgstr "automatische helderheid" #: src/conf.c msgid "tuner_device" msgstr "tunerapparaat" #: src/conf.c msgid "roundrobin_frames" msgstr "roundrobin frames" #: src/conf.c msgid "roundrobin_skip" msgstr "roundrobin overslaan" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "roundrobin schakelaarfilter" #: src/conf.c msgid "netcam_url" msgstr "netcam url" #: src/conf.c msgid "netcam_params" msgstr "netcam parameters" #: src/conf.c msgid "netcam_high_url" msgstr "netcam hoge url" #: src/conf.c msgid "netcam_high_params" msgstr "netcam hoge parameters" #: src/conf.c msgid "netcam_userpass" msgstr "netcam gebruikerspas" #: src/conf.c msgid "mmalcam_name" msgstr "mmalcam naam" #: src/conf.c msgid "mmalcam_params" msgstr "mmalcam params" #: src/conf.c msgid "width" msgstr "breedte" #: src/conf.c msgid "height" msgstr "hoogte" #: src/conf.c msgid "framerate" msgstr "frame rate" #: src/conf.c msgid "minimum_frame_time" msgstr "minimale frametijd" #: src/conf.c msgid "rotate" msgstr "draaien" #: src/conf.c msgid "flip_axis" msgstr "draaias" #: src/conf.c msgid "locate_motion_mode" msgstr "zoek de bewegingsmodus" #: src/conf.c msgid "locate_motion_style" msgstr "zoek bewegingsstijl" #: src/conf.c msgid "text_left" msgstr "tekst over" #: src/conf.c msgid "text_right" msgstr "tekst rechts" #: src/conf.c msgid "text_changes" msgstr "tekst verandert" #: src/conf.c msgid "text_scale" msgstr "tekst schaal" #: src/conf.c msgid "text_event" msgstr "tekst evenement" #: src/conf.c msgid "emulate_motion" msgstr "beweging emuleren" #: src/conf.c msgid "pause" msgstr "pauze" #: src/conf.c msgid "threshold" msgstr "drempel" #: src/conf.c msgid "threshold_maximum" msgstr "drempel maximum" #: src/conf.c msgid "threshold_tune" msgstr "drempelwaarde" #: src/conf.c msgid "noise_level" msgstr "geluidsniveau" #: src/conf.c msgid "noise_tune" msgstr "geluid tune" #: src/conf.c msgid "despeckle_filter" msgstr "filter verwijderen" #: src/conf.c msgid "area_detect" msgstr "gebied detecteren" #: src/conf.c msgid "mask_file" msgstr "masker bestand" #: src/conf.c msgid "mask_privacy" msgstr "masker privacy" #: src/conf.c msgid "smart_mask_speed" msgstr "slimme maskersnelheid" #: src/conf.c msgid "lightswitch_percent" msgstr "lichtschakelaar procent" #: src/conf.c msgid "lightswitch_frames" msgstr "lichtschakelaar frames" #: src/conf.c msgid "minimum_motion_frames" msgstr "minimale bewegingsframes" #: src/conf.c msgid "event_gap" msgstr "evenement kloof" #: src/conf.c msgid "pre_capture" msgstr "vooraf vastleggen" #: src/conf.c msgid "post_capture" msgstr "na vangst" #: src/conf.c msgid "on_event_start" msgstr "bij het starten van een evenement" #: src/conf.c msgid "on_event_end" msgstr "aan het einde van het evenement" #: src/conf.c msgid "on_picture_save" msgstr "op foto opslaan" #: src/conf.c msgid "on_area_detected" msgstr "op gebied gedetecteerd" #: src/conf.c msgid "on_motion_detected" msgstr "bij beweging gedetecteerd" #: src/conf.c msgid "on_movie_start" msgstr "bij het starten van de film" #: src/conf.c msgid "on_movie_end" msgstr "aan het einde van de film" #: src/conf.c msgid "on_camera_lost" msgstr "op camera verloren" #: src/conf.c msgid "on_camera_found" msgstr "op camera gevonden" #: src/conf.c msgid "picture_output" msgstr "beelduitvoer" #: src/conf.c msgid "picture_output_motion" msgstr "beelduitvoerbeweging" #: src/conf.c msgid "picture_type" msgstr "afbeeldingstype" #: src/conf.c msgid "picture_quality" msgstr "fotokwaliteit" #: src/conf.c msgid "picture_exif" msgstr "foto exif" #: src/conf.c msgid "picture_filename" msgstr "afbeeldingsbestandsnaam" #: src/conf.c msgid "snapshot_interval" msgstr "momentopname interval" #: src/conf.c msgid "snapshot_filename" msgstr "snapshot bestandsnaam" #: src/conf.c msgid "movie_output" msgstr "filmuitvoer" #: src/conf.c msgid "movie_output_motion" msgstr "filmuitvoerbeweging" #: src/conf.c msgid "movie_max_time" msgstr "maximale filmtijd" #: src/conf.c msgid "movie_bps" msgstr "film bps" #: src/conf.c msgid "movie_quality" msgstr "filmkwaliteit" #: src/conf.c msgid "movie_codec" msgstr "film codec" #: src/conf.c msgid "movie_duplicate_frames" msgstr "dubbele filmframes" #: src/conf.c msgid "movie_passthrough" msgstr "film doorgeven" #: src/conf.c msgid "movie_filename" msgstr "filenaam" #: src/conf.c msgid "movie_extpipe_use" msgstr "film extpipe gebruik" #: src/conf.c msgid "movie_extpipe" msgstr "film extpipe" #: src/conf.c msgid "timelapse_interval" msgstr "timelapse-interval" #: src/conf.c msgid "timelapse_mode" msgstr "timelapse-modus" #: src/conf.c msgid "timelapse_fps" msgstr "timelapse fps" #: src/conf.c msgid "timelapse_codec" msgstr "timelapse codec" #: src/conf.c msgid "timelapse_filename" msgstr "timelapse bestandsnaam" #: src/conf.c msgid "video_pipe" msgstr "video pijp" #: src/conf.c msgid "video_pipe_motion" msgstr "video pijp beweging" #: src/conf.c msgid "webcontrol_port" msgstr "webcontrolepoort" #: src/conf.c msgid "webcontrol_ipv6" msgstr "webcontrol ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "webcontrol localhost" #: src/conf.c msgid "webcontrol_parms" msgstr "webcontrol parms" #: src/conf.c msgid "webcontrol_interface" msgstr "webcontrol interface" #: src/conf.c msgid "webcontrol_auth_method" msgstr "webcontrol verificatiemethode" #: src/conf.c msgid "webcontrol_authentication" msgstr "webcontrol authenticatie" #: src/conf.c msgid "webcontrol_tls" msgstr "webcontrol tls" #: src/conf.c msgid "webcontrol_cert" msgstr "webcontrol cert" #: src/conf.c msgid "webcontrol_key" msgstr "webcontrol sleutel" #: src/conf.c msgid "webcontrol_header_params" msgstr "webcontrol header parameters" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "webcontrol lock minuten" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "webcontrol vergrendelingspogingen" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "webcontrol lock max ips" #: src/conf.c msgid "stream_port" msgstr "stream poort" #: src/conf.c msgid "stream_localhost" msgstr "stream localhost" #: src/conf.c msgid "stream_auth_method" msgstr "stream auth-methode" #: src/conf.c msgid "stream_authentication" msgstr "stream authenticatie" #: src/conf.c msgid "stream_tls" msgstr "stream tls" #: src/conf.c msgid "stream_header_params" msgstr "stream header parameters" #: src/conf.c msgid "stream_preview_scale" msgstr "stream voorbeeldschaal" #: src/conf.c msgid "stream_preview_newline" msgstr "stream preview newline" #: src/conf.c msgid "stream_preview_method" msgstr "stream preview-methode" #: src/conf.c msgid "stream_quality" msgstr "stream kwaliteit" #: src/conf.c msgid "stream_grey" msgstr "stroom grijs" #: src/conf.c msgid "stream_motion" msgstr "stroom beweging" #: src/conf.c msgid "stream_maxrate" msgstr "stream maxrate" #: src/conf.c msgid "stream_limit" msgstr "streamlimiet" #: src/conf.c msgid "database_type" msgstr "database type" #: src/conf.c msgid "database_dbname" msgstr "database dbname" #: src/conf.c msgid "database_host" msgstr "database host" #: src/conf.c msgid "database_port" msgstr "database poort" #: src/conf.c msgid "database_user" msgstr "database gebruiker" #: src/conf.c msgid "database_password" msgstr "database wachtwoord" #: src/conf.c msgid "database_busy_timeout" msgstr "time-out voor database bezig" #: src/conf.c msgid "sql_log_picture" msgstr "sql logboekfoto" #: src/conf.c msgid "sql_log_snapshot" msgstr "sql log momentopname" #: src/conf.c msgid "sql_log_movie" msgstr "sql log-film" #: src/conf.c msgid "sql_log_timelapse" msgstr "sql log timelapse" #: src/conf.c msgid "sql_query_start" msgstr "sql query start" #: src/conf.c msgid "sql_query_stop" msgstr "sql zoekopdracht stop" #: src/conf.c msgid "sql_query" msgstr "sql-vraag" #: src/conf.c msgid "track_type" msgstr "type spoor" #: src/conf.c msgid "track_auto" msgstr "volg auto" #: src/conf.c msgid "track_port" msgstr "poort volgen" #: src/conf.c msgid "track_motorx" msgstr "spoor motorx" #: src/conf.c msgid "track_motorx_reverse" msgstr "spoor motorx achteruit" #: src/conf.c msgid "track_motory" msgstr "motief volgen" #: src/conf.c msgid "track_motory_reverse" msgstr "track motory reverse" #: src/conf.c msgid "track_maxx" msgstr "volg maxx" #: src/conf.c msgid "track_minx" msgstr "track minx" #: src/conf.c msgid "track_maxy" msgstr "track maxy" #: src/conf.c msgid "track_miny" msgstr "volgen miny" #: src/conf.c msgid "track_homex" msgstr "track homex" #: src/conf.c msgid "track_homey" msgstr "huiselijk bijhouden" #: src/conf.c msgid "track_iomojo_id" msgstr "volg iomojo id" #: src/conf.c msgid "track_step_angle_x" msgstr "volg stap hoek x" #: src/conf.c msgid "track_step_angle_y" msgstr "volg stap hoek y" #: src/conf.c msgid "track_move_wait" msgstr "track verplaatsen wacht" #: src/conf.c msgid "track_speed" msgstr "track snelheid" #: src/conf.c msgid "track_stepsize" msgstr "volg stapgrootte" #: src/conf.c msgid "track_generic_move" msgstr "generieke verplaatsing volgen" #: src/conf.c msgid "camera" msgstr "camera" #: src/conf.c msgid "camera_dir" msgstr "camera richt" #: src/dbse.c msgid "Closing MySQL library" msgstr "MySQL-bibliotheek sluiten" #: src/dbse.c msgid "Closing MariaDB library" msgstr "MariaDB-bibliotheek sluiten" #: src/dbse.c msgid "Database closed" msgstr "Database gesloten" #: src/dbse.c msgid "Initializing database" msgstr "Database initialiseren" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "" "Kan geen verbinding maken met MySQL-database %s op host %s met gebruiker %s" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "MySQL-fout was %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "" "Kan geen verbinding maken met MariaDB-database %s op host %s met gebruiker %s" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "MariaDB-fout was %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "Database openen %s" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "Kan SQLite3-database %s niet openen. Fout %d : %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "Time-out bij bezet instellen op %d msec" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "Instellen van time-out bij bezet mislukt. Fout %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "Verbinding met PostgreSQL-database ' %s' is mislukt: %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "Databasetype %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "MySQL-query uitvoeren" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "MySQL-query mislukt %s foutcode %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "" "Kan niet opnieuw verbinding maken met MySQL-database %s op host %s met " "MySQL- fout gebruiker %s was %s" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "Opnieuw verbinding maken met MySQL-database '%s' geslaagd" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "na opnieuw verbinden MySQL-query mislukt %s foutcode %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "MariaDB-query uitvoeren" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "MariaDB-query mislukt %s foutcode %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "Kan niet opnieuw verbinding maken met MariaDB-database %s op host %s met " "gebruiker %s MariaDBfout was %s" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "Opnieuw verbinding maken met MariaDB-database '%s' geslaagd" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "na opnieuw verbinden MariaDB-query mislukt %s foutcode %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "Opnieuw verbonden met PostgreSQL-database '%s'" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "PostgreSQL-query uitvoeren" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "Poging om opnieuw verbinding te maken met PostgreSQL-database '%s': %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "PGSQL-zoekopdracht is mislukt: [%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "%s . uitvoeren" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "SQLite3-fout %d: %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "Lege SQL-query negeren" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "Kan externe opdracht ' %s' niet starten" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "Externe opdracht ' %s' uitvoeren" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "Afbeelding naar bestand schrijven: %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "Film naar bestand schrijven: %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "Opgeslagen afbeelding naar bestand: %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "Opgeslagen film in bestand: %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "Kan afbeelding niet in videopijp plaatsen" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "Kon geen symbolische link maken [ %s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "Fout bij het maken van voorbeeldpijpnaam %d %s" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "Fout bij het maken van bestandsnaam base %d %s" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "Fout bij het maken van voorbeeldnaam %d %s" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "SLUITEN: extpipe-bestand desc %d, foutstatus %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "pclose rendement: %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "Bron FPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "filmpad: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "geen schrijftoegang tot doelmap %s" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "pad niet gevonden, probeert het %s te maken ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "fout bij toegang pad %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "Fout bij het opgeven van de opdrachtregel: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "pijp: %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt-> moviefps: %d" #: src/event.c msgid "popen failed" msgstr "popen mislukt" #: src/event.c msgid "Using extpipe" msgstr "Extpipe gebruiken" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "Fout bij het schrijven in de pijp, vermeld fout %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "pipe %s is nog niet gemaakt of gesloten" #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "De ogg-container wordt niet langer ondersteund. Wijzigen naar mpeg4" #: src/event.c msgid "Running test of the various output formats." msgstr "Lopende test van de verschillende uitvoerformaten." #: src/event.c msgid "Error opening context for movie output." msgstr "Fout bij openen van context voor filmuitvoer." #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffopen open fout bij het maken van (beweging) bestand [ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "" "De swf-container voor timelapse wordt niet langer ondersteund. Gebruik mpg " "container." #: src/event.c msgid "Timelapse using mpg codec." msgstr "Timelapse met behulp van mpg codec." #: src/event.c msgid "Events will be appended to file" msgstr "Evenementen worden aan het bestand toegevoegd" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "Timelapse met behulp van mpeg4 codec." #: src/event.c msgid "Events will be trigger new files" msgstr "Evenementen zullen nieuwe bestanden activeren" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffopen open fout bij het maken (timelapse) bestand [ %s]" #: src/event.c msgid "Error encoding image" msgstr "Fout bij coderen van afbeelding" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "Kan geheugen niet toewijzen voor codecnaam" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "De opgegeven framesnelheid is te hoog voor het opgegeven ffmpeg-filmtype. " "Kies een andere ffmpeg-container of lagere framerate." #: src/ffmpeg.c msgid "Error setting base file name" msgstr "Fout bij het instellen van de basisbestandsnaam" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "Fout bij instellen van timelapse append voor codec %s" #: src/ffmpeg.c msgid "Error setting file name" msgstr "Fout bij het instellen van de bestandsnaam" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "codec optiewaarde %s wordt niet ondersteund" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "Kon de codec niet krijgen" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "Fout bij het verzenden van frame voor codering: %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "Pakket ontvangen heeft EAGAIN geretourneerd -2 code: %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "Fout bij het ontvangen van gecodeerde pakketvideo: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "Fout bij het coderen van video: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "Fout bij het coderen van video" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "" "PTS % Basis PTS % ms interval % tijdbasis %d- %d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "SLECHTE TIMING!! Frame overgeslagen." #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "" "PTS % Basis PTS % ms interval % tijdbasis %d- %d " "Wijzigen %d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s codec vbr / crf / bitsnelheid: %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "Voorkeurcodec %s staat op de zwarte lijst: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "Codec %s niet gevonden" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "Codec %s gebruiken" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "Kan stream niet toewijzen" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "Kan codec niet toewijzen!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "Lage fps. %d frames coderen in een %d frames container." #: src/ffmpeg.c msgid "Unable to set quality" msgstr "Kan kwaliteit niet instellen" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "Gemelde FPS ondersteund %d / %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "Kan codec %s niet openen" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "Kan decoderparameters niet kopiëren !: %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "kon frame niet toewijzen" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "kon geen buffers %s toewijzen" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "fout bij het openen van bestand %s" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "Geen toestemming. %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "Fout bij het openen van bestand %s" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "Kan ffmpeg-kop %s niet schrijven" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "Fout bij het invoeren van de afvoermodus: %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "Fout bij het aftappen van codec: %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "Fout bij schrijven van leeglopend videoframe" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "Fout tijdens het coderen van de afbeelding" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "Fout tijdens het schrijven van videoframe" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet: %s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "Fout bij het schrijven van videoframe: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "RTSP context niet beschikbaar." #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "rtsp-camera niet gereed voor doorgang." #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "doorvoermodus ingeschakeld. Wisselen naar MP4-container." #: src/ffmpeg.c msgid "Could not get codec!" msgstr "Kon codec niet krijgen!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "Kan codec-parameters niet kopiëren" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "Doorvoer uitgeschakeld. ffmpeg te oud" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "Doorvoerstroom geopend" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "ffmpeg libavcodec-versie %d. %d. %d libavformat-versie %d. %d. %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "av lockmgr-register mislukt ( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "Geen ffmpeg-functionaliteit inbegrepen" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "av lockmgr register reset mislukt bij opruimen" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "Kan uitvoercontext niet toewijzen" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "Kan passthru niet instellen!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "Kan de stream niet instellen" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "Fout bij het doorspoelen van codec" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "Overmatige pogingen om gebufferd pakket te wissen" #: src/ffmpeg.c msgid "Buffered packet" msgstr "Gebufferd pakket" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s: Gegeven jpeg-buffer was te klein" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "Ongeldige JPEG-afbeeldingsafmetingen" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "JPEG-beeldgrootte %dx %d, JPEG was %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "Onverwachte terugbelgebeurtenis van camerabesturing, 0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "" "Een hoge framesnelheid kan problemen veroorzaken met de belichting van " "afbeeldingen" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "" "Als automatische belichting niet werkt, probeer dan een lagere framesnelheid." #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "Kan MMAL-cameracomponent %s niet maken" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "MMAL camera %s heeft geen uitvoerpoorten" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "Kan controlepoort niet inschakelen: fout %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "MMAL instellen zonder padding mislukt" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "camera videoformaat kon niet worden ingesteld" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "camera component kon niet worden ingeschakeld" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "MMAL camera component gemaakt" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "Maken van MMAL camerabufferpool is mislukt" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "Maken van MMAL camerabufferwachtrij is mislukt" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "Kan de vereiste buffer %d niet ophalen uit de poolwachtrij" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "Kan geen buffer naar poort verzenden ( %d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "MMAL Cameradraad start ... voor camera ( %s) van %dx %d bij %d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "camera params konden niet worden toegewezen" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "MMAL camera-opnamepoort inschakelen mislukt" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "Het starten van de MMAL-camera is mislukt" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "MMAL Camera opruimen" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %d vlaggen %08x grootte %d / %d bij %08x, img grootte = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "Kan geen buffer terugzenden naar de videopoort van de camera" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "Formaat van buffer voor vooraf vastleggen wijzigen naar %d items" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "Proces-ID-bestand verwijderd (pid-bestand)." #: src/motion.c msgid "Error removing pid file" msgstr "Fout bij verwijderen van pid-bestand" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "Logbestand sluiten ( %s)." #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "Beweging gedetecteerd - startgebeurtenis %d." #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "%d fillerframes toegevoegd aan film" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "Kan cameratype niet bepalen (MMAL, Netcam, V4L2, BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "Bestand met privacymasker openen" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "Hoge resolutie privacymaskerbestand openen" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "Fout bij het openen van maskerbestand %s" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "Kan maskerprivacyafbeelding niet lezen. Maskerprivacyfunctie uitgeschakeld." #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "Masker privacybestand \" %s \" geladen." #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "Ongeldige tekstschaal. Aangepast aan %d" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "Camera %d gestart: bewegingsdetectie %s" #: src/motion.c msgid "Disabled" msgstr "invalide" #: src/motion.c msgid "Enabled" msgstr "Ingeschakeld" #: src/motion.c msgid "Pass-through processing disabled." msgstr "Doorvoerverwerking uitgeschakeld." #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "Ongeldige configuratiedimensies %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "Standaarddimensies %dx %d gebruiken" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "De gevraagde afbeeldingsbreedte ( %d) is niet modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "De breedte aanpassen naar het volgende hogere veelvoud van 8 ( %d)." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "De gevraagde afbeeldingshoogte ( %d) is niet modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "De hoogte aanpassen naar het volgende hogere veelvoud van 8 ( %d)." #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "Kan het eerste beeld niet ophalen van de camera" #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "" "Beweging blijft breedte en hoogte gebruiken van configuratiebestand (en)" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "Motion ondersteunt alleen breedte en hoogte modulo 8" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "De gevraagde afbeeldingsbreedte ( %d) of hoogte ( %d) is niet modulo 8." #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Motion ondersteunt alleen breedte en hoogte groter dan of gelijk aan 64 %d x " "%d" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "Substream niet beschikbaar. Beeldformaten niet modulo 16." #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "Webp-afbeeldingsindeling is niet beschikbaar, mislukt terug naar jpeg" #: src/motion.c msgid "Error capturing first image" msgstr "Fout bij het vastleggen van de eerste afbeelding" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "Video loopback-apparaat openen voor normale foto's" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "Kan video-loopback voor normale foto's niet openen" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "Video loopback-apparaat voor films openen" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "Kan video-loopback voor films niet openen" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "Kan maskerafbeelding niet lezen. Maskerfunctie uitgeschakeld." #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "Maskerbestand \" %s \" geladen." #: src/motion.c msgid "Emulating motion" msgstr "Emuleren beweging" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "Beweging in gebied %d gedetecteerd." #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "Nieuwe poging tot succesvolle verbinding met camera" #: src/motion.c msgid "Camera has become available." msgstr "Camera is beschikbaar gekomen." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "Beweging opnieuw starten.\n" "De gevraagde afbeeldingsbreedte (%d) of hoogte (%d) is niet modulo 8." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Beweging opnieuw starten.\n" "Beweging ondersteunt alleen breedte en hoogte groter dan of gelijk aan 64 %dx%d" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "Beweging opnieuw starten.\n" "Hoogte of breedte is gewijzigd op de camera." #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "Beweging opnieuw starten.\n" "Hoge resolutie is veranderd op camera." #: src/motion.c msgid "Video signal re-acquired" msgstr "Videosignaal opnieuw verworven" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "Fatale fout videoapparaat - Videoapparaat wordt gesloten" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "" "Opnieuw starten van bewegingsdraad om alle beeldbuffers opnieuw te " "initialiseren" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "Videosignaal verloren - grijs beeld toevoegen" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "" "Videosignaal nog steeds verloren - Probeert het videoapparaat te sluiten" #: src/motion.c msgid "Lightswitch detected" msgstr "Lichtschakelaar gedetecteerd" #: src/motion.c msgid "Switchfilter detected" msgstr "Schakelfilter gedetecteerd" #: src/motion.c msgid "micro-lightswitch!" msgstr "micro-lightswitch!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "Einde gebeurtenis %d" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "Onbewerkte wijzigingen: %5d - wijzigingen na ' %s': %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr "- labels: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "Wijzigingen: %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr "- geluidsniveau: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr "- drempel: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "Ongeldig timelapse-modusargument ' %s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%: s Standaardinstelling voor handmatige timelapse-modus" #: src/motion.c msgid "Thread exiting" msgstr "Discussie verlaten" #: src/motion.c msgid "Motion going to daemon mode" msgstr "Beweging gaat naar daemon-modus" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "Beweging afsluiten, kan proces-ID-bestand (pid-bestand) %s niet maken" #: src/motion.c msgid "Could not change directory" msgstr "Kan map niet wijzigen" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "Aangemaakt proces id-bestand %s. Proces-ID is %d" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "" "Camara ID's zijn niet uniek of hebben waarden van meer dan 32.000. " "Terugvallen opdraad nummers" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2: beschikbaar" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2: niet beschikbaar" #: src/motion.c msgid "bktr : available" msgstr "bktr: beschikbaar" #: src/motion.c msgid "bktr : not available" msgstr "bktr: niet beschikbaar" #: src/motion.c msgid "webp : available" msgstr "webp: beschikbaar" #: src/motion.c msgid "webp : not available" msgstr "webp: niet beschikbaar" #: src/motion.c msgid "mmal : available" msgstr "mmal: beschikbaar" #: src/motion.c msgid "mmal : not available" msgstr "mmal: niet beschikbaar" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg: beschikbaar" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg: niet beschikbaar" #: src/motion.c msgid "mysql : available" msgstr "mysql: beschikbaar" #: src/motion.c msgid "mysql : not available" msgstr "mysql: niet beschikbaar" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB: beschikbaar" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB: niet beschikbaar" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3: beschikbaar" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3: niet beschikbaar" #: src/motion.c msgid "pgsql : available" msgstr "pgsql: beschikbaar" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql: niet beschikbaar" #: src/motion.c msgid "nls : available" msgstr "nls: beschikbaar" #: src/motion.c msgid "nls : not available" msgstr "nls: niet beschikbaar" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "Standaard logboekniveau gebruiken ( %s) ( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "Aanmelden bij bestand ( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "Beweging afsluiten, kan geen logbestand %s maken" #: src/motion.c msgid "Logging to syslog" msgstr "Inloggen op syslog" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "Beweging %s gestart" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "Standaard logboektype gebruiken ( %s)" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "Logboektype ( %s) logniveau ( %s) gebruiken" #: src/motion.c msgid "Motion running as daemon process" msgstr "Beweging loopt als daemon-proces" #: src/motion.c msgid "Motion running in setup mode." msgstr "Beweging wordt uitgevoerd in de instellingsmodus." #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "Camera-ID: %d is van %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "Camera-ID: %d Cameranaam: %s Service: %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "Camera-ID: %d Cameranaam: %s Apparaat: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "" "Streampoortnummer %d voor thread %d conflicteert met de besturingspoort" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "Streamfunctie voor thread %d is uitgeschakeld." #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "Streampoortnummer %d voor thread %d conflicteert met thread %d" #: src/motion.c msgid "Restarting motion." msgstr "Opnieuw starten van beweging." #: src/motion.c msgid "Motion restarted" msgstr "De beweging is opnieuw gestart" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "Thread %d - Time-out watchdog. Probeer een sierlijke herstart te doen" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "" "Thread %d - Time-out van Watchdog is NIET opnieuw gestart, waardoor deze is " "gedood!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "Draad %d - Reinigingsdraad." #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "DEBUG-1 threads met %d motion threads met %d, afwerking %d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "Wacht tot de threads zijn voltooid, pid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "Bewegingsdraad %d herstart" #: src/motion.c msgid "Threads finished" msgstr "Discussies voltooid" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "Beweging wordt beëindigd" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "Ongeldige URL. Kan waarden niet parseren." #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "Camerahandler-thread [ %d] is gestart" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "Netcam-aansluiting wordt gesloten als Keep-Alive-tijd is verstreken (camera " "is verzonden Sluit veld). EENopnieuw verbinden zou moeten gebeuren." #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "camera opnieuw openen (niet-streaming)" #: src/netcam.c msgid "camera re-connected" msgstr "camera opnieuw verbonden" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "Niet-herkende afbeeldingskop ( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "Fout in koptekst ( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "camera opnieuw openen (streaming)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "Fout bij het ophalen van jpeg-afbeelding" #: src/netcam.c msgid "Trying to re-connect" msgstr "Probeer opnieuw verbinding te maken" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "netcam camera handler: afwerking ingesteld, afsluiten" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "Geen reactie van camerahandler - hij moet al dood zijn" #: src/netcam.c msgid "called with no data in buffer" msgstr "aangeroepen zonder gegevens in buffer" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "Netwerkcamera start voor camera ( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "Ongeldige netcam-proxy ( %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "Gebruikersnaam / wachtwoord niet toegestaan ​​op een proxy-URL" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "Ongeldige netcam-service ' %s'" #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "Ongeldige netcam-URL voor camera ( %s)" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "Netcam http parameter ' %s' converteert naar vlaggen: HTTP / 1.0: %s HTTP / " "1.1: %s Keep-Levend %s." #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "roept nu netcam setup html () aan" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "roept nu netcam setup ftp aan" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "roept nu het configuratiebestand van netcam aan ()" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "roept nu netcam setup mjpg () aan" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "Ongeldige netcam-service '%s' - moet mjpeg, ftp, mjpg of jpeg zijn." #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "Poging om eerste afbeelding te lezen - retval: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "decompressie mislukt libjpeg op eerste frame - opgeven!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "Breedte / hoogte ( %dx %d) moet veelvouden van 8 zijn" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "Fout bij starten van camerahandler-thread [ %d]" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "recv mislukt in ftp krijg meer" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "Serverreactie: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "verzenden mislukt in FTP-gebruiker verzenden" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "verzenden mislukt in ftp verzenden passwd" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "verzenden mislukt in ftp afsluiten" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "gethostbyname is mislukt in ftp connect" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "gethostbyname adres komt niet overeen in ftp connect" #: src/netcam_ftp.c msgid "socket failed" msgstr "stopcontact mislukt" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "Kan geen verbinding maken" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "FTP-server vraagt ​​om ACCT op anoniem" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "optie voor socket instellen SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "verzenden mislukt in FTP-verbinding ophalen" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "Ongeldig antwoord op PASV" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "Kan geen gegevensverbinding maken" #: src/netcam_ftp.c msgid "bind failed" msgstr "binden mislukt" #: src/netcam_ftp.c msgid "listen failed" msgstr "luisteren is mislukt" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "verzenden mislukt in ftp get socket" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "accepteer in ftp get socket" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "recv mislukt in ftp lezen" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "ftp get socket is mislukt" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "Fout bij het verzenden van TYPE I naar ftp-server" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "onjuist gevormd token Inhoud-lengte maar waarde %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "Inhoud-lengte %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "Inhoudstype %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "" "Fout bij lezen van afbeeldingskoptekst, streamingmodus (1). Null header." #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "" "Fout bij lezen van afbeeldingskoptekst, streamingmodus (1). Onbekende kop " "'%s' " #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "Fout bij lezen van afbeeldingskoptekst (2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "Koptekst niet JPEG" #: src/netcam_http.c msgid "Content-Length 0" msgstr "Inhoud-lengte 0" #: src/netcam_http.c msgid "Found image header record" msgstr "Afbeelding koptekstrecord gevonden" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "Fout bij het verzenden van 'verbindings'-verzoek" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "Eerste kop ontvangen (' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "Fout bij lezen van eerste kop ( %s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "HTTP-resultaatcode %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "" "Netcam Keep-Alive-vlag verwijderd vanwege kennelijk gesloten HTTP-verbinding." #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "Niet-streaming camera (set voor levend houden)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "Niet-streaming camera (niet in leven, niet ingesteld)" #: src/netcam_http.c msgid "Streaming camera" msgstr "Streaming camera" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "Grensreeks [ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "Grensreeks niet gevonden in koptekst" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "" "Streaming camera waarschijnlijk met behulp van MJPG-blokken, overweeg het " "gebruik van mjpg: //netcam url." #: src/netcam_http.c msgid "Unrecognized content type" msgstr "Onbekend inhoudstype" #: src/netcam_http.c msgid "Content-length present" msgstr "Inhoud lengte aanwezig" #: src/netcam_http.c msgid "Content-length 0" msgstr "Inhoud lengte 0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "Conn gevonden: koptekst sluiten (' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "" "Zowel de 'Connection: Keep-Alive' als de 'Connection: close' header " "ontvangen.Beweging verwijdert keepalive." #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "" "Zowel de 'Connection: Keep-Alive' als de 'Connection: close' header " "ontvangen.Beweging blijft ongewijzigd." #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "Ontvangen een Keep-Alive-veld in deze set headers." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "Geen 'Connection: Keep-Alive' of 'Connection: close' header ontvangen.\n" " Beweging verwijdert keepalive. " #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "Geen 'Connection: Keep-Alive' of 'Connection: close' header ontvangen. \n" " Beweging blijft ongewijzigd." #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "Netcam Keep-Alive-vlag verwijderd omdat de kop 'Verbinding: sluiten' is " "ontvangen. \n" " Netcam ondersteunt Keep-Alive niet. Beweging gaat door in non-Keep-Alive." #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "Keep-Alive heeft het einde van de geldige periode bereikt. \n" " \n" " Motion sluit netcam en hervat Keep-Alive met een nieuwe socket." #: src/netcam_http.c msgid "disconnect" msgstr "Loskoppelen" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo () is mislukt ( %s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "netcam loskoppelen (1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "Netcam loskoppelen omdat keep-alive niet is ingesteld." #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "zonder keepalive, poging om socket te maken is mislukt." #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "zonder keepalive, nieuwe socket gemaakt fd %d" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "met keepalive set, ongeldige socket. Dit zou de eerste keer kunnen zijn. Een " "makennieuwe is mislukt." #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "" "met keepalive set, ongeldige socket. Dit zou voor het eerst een nieuwe " "kunnen zijnéén met fd %d" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "ZO KEEPALIVE is %s" #: src/netcam_http.c msgid "ON" msgstr "OP" #: src/netcam_http.c msgid "OFF" msgstr "UIT" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "ZO KEEPALIVE ingesteld op aansluiting." #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "fcntl (1) op socket" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "fcntl (2) op socket" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "connect () mislukt ( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "netcam loskoppelen (4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "time-out bij verbinden ()" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "netcam loskoppelen (2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "krijgt na het verbinden" #: src/netcam_http.c msgid "connect returned error" msgstr "connect geretourneerde fout" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "netcam loskoppelen (3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "buffer uitbreiden van [ %d / %d] naar [ %d / %d] bytes." #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "Potentiële splitgrens - %d tekens gespoeld, %d verplaatst" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "recv () mislukt na begrenzingsreeks" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "netcam aangesloten laten." #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "probeert verbinding te maken, tijd # %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "Kan camera niet openen - controleer uw configuratie en dat de netcamera " "online is" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "Fout bij lezen van eerste kop - opnieuw proberen" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "Kan eerste camerakoptekst niet lezen - voorlopig opgeven" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "Netcam heeft vlaggen: HTTP / 1.0: %s HTTP / 1.1: %s Keep-Alive %s." #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "" "Netcam keepalive vlag verwijderd vanwege proxyset. Proxy is niet compatibel " "metIn leven houden." #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "Kan de kop van de eerste stream niet lezen - voorlopig opgeven" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "verbonden, verder lezen beeld." #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "Leesfout, probeert opnieuw verbinding te maken .." #: src/netcam_http.c msgid "lost the cam." msgstr "de camera verloren." #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "Bijgevulde buffer met [ %d] bytes van het netwerk." #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "Lees [ %d / %d] headerbytes." #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "Ongeldige kop ontvangen, opnieuw verbonden" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "Lees [ %d / %d] chunkbytes, [ %d / %d] totaal" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "Chunk voltooid, buffer gebruikt [ %d] bytes." #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "Afbeelding voltooid, buffer gebruikt [ %d] bytes." #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "verbonden, verder lezen en decoderen van MJPG-brokken." #: src/netcam_http.c msgid "Begin" msgstr "Beginnen" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "stat ( %s) fout" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]! = laatste st mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "wachten op nieuwe bestandsimage time-out" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "wachten met nieuwe bestandsafbeelding wachten" #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "nieuwe bestandsafbeelding verwerken - st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "open ( %s) fout: %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "lees ( %s) fout: %d" #: src/netcam_http.c msgid "End" msgstr "Einde" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> file-> pad %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "Niet genoeg gegevens van netcam." #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> jpeg error %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "*** nieuwe foto vertraging succesvol ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "jpeg-fout %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "jpeg-afbeelding verwerken - inhoudsduur %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "Camerabreedte / hoogte komt niet overeen met JPEG-afbeelding - verwacht %dx" "%d, JPEG %dx%d retval %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s: Formaat van pakketreeks gewijzigd in %d" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s: av kopieerpakket: %s, onderbreken: %s" #: src/netcam_rtsp.c msgid "True" msgstr "waar" #: src/netcam_rtsp.c msgid "False" msgstr "vals" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: Pakket met ongeldige gegevens negeren" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: Fout opnameframe: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "Pakket negeren met ongeldige gegevens" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "Fout bij het decoderen van pakket: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "" "%s: Fout bij het overzetten van gedecodeerde HW naar het systeemgeheugen" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "Fout bij het verzenden van pakket naar codec: %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "Fout bij het decoderen van videopakket: kopiëren naar buffer" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: HW-apparaten:" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s (beschikbaar)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s (niet geïmplementeerd)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s: netcam-decoder %s uitgeschakeld." #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "Kan vaapi pix-indeling niet ophalen" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "Cuda pix-indeling kan niet worden opgehaald" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s: onderbroken." #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: Mislukt" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s: Decoder %s werkte niet." #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "" "%s: Negeren en verwijderen van de door de gebruiker gevraagde decoder %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s: vaapi-decoder initialiseren" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: kan vaapi hw-apparaat niet vinden" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s: Cuda-decoder initialiseren" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: kan cuda hw-apparaat niet vinden" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s: Decoder initialiseren" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s: decoder %s gebruiken" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: decoder geopend" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s: time-out voor camera lezen ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s: time-out van camera ( %s)" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "Kan swsframe niet toewijzen in." #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "Kan swsframe niet toewijzen." #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "Kan schaalcontext niet toewijzen." #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "Fout bij het bepalen van de grootte van het frame" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "Fout bij het toewijzen van afbeelding in: %s" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "Fout bij het toewijzen van afbeelding: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "Fout bij wijzigen van formaat / opnieuw formatteren: %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "Fout bij het plaatsen van frame in uitvoerbuffer: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s: onderbroken" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: gem leesframe: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: overmatige pogingen om gegevens van camera %d . te krijgen" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "" "%s: opnamesnelheid niet gespecificeerd in netcam-parameters. %d . gebruiken" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s: opnamesnelheid niet gespecificeerd in netcam-parameters. Framerate %d . " "gebruiken" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "De netwerkcamera verzendt afbeeldingen op een andere manier" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "grootte dan gespecificeerd in de configuratie en ook een" #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "ander beeldformaat. De foto is aan het zijn" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "getranscodeerd naar YUV420P en in de gevraagde grootte" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "in het configuratiebestand. Wijzig indien mogelijk netcam in" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "in het YUV420P-formaat zijn en de gevraagde grootte in de" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "configuratie om mogelijk CPU-gebruik te verlagen." #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "grootte dan gespecificeerd in het configuratiebestand." #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "De afbeelding wordt getranscodeerd naar het formaat" #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "gevraagd in de configuratie. Verander indien mogelijk" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "netcam of configuratie om dezelfde grootte aan te geven" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "om mogelijk het CPU-gebruik te verlagen." #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "Netcam: %dx %d => Config: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "De verzonden afbeelding is" #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "gecodeerd naar YUV420P. Verander indien mogelijk van netcam" #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "beeldformaat naar YUV420P om mogelijk het CPU-gebruik te verlagen." #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: rtsp/rtmp . instellen" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: Invoerformaat mjpeg instellen" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: Invoerformaat video4linux2 instellen" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: filmbestand instellen" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s: %s instellen" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: optie: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "v4l2 instellen via netcam" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "Bestand instellen via netcam" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "%s instellen via netcam" #: src/netcam_rtsp.c msgid "highres" msgstr "hoge resolutie" #: src/netcam_rtsp.c msgid "norm" msgstr "norm" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "%s stream instellen." #: src/netcam_rtsp.c msgid "Unknown" msgstr "Onbekend" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "Stream gekopieerd voor doorvoer" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "Null pad gepasseerd om verbinding te maken" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s: camera kan niet worden geopend ( %s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s: geopende camera ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s: kan stream-info niet vinden: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s: kan codec-context niet openen: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s: camerabeeldgrootte is ongeldig" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s: kan frame niet toewijzen." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s: kan stream niet kopiëren voor doorvoer." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s: kan eerste afbeelding niet lezen" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s: camera ( %s) aangesloten" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s: Netcam-opnamesnelheid is %d." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s: Camerabron is %d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s: kan de camerabron-FPS niet bepalen." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s: opnamesnelheid is lager dan camera-FPS." #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s: er zullen decoderingsfouten optreden." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "" "%s: opnamesnelheid die iets groter is dan de FPS van de camera wordt " "aanbevolen." #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s: opnieuw verbinden met camera ...." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s: camera heeft niet opnieuw verbinding gemaakt." #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s: elke 10 seconden op camera controleren." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s: Camerahandler-thread [ %d] is gestart" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s: handlerlus voltooid." #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s: Fout bij starten van handlerdraad" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s: Wachten op eerste afbeelding van de handler." #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "kan geen rtsp-context maken" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "kan geen rtsp hoge context maken" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "Geen FFmpeg-ondersteuning" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s: netwerkcamera afsluiten." #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s: Geen reactie van handlerdraad." #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "Normale resolutie: afsluiten voltooid." #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "Hoge resolutie: afsluiten voltooid." #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "Kan EXIF ​​niet instellen op webp chunk" #: src/picture.c msgid "libwebp version error" msgstr "libwebp-versiefout" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "libwebp toewijzingsfout beeldbuffer" #: src/picture.c msgid "libwebp image compression error" msgstr "libwebp beeldcompressiefout" #: src/picture.c msgid "unable to assemble webp image" msgstr "kan webpaginabeeld niet samenstellen" #: src/picture.c msgid "unable to save webp image to file" msgstr "kan webpaginabeeld niet opslaan in bestand" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "Kan afbeelding niet naar bestand %s schrijven - controleer toegangsrechten " "tot doelmap \n" " Discussie gaat eindigen vanwege deze fatale fout " #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "Kan foto niet naar bestand %s schrijven" #: src/picture.c msgid "Error getting PGM vars." msgstr "Fout bij ophalen van PGM-vars." #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "Dit is geen pgm-bestand, begint met ' %s'" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "Magisch %s: Breedte %s(%d): Hoogte %s(%d): MaxVal: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "Het lezen van afbeeldingsgegevens uit het pgm-bestand is mislukt" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "" "Het opgegeven maskerbestand heeft niet dezelfde grootte als het beeld van de " "camera." #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "" "Poging om het formaat van het maskerbeeld te wijzigen van %dx %d tot %dx %d" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "" "kan maskerbestand %s niet schrijven - controleer toegangsrechten tot doelmap" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "kan maskerbestand %s niet schrijven" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "Het schrijven van het standaardmasker als pgm-bestand is mislukt" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "Leeg masker %s maken \n" " Bewerk dit bestand en voer de beweging opnieuw uit om de maskerfunctie in " "te schakelen " #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "Config optie \"roteren \" geen veelvoud van 90: %d" #: src/track.c msgid "internal error" msgstr "interne fout" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "interne fout, %hu is geen bekend tracktype" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "poort %s dev fd %i, motor %hu command %hu data %hu" #: src/track.c msgid "Status byte timeout!" msgstr "Statusbyte time-out!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "Probeer het seriële apparaat %s te openen" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "Kan serieel apparaat %s niet openen" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "Kan serieel apparaat %s niet initialiseren" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "Serieel apparaat %s geopend en initialiseren, fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "Er is nog geen apparaat %s gestart, probeert stepper center ()" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "kon het stepper-apparaat niet initialiseren op %s, fd [ %i]." #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "geslaagd, apparaat is %s gestart, fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "VERZENDT poort %s dev fd %i, motor %hu command %hu data %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "Opdrachtrendement %d" #: src/track.c msgid "Problem opening servo!" msgstr "Probleem bij openen servo!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d, cent-> y %d, reversex %d, reversey %d handmatig %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d waarde buiten bereik! ( %d - %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d waarde buiten bereik! ( %d - %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "X offset %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "X cent-> x %d, cent-> y %d, reversex %d, reversey %d motorx %d data %d " "commando %d " #: src/track.c #, c-format msgid "Y offset %d" msgstr "Y offset %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Y cent-> x %d, cent-> y %d, reversex %d, reversey %d motory %d data %d " "commando %d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "X-offset %d, Y-offset %d, x-positie %d. y-positie %d, reversex %d, reversey " "%d, stapgrootte %d" #: src/track.c msgid "Return byte timeout!" msgstr "Retour byte time-out!" #: src/track.c msgid "Unable to set camera speed" msgstr "Kan camerasnelheid niet instellen" #: src/track.c msgid "succeed" msgstr "slagen" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "Kan pwc-camera niet resetten naar startpositie! Reden" #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "mislukt VIDIOCPWCMPTGRANGE" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "Kan PWC-camera niet pannen / kantelen! Reden" #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "Kan de UVC-camera niet resetten naar de startpositie! Reden" #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "UVC-camera resetten naar startpositie" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl querycontrol" #: src/track.c msgid "Getting camera range" msgstr "Camerabereik verkrijgen" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "INPUT PARAM ABS pan min %d, pan max %d, tilt min %d, tilt max %d" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "INGANG PARAM ABS X Engel %d, Y Engel %d" #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "Verplaats voor SET ABS X %d, verplaats Y %d" #: src/track.c msgid "Failed to move UVC camera!" msgstr "Kan UVC-camera niet verplaatsen!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "Gevonden MINMAX = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "Voor ABS Y Angel: x = %d, Y = %d," #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "Na ABS Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "Voor SET REL pan min %d, pan max %d, tilt min %d, tilt max %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "Voor SET REL track pan Angel %d, track tilt Angel %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "Verplaats voor SET REL X %d, verplaats Y %d" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, controle S = %d, Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, controle S = %d, Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "Voor REL Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "Na REL Y Angel: x = %d, Y = %d" #: src/translate.c msgid "Language: English" msgstr "Taal Engels" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "Kan %llu bytes geheugen niet toewijzen!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "" "Waarschuwing! Functie %s probeert het geheugenblok te wijzigen van %p tot 0 " "bytes!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "Kan het geheugenblok niet wijzigen bij offset %p tot %llu bytes (functie %s)!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "Probleem bij het maken van map %s" #: src/util.c #, c-format msgid "creating directory %s" msgstr "map %s maken" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "Fout bij het openen van bestand %s met modus %s" #: src/util.c msgid "Error closing file" msgstr "Fout bij het sluiten van het bestand" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbeventid} wordt niet ondersteund. Gebruik eventid." #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "ongeldige specificatie sleutelwoord %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "Kan threadnaam %s niet instellen" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "FFMPEG-versie te oud. Pass-through verwerking uitschakelen." #: src/util.c msgid "pass-through enabled." msgstr "doorgang ingeschakeld." #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "Fout bij instellen parm >%s<" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "Geparseerd: >%s< >%s<" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "Geparseerd: >geredigeerd< >geredigeerd<" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "Fout bij parseren van parm nm-besturingselementen: %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "Fout bij het parseren van pars vl-besturingselementen: %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "Fout bij het instellen van de temperatuur: %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "Fout bij het repareren van besturingselementen: %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "Parseren: %s" #: src/util.c msgid "Parsing: " msgstr "Parseren: " #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "Fout bij het parseren van besturingselementen: %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "Fout: %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "Nieuwe netcam-parameters: %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "Nieuwe netcam hoge parameters: %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "Nieuwe videoparameters: %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "Nieuwe webcontrol-headerparameters: %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "Nieuwe webcontrol-headerparameters: " #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "Nieuwe stream header-parameters: %s" #: src/util.c msgid "New stream_header_params: " msgstr "Nieuwe stream header-parameters: " #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "Programmeerfout. Onbekend configuratie-item: %s " #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE Fout bij het instellen van de tint [ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "tot [ %d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE Fout bij het krijgen van tint" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT Fout bij instellen verzadiging [ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT Fout bij verkrijgen van verzadiging" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT Fout bij instellen van contrast [ %d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT Fout bij verkrijgen van contrast" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "METEORSBRIG helderheid [ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIG krijgt helderheid" #: src/video_bktr.c msgid "Not implemented" msgstr "Niet geïmplementeerd" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "Apparaatingang %d buiten bereik (0-4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d ongeldig - Composiet %d proberen" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "" "BT848SFMT, Kon het invoerformaat niet instellen, probeer het opnieuw " "standaard" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "BT848SFMT, kon het invoerformaat ook niet standaard instellen" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "Kon de geometrie niet instellen" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "tot [ %d / %d] Norm %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "Niet geldig Frequentie [%ld] voor Broninvoer [%i]" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "Frequentie [%ld] Broninvoer [%i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "invoer instellen [ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "invoerformaat instellen [ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "geometrie instellen [ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "Frequentieset (nog niet geïmplementeerd" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "Grootte buffer tot 3x" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "Grootte buffer naar 3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap is mislukt" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "METEORCAPTUR met één methode Fout vastleggen" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "Fout bij het vastleggen met één methode" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "Kan videoapparaat niet vinden" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "Videoapparaat %s wordt gesloten" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "" "Nog steeds %d gebruikers van videoapparaat %s, dus we sluiten het nu niet" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "config beeldbreedte ( %d) is niet modulo 8" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "configuratie afbeeldingshoogte ( %d) is niet modulo 8" #: src/video_bktr.c msgid "Stopping capture" msgstr "Stoppen met vastleggen" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "" "[ %s] -ingangen opnieuw gebruiken [ %d, %d] Opnamemethode wijzigen " "METEOR_CAP_SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "VIDEO PALETTE YUV420P instelling imgs.size norm en imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "open videoapparaat %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "open tuner apparaat %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "Corrupt beeld ... doorgaan" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "SOI-positie aangepast met %d bytes." #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "bellen mmalcam opruimen" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "opgeroepen netcam opruimen" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "bellen netcam rtsp opruimen" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "V4L2-apparaat opruimen" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "BKTR-apparaat opschonen" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "Geen camera-apparaat opruimen (MMAL, Netcam, V4L2, BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "MMAL-opening openen" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "MMAL-cam kan niet worden geopend" #: src/video_common.c msgid "Opening Netcam" msgstr "Netcam openen" #: src/video_common.c msgid "Netcam failed to open" msgstr "Netcam kan niet worden geopend" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Netcam RTSP openen" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Netcam RTSP kan niet worden geopend" #: src/video_common.c msgid "Opening V4L2 device" msgstr "V4L2-apparaat wordt geopend" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "V4L2-apparaat kan niet worden geopend" #: src/video_common.c msgid "Opening BKTR device" msgstr "BKTR-apparaat openen" #: src/video_common.c msgid "BKTR device failed to open" msgstr "BKTR-apparaat kan niet worden geopend" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "Geen camera-apparaat opgegeven (MMAL, Netcam, V4L2, BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "Kan ' %s' niet openen" #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "Fout bij het opgeven van buffer: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "Openingsbuffer: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "Leesbuffer: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "videoapparaat ' %s' %d gevonden" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "%s geopend als leidinguitgang" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "Het openen van %s omdat de pijpuitgang is mislukt" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "Originele pijpspecificaties" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "Voorgestelde pijpspecificaties" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "Definitieve pijpspecificaties" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "Geen besturingselementen gevonden voor apparaat" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "--------- Controls ---------" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr "V4L2 ID-naam en bereik" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "Fout bij resetten gebruikerswaarde" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "Controle %s \"%s\" op %d . laten staan" #: src/video_v4l2.c msgid "Device not ready" msgstr "Apparaat niet gereed" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "Stel besturingselement \" %s \" in op %d" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "het instellen van controle %s \"%s\" op %d is mislukt." #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "" "%s controle optie waarde %s is onder het minimum. Minimaal %d . gebruiken " #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "%s controle optie waarde %s is boven maximum. Maximaal %d . gebruiken " #: src/video_v4l2.c msgid "control type not supported yet" msgstr "besturingstype nog niet ondersteund" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "Kan invoer %d niet opvragen. VIDIOC ENUMINPUT, als u een WEBCAM-" "wijzigingsinvoer gebruiktwaarde in conf met -1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "Naam = \" %s \", type 0x %08X, status %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "Name = \" %s \", - TUNER" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "Name = \" %s \" - CAMERA" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "Fout bij het selecteren van ingang %d VIDIOC S INPUT" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "Apparaat ondersteunt geen specificatie van PAL / NTSC-norm" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "- videostandaard %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "Fout bij het selecteren van standaardmethode %d VIDIOC S STD" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "Videostandaard ingesteld op NTSC" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "Videostandaard ingesteld op SECAM" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "Videostandaard ingesteld op PAL" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "tuner %d VIDIOC G TUNER" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "Tuner instellen %d" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "freq %ul VIDIOC S FREQUENCY" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "Stel frequentie in op %ul" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "Kan %c%c%c%c (%dx%d) niet gebruiken" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "Testpalet %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "De afbeeldingsgrootte %dx%d controleren met stap %d" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "Geen paswaarde opgegeven door het apparaat." #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "Breedte (%d) moet kleiner zijn dan stride(%d)" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "De afbeeldingsbreedte (%d) is geen veelvoud van de stap (%d)" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "Onmogelijke staat: Breedte (%d), Stride (%d), Per stap (%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "Afbeeldingsbreedte wordt opgevuld %d bytes" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "Resolutie aanpassen van %ix %i tot %ix %i." #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "Aangepaste resolutie niet modulo 8." #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "" "Geef een ander palet of breedte / hoogte op in het configuratiebestand." #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "Fout bij instellen van pixelformaat." #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "Palet %c %c %c %c gebruiken ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "Aanpassen aan breedte ( %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "Aanpassen aan hoogte ( %d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "Configuratiepaletindex %d ( %s) voor %dx %d werkt niet." #: src/video_v4l2.c msgid "Supported palettes:" msgstr "Ondersteunde paletten:" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d - %s (gecomprimeerd: %d) ( %# x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "Geselecteerd palet %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "Paletselectie mislukt voor indeling %s" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "Kan geen compatibel paletformaat vinden." #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "Fout bij het aanvragen van buffers %d voor geheugenmap. VIDIOC REQBUFS" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "mmap-informatie: frames = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "Onvoldoende buffergeheugen %d %s< >%s< >%s<" msgstr "Ongeldige actie gevraagd:> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "Moedertaal: aan" #: src/webu.c msgid "Native Language : off" msgstr "Moedertaal: uit" #: src/webu.c msgid "Set the value to null/zero" msgstr "Stel de waarde in op nul / nul" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "Verbinding negeren van: %s" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "Verificatie mislukt van %s" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "Geen webcontrol-gebruiker: doorgegeven" #: src/webu.c msgid "No stream user:pass provided" msgstr "Geen streamgebruiker: doorgegeven wachtwoord" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "Ongeldig antwoord" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "Fout bij het toevoegen van webcontrol-header %s %s" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "Fout bij het toevoegen van streamheader %s %s" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "Ongeldige gevraagde methode: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "Verbinding vanaf: %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "verzendpagina is mislukt %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "Stream foto is nog niet klaar" #: src/webu.c msgid "Stream process requested to finish." msgstr "Streamproces verzocht om te voltooien." #: src/webu.c msgid "Send page failed." msgstr "Pagina verzenden mislukt." #: src/webu.c msgid "Basic authentication: available" msgstr "Basisverificatie: beschikbaar" #: src/webu.c msgid "Basic authentication: disabled" msgstr "Basisverificatie: uitgeschakeld" #: src/webu.c msgid "Digest authentication: available" msgstr "Digest authenticatie: beschikbaar" #: src/webu.c msgid "Digest authentication: disabled" msgstr "Digest-authenticatie: uitgeschakeld" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd libary te oud ipv6 uitgeschakeld" #: src/webu.c msgid "IPV6: available" msgstr "IPV6: beschikbaar" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6: uitgeschakeld" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd libary te oud SSL / TLS uitgeschakeld" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS: beschikbaar" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS: uitgeschakeld" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "Fout bij lezen van bestand voor SSL / TLS-ondersteuning." #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "SSL / TLS aangevraagd maar geen cert-bestand verstrekt. SSL / TLS " "uitgeschakeld" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "" "SSL / TLS aangevraagd maar geen sleutelbestand opgegeven. SSL / TLS " "uitgeschakeld" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "Webcontrol starten op poort %d" #: src/webu.c msgid "Unable to start MHD" msgstr "Kan MHD niet starten" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "Webcontrol gestart op poort %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "Gestarte camera %d stream op poort / camera-id %d / %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "Camera %d stream gestart op poort %d" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "Alle camerastreams op poort %d starten" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "Camera %d stream starten op poort %d" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "Kan stream voor camera %d niet starten" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "Dubbele poort aangevraagd %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "Ongeldige webcontrol lock max ips. Instelling gelijk aan 25. " #: src/webu_html.c msgid "Cameras" msgstr "Camera's" #: src/webu_html.c msgid "Camera" msgstr "Camera" #: src/webu_html.c msgid "All" msgstr "Al" #: src/webu_html.c msgid "Action" msgstr "Actie" #: src/webu_html.c msgid "Start Event" msgstr "Start evenement" #: src/webu_html.c msgid "End Event" msgstr "Einde evenement" #: src/webu_html.c msgid "Snapshot" msgstr "Snapshot" #: src/webu_html.c msgid "Change Configuration" msgstr "Configuratie wijzigen" #: src/webu_html.c msgid "Write Configuration" msgstr "Schrijf configuratie" #: src/webu_html.c msgid "Tracking" msgstr "Tracking" #: src/webu_html.c msgid "Pause" msgstr "Pauze" #: src/webu_html.c msgid "Start" msgstr "Start" #: src/webu_html.c msgid "Restart" msgstr "Herstarten" #: src/webu_html.c msgid "Quit" msgstr "Sluit" #: src/webu_html.c msgid "Help" msgstr "Helpen" #: src/webu_html.c msgid "No Configuration Options" msgstr "Geen configuratie-opties" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "Beperkte configuratie-opties" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "Geavanceerde configuratie-opties" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "Vertrouwelijke configuratie-opties" #: src/webu_html.c msgid "All Cameras" msgstr "Alle camera's" #: src/webu_html.c msgid "Not running" msgstr "Niet actief" #: src/webu_html.c msgid "Lost connection" msgstr "Lost Connection" #: src/webu_html.c msgid "Paused" msgstr "Onderbroken" #: src/webu_html.c msgid "Active" msgstr "Actief" #: src/webu_html.c msgid "Select option" msgstr "Selecteer optie" #: src/webu_html.c msgid "Save" msgstr "Opslaan" #: src/webu_html.c msgid "Pan/Tilt" msgstr "Swivel / kantelen" #: src/webu_html.c msgid "Absolute Change" msgstr "Absolute verandering" #: src/webu_html.c msgid "Center" msgstr "Center" #: src/webu_html.c msgid "Pan" msgstr "Swivel" #: src/webu_html.c msgid "Tilt" msgstr "Kantelen" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "Ongeldige thread opgegeven: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "Ongeldige URL voor een cameraspecifieke poort: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "" "URL voor thread 0 is niet geldig bij gebruik van cameraspecifieke " "bestanden .: %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "Onjuiste URL voor een cameraspecifieke poort: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "Kon afbeelding niet streamen." #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "' %s' optie wordt afgeschreven. Nieuwe optienaam is '%s'" motion-release-4.6.0/po/no.po000066400000000000000000003164671452402535500160640ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:36-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: no\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "%s etter versjon %s" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "Ukjent konfigurasjonsalternativ \" %s \"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "Skriver konfigurasjonsfil til %s" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "Konfigurering %s ikke funnet - prøver standardverdier." #: src/conf.c msgid "Error getcwd" msgstr "Feil getcwd" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "kunne ikke Ã¥pne configfile %s" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "Ugyldig filnavn %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "Behandler trÃ¥d 0 - konfigurasjonsfil %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "Ingen konfigurasjonsfil Ã¥ behandle ved Ã¥ bruke standardverdier" #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "Skrive konfigurasjonsparametere fra alle filer ( %d):" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "TrÃ¥d %d - Konfigurasjonsfil: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s " #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "Behandler konfigurasjonsfilen %s" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "Kamerakatalogkonfigurasjon %s ikke funnet" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "Kamerakonfigurasjonsfil %s ikke funnet" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "Behandler kamerakonfigur %s" #: src/conf.c msgid "daemon" msgstr "daemon" #: src/conf.c msgid "setup_mode" msgstr "oppsettmodus" #: src/conf.c msgid "pid_file" msgstr "pid-fil" #: src/conf.c msgid "log_file" msgstr "loggfil" #: src/conf.c msgid "log_level" msgstr "loggenivÃ¥" #: src/conf.c msgid "log_type" msgstr "loggtype" #: src/conf.c msgid "quiet" msgstr "stille" #: src/conf.c msgid "watchdog_tmo" msgstr "vakthund tmo" #: src/conf.c msgid "watchdog_kill" msgstr "vakthund drepe" #: src/conf.c msgid "native_language" msgstr "morsmÃ¥l" #: src/conf.c msgid "camera_name" msgstr "kameranavn" #: src/conf.c msgid "camera_id" msgstr "kamera-ID" #: src/conf.c msgid "target_dir" msgstr "mÃ¥l dir" #: src/conf.c msgid "video_device" msgstr "videoenhet" #: src/conf.c msgid "video_params" msgstr "video params" #: src/conf.c msgid "auto_brightness" msgstr "automatisk lysstyrke" #: src/conf.c msgid "tuner_device" msgstr "tuner" #: src/conf.c msgid "roundrobin_frames" msgstr "roundrobin rammer" #: src/conf.c msgid "roundrobin_skip" msgstr "roundrobin hoppe" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "roundrobin switchfilter" #: src/conf.c msgid "netcam_url" msgstr "nettkamera url" #: src/conf.c msgid "netcam_params" msgstr "netcam params" #: src/conf.c msgid "netcam_high_url" msgstr "nettkamera høy url" #: src/conf.c msgid "netcam_high_params" msgstr "netcam høye params" #: src/conf.c msgid "netcam_userpass" msgstr "netcam brukerpass" #: src/conf.c msgid "mmalcam_name" msgstr "mmalcam navn" #: src/conf.c msgid "mmalcam_params" msgstr "mmalcam params" #: src/conf.c msgid "width" msgstr "bredde" #: src/conf.c msgid "height" msgstr "høyde" #: src/conf.c msgid "framerate" msgstr "framerate" #: src/conf.c msgid "minimum_frame_time" msgstr "minimum rammetid" #: src/conf.c msgid "rotate" msgstr "rotere" #: src/conf.c msgid "flip_axis" msgstr "snu aksen" #: src/conf.c msgid "locate_motion_mode" msgstr "Finn bevegelsesmodus" #: src/conf.c msgid "locate_motion_style" msgstr "Finn bevegelsesstil" #: src/conf.c msgid "text_left" msgstr "tekst igjen" #: src/conf.c msgid "text_right" msgstr "tekst riktig" #: src/conf.c msgid "text_changes" msgstr "tekstendringer" #: src/conf.c msgid "text_scale" msgstr "tekst skala" #: src/conf.c msgid "text_event" msgstr "tekstbegivenhet" #: src/conf.c msgid "emulate_motion" msgstr "emulere bevegelse" #: src/conf.c msgid "pause" msgstr "pause" #: src/conf.c msgid "threshold" msgstr "terskel" #: src/conf.c msgid "threshold_maximum" msgstr "maksimum terskel" #: src/conf.c msgid "threshold_tune" msgstr "terskelinnstilling" #: src/conf.c msgid "noise_level" msgstr "støynivÃ¥" #: src/conf.c msgid "noise_tune" msgstr "støy melodi" #: src/conf.c msgid "despeckle_filter" msgstr "vrakfilter" #: src/conf.c msgid "area_detect" msgstr "omrÃ¥det oppdage" #: src/conf.c msgid "mask_file" msgstr "maskefil" #: src/conf.c msgid "mask_privacy" msgstr "maske privatliv" #: src/conf.c msgid "smart_mask_speed" msgstr "smart maskehastighet" #: src/conf.c msgid "lightswitch_percent" msgstr "lysbryter prosent" #: src/conf.c msgid "lightswitch_frames" msgstr "lysbryterrammer" #: src/conf.c msgid "minimum_motion_frames" msgstr "minimum bevegelsesrammer" #: src/conf.c msgid "event_gap" msgstr "hendelsesgap" #: src/conf.c msgid "pre_capture" msgstr "før fangst" #: src/conf.c msgid "post_capture" msgstr "etterfangst" #: src/conf.c msgid "on_event_start" msgstr "pÃ¥ eventstart" #: src/conf.c msgid "on_event_end" msgstr "pÃ¥ slutten av arrangementet" #: src/conf.c msgid "on_picture_save" msgstr "pÃ¥ bildet lagre" #: src/conf.c msgid "on_area_detected" msgstr "pÃ¥ omrÃ¥de oppdaget" #: src/conf.c msgid "on_motion_detected" msgstr "pÃ¥ bevegelse oppdaget" #: src/conf.c msgid "on_movie_start" msgstr "pÃ¥ filmstart" #: src/conf.c msgid "on_movie_end" msgstr "pÃ¥ film slutt" #: src/conf.c msgid "on_camera_lost" msgstr "pÃ¥ kamera tapt" #: src/conf.c msgid "on_camera_found" msgstr "pÃ¥ kamera funnet" #: src/conf.c msgid "picture_output" msgstr "bildeutgang" #: src/conf.c msgid "picture_output_motion" msgstr "bildeutgangsbevegelse" #: src/conf.c msgid "picture_type" msgstr "bildetype" #: src/conf.c msgid "picture_quality" msgstr "bildekvalitet" #: src/conf.c msgid "picture_exif" msgstr "bilde exif" #: src/conf.c msgid "picture_filename" msgstr "bilde filnavn" #: src/conf.c msgid "snapshot_interval" msgstr "øyeblikksbilde-intervall" #: src/conf.c msgid "snapshot_filename" msgstr "øyeblikksbilde filnavn" #: src/conf.c msgid "movie_output" msgstr "filmutgang" #: src/conf.c msgid "movie_output_motion" msgstr "filmutgang" #: src/conf.c msgid "movie_max_time" msgstr "film maks tid" #: src/conf.c msgid "movie_bps" msgstr "film bps" #: src/conf.c msgid "movie_quality" msgstr "filmkvalitet" #: src/conf.c msgid "movie_codec" msgstr "filmkodek" #: src/conf.c msgid "movie_duplicate_frames" msgstr "film dupliserte rammer" #: src/conf.c msgid "movie_passthrough" msgstr "filmgjennomgang" #: src/conf.c msgid "movie_filename" msgstr "filnavn" #: src/conf.c msgid "movie_extpipe_use" msgstr "bruk av film extpipe" #: src/conf.c msgid "movie_extpipe" msgstr "filmuttrekk" #: src/conf.c msgid "timelapse_interval" msgstr "tidsintervall" #: src/conf.c msgid "timelapse_mode" msgstr "timelapse-modus" #: src/conf.c msgid "timelapse_fps" msgstr "timelapse fps" #: src/conf.c msgid "timelapse_codec" msgstr "timelapse codec" #: src/conf.c msgid "timelapse_filename" msgstr "timelapse filnavn" #: src/conf.c msgid "video_pipe" msgstr "videorør" #: src/conf.c msgid "video_pipe_motion" msgstr "bevegelse av videorør" #: src/conf.c msgid "webcontrol_port" msgstr "nettkontrollport" #: src/conf.c msgid "webcontrol_ipv6" msgstr "webcontrol ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "webkontroll localhost" #: src/conf.c msgid "webcontrol_parms" msgstr "nettkontrollparmer" #: src/conf.c msgid "webcontrol_interface" msgstr "nettkontrollgrensesnitt" #: src/conf.c msgid "webcontrol_auth_method" msgstr "nettkontroll autorisasjonsmetode" #: src/conf.c msgid "webcontrol_authentication" msgstr "godkjenning pÃ¥ nettet" #: src/conf.c msgid "webcontrol_tls" msgstr "webkontroll tls" #: src/conf.c msgid "webcontrol_cert" msgstr "webcontrol cert" #: src/conf.c msgid "webcontrol_key" msgstr "nettkontrollnøkkel" #: src/conf.c msgid "webcontrol_header_params" msgstr "webkontroll overskrift params" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "webkontrolllÃ¥s minutter" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "webkontrolllÃ¥sforsøk" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "webkontrolllÃ¥s maks. ips" #: src/conf.c msgid "stream_port" msgstr "strømhavn" #: src/conf.c msgid "stream_localhost" msgstr "strøm localhost" #: src/conf.c msgid "stream_auth_method" msgstr "strøm autorisasjonsmetode" #: src/conf.c msgid "stream_authentication" msgstr "stream autentisering" #: src/conf.c msgid "stream_tls" msgstr "stream tls" #: src/conf.c msgid "stream_header_params" msgstr "stream header params" #: src/conf.c msgid "stream_preview_scale" msgstr "stream forhÃ¥ndsvisningsskala" #: src/conf.c msgid "stream_preview_newline" msgstr "stream forhÃ¥ndsvisning newline" #: src/conf.c msgid "stream_preview_method" msgstr "stream preview-metoden" #: src/conf.c msgid "stream_quality" msgstr "strømkvalitet" #: src/conf.c msgid "stream_grey" msgstr "strømgrÃ¥" #: src/conf.c msgid "stream_motion" msgstr "strøm bevegelse" #: src/conf.c msgid "stream_maxrate" msgstr "stream maksrate" #: src/conf.c msgid "stream_limit" msgstr "strømgrense" #: src/conf.c msgid "database_type" msgstr "databasetype" #: src/conf.c msgid "database_dbname" msgstr "database dbname" #: src/conf.c msgid "database_host" msgstr "database vert" #: src/conf.c msgid "database_port" msgstr "databaseport" #: src/conf.c msgid "database_user" msgstr "databasebruker" #: src/conf.c msgid "database_password" msgstr "database passord" #: src/conf.c msgid "database_busy_timeout" msgstr "timeout for database opptatt" #: src/conf.c msgid "sql_log_picture" msgstr "sql loggbilde" #: src/conf.c msgid "sql_log_snapshot" msgstr "stillbilde av sql log" #: src/conf.c msgid "sql_log_movie" msgstr "sql loggfilm" #: src/conf.c msgid "sql_log_timelapse" msgstr "sql log timelapse" #: src/conf.c msgid "sql_query_start" msgstr "sql spørringsstart" #: src/conf.c msgid "sql_query_stop" msgstr "sql spørringsstopp" #: src/conf.c msgid "sql_query" msgstr "sql spørring" #: src/conf.c msgid "track_type" msgstr "banetype" #: src/conf.c msgid "track_auto" msgstr "spore auto" #: src/conf.c msgid "track_port" msgstr "sporport" #: src/conf.c msgid "track_motorx" msgstr "spormotor" #: src/conf.c msgid "track_motorx_reverse" msgstr "spor motorx revers" #: src/conf.c msgid "track_motory" msgstr "spormotor" #: src/conf.c msgid "track_motory_reverse" msgstr "spore motiv revers" #: src/conf.c msgid "track_maxx" msgstr "spor maks" #: src/conf.c msgid "track_minx" msgstr "spor minx" #: src/conf.c msgid "track_maxy" msgstr "spor maks" #: src/conf.c msgid "track_miny" msgstr "spore miny" #: src/conf.c msgid "track_homex" msgstr "spor hjemmex" #: src/conf.c msgid "track_homey" msgstr "spor hjemlig" #: src/conf.c msgid "track_iomojo_id" msgstr "spor iomojo id" #: src/conf.c msgid "track_step_angle_x" msgstr "spor trinnsvinkel x" #: src/conf.c msgid "track_step_angle_y" msgstr "spor trinn vinkel y" #: src/conf.c msgid "track_move_wait" msgstr "spor flytte vent" #: src/conf.c msgid "track_speed" msgstr "sporhastighet" #: src/conf.c msgid "track_stepsize" msgstr "spor trinnstørrelse" #: src/conf.c msgid "track_generic_move" msgstr "spore generisk trekk" #: src/conf.c msgid "camera" msgstr "kamera" #: src/conf.c msgid "camera_dir" msgstr "camera dir" #: src/dbse.c msgid "Closing MySQL library" msgstr "Lukker MySQL -bibliotek" #: src/dbse.c msgid "Closing MariaDB library" msgstr "Lukker MariaDB -biblioteket" #: src/dbse.c msgid "Database closed" msgstr "Databasen stengt" #: src/dbse.c msgid "Initializing database" msgstr "Initierer databasen" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "Kan ikke koble til MySQL-databasen %s pÃ¥ verten %s med brukeren %s" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "MySQL-feilen var %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "Kan ikke koble til MariaDB -databasen %s pÃ¥ verten %s med brukeren %s" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "MariaDB -feilen var %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "Ã…pner database %s" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "Kan ikke Ã¥pne SQLite3-databasen %s. Feil %d: %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "Setter opptatt tidsavbrudd til %d msec" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "Innstilling av opptatt tidsavbrudd mislyktes. Feil %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "Tilkobling til PostgreSQL-databasen ' %s' mislyktes: %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "Databasetype %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "Utfører MySQL -forespørsel" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "MySQL -spørringen mislyktes %s feilkode %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "" "Kan ikke koble til MySQL-database %s pÃ¥ verten %s med bruker %s MySQL-feil " "igjenvar %s" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "Koble til MySQL-databasen '%s' pÃ¥ nytt" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "etter ny tilkobling mislyktes MySQL-spørringen %s feilkode %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "Utfører MariaDB -spørringen" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "MariaDB -spørringen mislyktes %s feilkode %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "Kan ikke koble til MariaDB -databasen %s pÃ¥ verten %s igjen med brukeren %s " "MariaDBfeilen var %s" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "Tilkobling til MariaDB-databasen%s lykkes pÃ¥ nytt" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "etter ny tilkobling mislyktes MariaDB-spørringen %s feilkode %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "Tilkoblet pÃ¥ nytt til PostgreSQL-databasen '%s'" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "Utfører PostgreSQL -forespørsel" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "Prøver Ã¥ koble til PostgreSQL -databasen ' %s' pÃ¥ nytt: %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "PGSQL-spørring mislyktes: [%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "Utfører %s" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "SQLite3-feil %d: %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "Ignorerer tom sql-spørring" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "Kan ikke starte ekstern kommando ' %s'" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "Utfører ekstern kommando ' %s'" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "Skriver bilde til fil: %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "Skriver film til fil: %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "Lagret bilde i filen: %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "Filmen er lagret i filen: %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "Kunne ikke sette bilde i videorøret" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "Kunne ikke opprette symbolsk lenke [ %s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "Feil ved oppretting av forhÃ¥ndsvisningsrørnavn %d %s" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "Feil ved oppretting av filnavnbase %d %s" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "Feil ved oppretting av forhÃ¥ndsvisningsnavn %d %s" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "LUKKING: extpipe fil desc %d, feiltilstand %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "pclose return: %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "Kilde FPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "filmsti: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "ingen skrivetilgang til mÃ¥lkatalogen %s" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "banen ikke funnet, prøver Ã¥ opprette den %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "feil ved tiltredelse av bane %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "Feil ved spesifisering av kommandolinjen: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "pipe: %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt-> moviefps: %d" #: src/event.c msgid "popen failed" msgstr "popen mislyktes" #: src/event.c msgid "Using extpipe" msgstr "Ved hjelp av extpipe" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "Feil ved skriving i røret, angi feil %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "pipe %s ikke allerede opprettet eller lukket" #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "Ogg-beholderen støttes ikke lenger. Skiftes til mpeg4" #: src/event.c msgid "Running test of the various output formats." msgstr "Kjører test av de forskjellige utdataformatene." #: src/event.c msgid "Error opening context for movie output." msgstr "Feil ved Ã¥pning av kontekst for filmutgang." #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffopen Ã¥pen feil ved Ã¥ lage (bevegelses) fil [ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "" "Swf-beholderen for timelapse støttes ikke lenger. Bruker mpg-container." #: src/event.c msgid "Timelapse using mpg codec." msgstr "Timelapse ved hjelp av mpg-kodek." #: src/event.c msgid "Events will be appended to file" msgstr "Hendelser legges ved i filen" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "Timelapse ved hjelp av mpeg4 codec." #: src/event.c msgid "Events will be trigger new files" msgstr "Hendelser vil utløse nye filer" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffopen Ã¥pen feil ved Ã¥ lage (timelapse) fil [ %s]" #: src/event.c msgid "Error encoding image" msgstr "Feil ved koding av bilde" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "Kunne ikke tildele minne for kodekenavn" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "Den angitte bildefrekvensen er for høy for den angitte ffmpeg-filmtypen.Velg " "en annen ffmpeg-beholder eller lavere ramme." #: src/ffmpeg.c msgid "Error setting base file name" msgstr "Feil ved innstilling av basisfilnavn" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "Feil ved innstilling av timelapse vedlegg for codec %s" #: src/ffmpeg.c msgid "Error setting file name" msgstr "Feil ved innstilling av filnavn" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "codec-alternativverdien %s støttes ikke" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "Kunne ikke hente kodeken" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "Feil ved sending av ramme for koding: %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "Motta pakken kastet EAGAIN og returnerte -2 kode: %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "Feil ved mottak av kodet pakkevideo: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "Feil ved koding av video: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "Feil ved koding av video" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "" "PTS % Base PTS % ms intervall % tidsbase %d- %d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "DÃ…RLIG TIMING!! Rammen hoppet over." #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "" "PTS % Base PTS % ms intervall % tidsbase %d- %d " "Endring%d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s codec vbr / crf / bit rate: %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "Foretrukket codec %s er svartelistet: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "Kodeks %s ikke funnet" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "Bruker kodek %s" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "Kunne ikke tildele strøm" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "Kunne ikke tildele codec!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "Lav fps. Koder %d rammer i en %d rammer container." #: src/ffmpeg.c msgid "Unable to set quality" msgstr "Kan ikke angi kvalitet" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "Rapportert FPS-støtte %d / %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "Kunne ikke Ã¥pne codec %s" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "Kunne ikke kopiere dekoderparametere !: %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "kunne ikke tildele ramme" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "kunne ikke tildele buffere %s" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "feil ved Ã¥pning av fil %s" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "Tillatelse avslÃ¥tt. %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "Feil ved Ã¥pning av fil %s" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "Kunne ikke skrive ffmpeg header %s" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "Feil ved start av tappemodus: %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "Feil ved tapping av codec: %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "Feil ved skriving av tapping av videoramme" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "Feil under koding av bilde" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "Feil under skriving av videoramme" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet: %s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "Feil under skriving av videoramme: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "RTSP-kontekst ikke tilgjengelig." #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "rtsp kamera er ikke klart for gjennomføring." #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "gjennomgangsmodus aktivert. Skiftes til MP4-beholder." #: src/ffmpeg.c msgid "Could not get codec!" msgstr "Kunne ikke fÃ¥ kodek!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "Kan ikke kopiere kodekparametere" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "Gjennomgang deaktivert. ffmpeg for gammel" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "Gjennomstrømning Ã¥pnet" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "ffmpeg libavcodec versjon %d. %d. %d libavformat versjon %d. %d. %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "av lockmgr-register mislyktes ( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "Ingen ffmpeg-funksjonalitet inkludert" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "av lockmgr register reset mislyktes ved opprydding" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "Kunne ikke tildele utgangskontekst" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "Kunne ikke konfigurere passthru!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "Kunne ikke stille strømmen" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "Feil ved skylling av kodeken" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "For store forsøk pÃ¥ Ã¥ tømme buffret pakke" #: src/ffmpeg.c msgid "Buffered packet" msgstr "Bufret pakke" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s: Gitt jpeg-buffer var for liten" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "Ugyldige JPEG-bildedimensjoner" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "JPEG bildestørrelse %dx %d, JPEG var %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "Mottatt uventet kamerakontroll tilbakeringingshendelse, 0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "En høy bildefrekvens kan forÃ¥rsake problemer med eksponering av bilder" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "" "Hvis autoexponering ikke fungerer, kan du prøve en lavere bildefrekvens." #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "Kunne ikke opprette MMAL-kamerakomponent %s" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "MMAL-kamera %s har ikke utgangsporter" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "Kan ikke aktivere kontrollporten: feil %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "Oppsett av MMAL-ingen polstring mislyktes" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "kameraets videoformat kunne ikke angis" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "kamerakomponent kunne ikke aktiveres" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "MMAL-kamerakomponent opprettet" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "Oppretting av MMAL-kamerabufferbasseng mislyktes" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "Oppretting av MMAL-kamerabufferkø mislyktes" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "Kan ikke fÃ¥ en nødvendig buffer %d fra bassengkøen" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "Kan ikke sende en buffer til port ( %d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "MMAL KameratrÃ¥d starter ... for kamera ( %s) pÃ¥ %dx %d ved %d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "kameraparameller kunne ikke tildeles" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "Aktivering av MMAL-kameraet er ikke mulig" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "Start av MMAL-kamera fangst" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "MMAL kameraopprydding" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %d flagg %08x størrelse %d / %d ved %08x, img størrelse = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "Kan ikke returnere en buffer til kameraets videoport" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "Endre størrelse pÃ¥ forhÃ¥ndsfangstbuffer til %d elementer" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "Fjernet prosess-id-fil (pid-fil)." #: src/motion.c msgid "Error removing pid file" msgstr "Feil ved fjerning av pid-fil" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "Lukker loggfil ( %s)." #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "Bevegelse oppdaget - starthendelse %d." #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "Lagt %d fyllerammer inn i filmen" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "Kan ikke bestemme kameratype (MMAL, Netcam, V4L2, BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "Ã…pning av personvernmaske" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "Ã…pner fil med maskefil med høy oppløsning" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "Feil ved Ã¥pning av maskefil %s" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "Kunne ikke lese personvernbildet til masken. Funksjon for maske-personvern " "er deaktivert." #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "Maske personvernfil \" %s \" lastet." #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "Ugyldig tekstskala. Justert til %d" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "Kamera %d startet: bevegelsesdeteksjon %s" #: src/motion.c msgid "Disabled" msgstr "Funksjonshemmet" #: src/motion.c msgid "Enabled" msgstr "aktivert" #: src/motion.c msgid "Pass-through processing disabled." msgstr "Gjennomgangsbehandling deaktivert." #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "Ugyldige konfigurasjonsdimensjoner %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "Bruker standarddimensjoner %dx %d" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "Bildebredde ( %d) forespurt er ikke modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "Justere bredden til neste høyere multippel pÃ¥ 8 ( %d)." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "Bildehøyde ( %d) forespurt er ikke modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "Justere høyden til neste høyere multippel pÃ¥ 8 ( %d)." #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "Kunne ikke hente det første bildet fra kameraet" #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "" "Bevegelse fortsetter Ã¥ bruke bredde og høyde fra konfigurasjonsfil (er)" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "Bevegelse støtter bare bredde og høydemodul 8" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "Bildebredde ( %d) eller høyde ( %d) forespurt er ikke modulo 8." #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "Bevegelse støtter bare bredde og høyde større enn eller lik 64 %dx %d" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "Understrøm ikke tilgjengelig. Bildestørrelser ikke modulo 16." #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "webp-bildeformat er ikke tilgjengelig, og gÃ¥r ikke tilbake til jpeg" #: src/motion.c msgid "Error capturing first image" msgstr "Feil ved fange av første bilde" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "Ã…pne video loopback-enhet for normale bilder" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "Kunne ikke Ã¥pne video loopback for vanlige bilder" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "Ã…pne video loopback-enhet for film" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "Kunne ikke Ã¥pne video loopback for film" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "Kunne ikke lese maskebildet. Maskefunksjonen er deaktivert." #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "Maskfile \" %s \" lastet." #: src/motion.c msgid "Emulating motion" msgstr "Emulerende bevegelse" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "Bevegelse i omrÃ¥de %d oppdaget." #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "Forsøk pÃ¥ nytt til vellykket tilkobling med kamera" #: src/motion.c msgid "Camera has become available." msgstr "Kamera har blitt tilgjengelig." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "Starter bevegelse pÃ¥ nytt.\n" "Forespurt bildebredde (%d) eller høyde (%d) er ikke modulo 8." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Starter bevegelse pÃ¥ nytt.\n" "Bevegelse støtter bare bredde og høyde større enn eller lik 64 %dx%d" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "Starter bevegelse pÃ¥ nytt.\n" "Høyde eller bredde har endret seg pÃ¥ kameraet." #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "Starter bevegelse pÃ¥ nytt.\n" "Høy oppløsning er endret pÃ¥ kameraet." #: src/motion.c msgid "Video signal re-acquired" msgstr "Ervervet videosignal" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "Dødelig feil pÃ¥ videoenhet - Lukking av videoenhet" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "Start Motion thread pÃ¥ nytt for Ã¥ initialisere alle bildebuffere" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "Videosignal mistet - Legger til grÃ¥tt bilde" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "Fortsatt tapt videosignal - Prøver Ã¥ lukke videoenhet" #: src/motion.c msgid "Lightswitch detected" msgstr "Lysbryter oppdaget" #: src/motion.c msgid "Switchfilter detected" msgstr "Bryterfilter oppdaget" #: src/motion.c msgid "micro-lightswitch!" msgstr "mikro-lysbryter!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "Slutt pÃ¥ hendelsen %d" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "RÃ¥ endringer: %5d - endringer etter ' %s': %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr "- etiketter: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "Endringer: %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr "- støynivÃ¥: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr "- terskel: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "Ugyldig argument for timelapse-modus ' %s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%: s Standard til manuell timelapse-modus" #: src/motion.c msgid "Thread exiting" msgstr "TrÃ¥d spennende" #: src/motion.c msgid "Motion going to daemon mode" msgstr "Bevegelse gÃ¥r til demonmodus" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "Avslutt bevegelse, kan ikke opprette prosess-id-fil (pid-fil) %s" #: src/motion.c msgid "Could not change directory" msgstr "Kunne ikke endre katalogen" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "Opprettet prosess-id-fil %s. Prosess-ID er %d" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "" "Camara-ID-er er ikke unike eller har verdier over 32 000. Faller tilbake " "tiltrÃ¥dnumre" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2: tilgjengelig" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2: ikke tilgjengelig" #: src/motion.c msgid "bktr : available" msgstr "bktr: tilgjengelig" #: src/motion.c msgid "bktr : not available" msgstr "bktr: ikke tilgjengelig" #: src/motion.c msgid "webp : available" msgstr "webp: tilgjengelig" #: src/motion.c msgid "webp : not available" msgstr "webp: ikke tilgjengelig" #: src/motion.c msgid "mmal : available" msgstr "mmal: tilgjengelig" #: src/motion.c msgid "mmal : not available" msgstr "mmal: ikke tilgjengelig" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg: tilgjengelig" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg: ikke tilgjengelig" #: src/motion.c msgid "mysql : available" msgstr "mysql: tilgjengelig" #: src/motion.c msgid "mysql : not available" msgstr "mysql: ikke tilgjengelig" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB: tilgjengelig" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB: ikke tilgjengelig" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3: tilgjengelig" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3: ikke tilgjengelig" #: src/motion.c msgid "pgsql : available" msgstr "pgsql: tilgjengelig" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql: ikke tilgjengelig" #: src/motion.c msgid "nls : available" msgstr "nls: tilgjengelig" #: src/motion.c msgid "nls : not available" msgstr "nls: ikke tilgjengelig" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "Bruker standard loggnivÃ¥ ( %s) ( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "Logger pÃ¥ fil ( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "Avslutt bevegelse, kan ikke opprette loggfil %s" #: src/motion.c msgid "Logging to syslog" msgstr "Logger pÃ¥ syslog" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "Bevegelse %s startet" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "Bruker standard loggtype ( %s)" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "Bruker loggtype ( %s) loggenivÃ¥ ( %s)" #: src/motion.c msgid "Motion running as daemon process" msgstr "Bevegelse som kjøres som en demonprosess" #: src/motion.c msgid "Motion running in setup mode." msgstr "Bevegelse som kjører i oppsettmodus." #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "Kamera-ID: %d er fra %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "Kamera-ID: %d Kameranavn: %s Service: %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "Kamera-ID: %d Kameranavn: %s Enhet: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "Stream portnummer %d for trÃ¥d %d konflikter med kontrollporten" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "Streamfunksjon for trÃ¥d %d er deaktivert." #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "Stream portnummer %d for trÃ¥d %d konflikter med trÃ¥d %d" #: src/motion.c msgid "Restarting motion." msgstr "Start bevegelse pÃ¥ nytt." #: src/motion.c msgid "Motion restarted" msgstr "Bevegelsen startet pÃ¥ nytt" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "TrÃ¥d %d - Timeout for vakthund. Prøver Ã¥ gjøre en grasiøs omstart" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "TrÃ¥d %d - Timeout for vakthund startet IKKE pÃ¥ nytt, og drepte den!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "TrÃ¥d %d - RengjøringstrÃ¥d." #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "DEBUG-1 trÃ¥der kjører %d bevegelsestrÃ¥der kjører %d, finish %d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "Venter pÃ¥ at trÃ¥dene skal bli ferdige, pid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "BevegelsestrÃ¥d %d start pÃ¥ nytt" #: src/motion.c msgid "Threads finished" msgstr "TrÃ¥der ferdig" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "Bevegelsesavslutning" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "Ugyldig URL. Kan ikke analysere verdier." #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "KamerahandlertrÃ¥den [ %d] startet" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "Lukking av netcam-kontakten nÃ¥r Keep-Alive-tiden er oppe (kameraet sendes " "Lukk felt). ENkoble til igjen skal skje." #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "gjenÃ¥pningskamera (ikke-streaming)" #: src/netcam.c msgid "camera re-connected" msgstr "kameraet tilkoblet pÃ¥ nytt" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "Ukjent bildeoverskrift ( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "Feil i overskriften ( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "gjenÃ¥pningskamera (streaming)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "Feil ved Ã¥ fÃ¥ jpeg-bilde" #: src/netcam.c msgid "Trying to re-connect" msgstr "Prøver Ã¥ koble til igjen" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "netcam camera handler: finish set, exit" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "Ingen svar fra kamerahÃ¥ndterer - den mÃ¥ allerede ha dødd" #: src/netcam.c msgid "called with no data in buffer" msgstr "ringte uten data i buffer" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "Nettverkskamera starter for kamera ( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "Ugyldig nettkamera-proxy ( %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "Brukernavn / passord er ikke tillatt pÃ¥ en proxy-URL" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "Ugyldig nettkamatjeneste ' %s'" #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "Ugyldig nettkamera-url for kamera ( %s)" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "Netcam http-parameter ' %s' konverterer til flagg: HTTP / 1.0: %s HTTP / " "1.1: %s Keep-Lever %s." #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "ringer nÃ¥ netcam setup html ()" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "nÃ¥ ringer netcam setup ftp" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "ringer nÃ¥ oppsettfil for netcam ()" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "ringer nÃ¥ netcam setup mjpg ()" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "Ugyldig netcam -tjeneste '%s' - mÃ¥ være mjpeg, ftp, mjpg eller jpeg." #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "Kunne ikke prøve Ã¥ lese det første bildet - retval: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "libjpeg dekompresjonssvikt pÃ¥ første ramme - Ã¥ gi opp!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "Bredde / høyde ( %dx %d) mÃ¥ være multipler pÃ¥ 8" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "Feil ved start av kamerahandlertrÃ¥den [ %d]" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "recv mislyktes i ftp fÃ¥ mer" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "Serverrespons: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "send mislyktes i ftp send bruker" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "send mislyktes i ftp send passwd" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "sending mislyktes i ftp avslutt" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "gethostbyname mislyktes i ftp-tilkobling" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "gethostbyname adresse mismatch i ftp connect" #: src/netcam_ftp.c msgid "socket failed" msgstr "stikkontakten mislyktes" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "Kunne ikke opprette en forbindelse" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "FTP-server som ber om ACCT pÃ¥ anonym" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "innstille socket-alternativet SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "send mislyktes i ftp fÃ¥ tilkobling" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "Ugyldig svar pÃ¥ PASV" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "Kunne ikke opprette en datatilkobling" #: src/netcam_ftp.c msgid "bind failed" msgstr "bind mislyktes" #: src/netcam_ftp.c msgid "listen failed" msgstr "lytten mislyktes" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "send mislyktes i ftp fÃ¥ socket" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "godta i ftp fÃ¥ stikkontakt" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "mottak mislyktes i ftp-lesing" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "ftp get socket failed" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "Feil ved sending av TYPE I til ftp-server" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "feilformet token Innholdslengde men verdi %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "Innholdslengde %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "Innholdstype %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "Feil ved lesing av bildeoverskrift, streaming-modus (1). Null header." #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "" "Feil ved lesing av bildeoverskrift, streaming-modus (1). Ukjent topptekst ' " "%s'" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "Feil ved lesing av bildeoverskrift (2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "Topptekst ikke JPEG" #: src/netcam_http.c msgid "Content-Length 0" msgstr "Innholdslengde 0" #: src/netcam_http.c msgid "Found image header record" msgstr "Fant bildet overskrift" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "Feil ved sending av \"koble\" -forespørselen" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "Mottatt første overskrift (' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "Feil ved lesing av første topptekst ( %s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "HTTP Resultatkode %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "" "Fjernet netcam Keep-Alive-flagg pÃ¥ grunn av tilsynelatende lukket HTTP-" "forbindelse." #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "Ikke-streaming-kamera (keep-live set)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "Ikke-streaming-kamera (hold deg i live ikke innstilt)" #: src/netcam_http.c msgid "Streaming camera" msgstr "Streaming kamera" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "Grensestreng [ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "Grensestreng ikke funnet i overskriften" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "" "Streaming kamera sannsynligvis bruker MJPG-blokker, kan du vurdere Ã¥ bruke " "mjpg: //nettkamera url." #: src/netcam_http.c msgid "Unrecognized content type" msgstr "Ukjent innholdstype" #: src/netcam_http.c msgid "Content-length present" msgstr "Innholdslengde til stede" #: src/netcam_http.c msgid "Content-length 0" msgstr "Innholdslengde 0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "Fant Conn: close header (' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "" "BÃ¥de 'Connection: Keep-Alive' og 'Connection: close' overskrift mottatt." "Bevegelse fjerner keepalive." #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "" "BÃ¥de 'Connection: Keep-Alive' og 'Connection: close' overskrift mottatt." "Bevegelsen fortsetter uendret." #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "Fikk et Keep-Alive-felt i dette settet med overskrifter." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "Ingen \"Connection: Keep-Alive\" eller \"Connection: close\" overskrift " "mottatt. \n" " Bevegelse fjerner keepalive." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "Ingen \"Connection: Keep-Alive\" eller \"Connection: close\" overskrift " "mottatt. \n" " Bevegelsen fortsetter uendret." #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "Fjernet netcam Keep-Alive-flagget fordi 'Connection: close' overskrift " "mottatt. \n" " Netcam støtter ikke Keep-Alive. Bevegelse fortsetter i ikke-Keep-Alive." #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "Keep-Alive har nÃ¥dd slutten av gyldig periode. \n" " Bevegelse vil lukke netcam og deretter fortsette Keep-Alive med en ny " "stikkontakt." #: src/netcam_http.c msgid "disconnect" msgstr "koble fra" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo () mislyktes ( %s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "koble fra nettkamera (1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "koble fra netcam siden keep-alive ikke er satt." #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "uten keepalive, forsøk pÃ¥ Ã¥ lage socket mislyktes." #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "uten keepalive, ny socket opprettet fd %d" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "med keepalive sett, ugyldig stikkontakt. Dette kan være første gang. " "Opprette enden nye mislyktes." #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "" "med keepalive sett, ugyldig socket. Dette kan være første gang, opprettet en " "nyen med fd %d" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "SÃ… KEEPALIVE er %s" #: src/netcam_http.c msgid "ON" msgstr "PÃ…" #: src/netcam_http.c msgid "OFF" msgstr "AV" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "SÃ… KEEPALIVE sett pÃ¥ stikkontakt." #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "fcntl (1) pÃ¥ stikkontakt" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "fcntl (2) pÃ¥ stikkontakt" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "koble til () mislyktes ( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "frakobling av nettkamera (4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "timeout pÃ¥ koble ()" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "koble fra nettkamera (2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "getockopt etter koble til" #: src/netcam_http.c msgid "connect returned error" msgstr "koble tilbake feil" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "koble fra nettkamera (3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "utvide buffer fra [ %d / %d] til [ %d / %d] byte." #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "Potensiell splittgrense - %d overskylte tegn, %d plassert pÃ¥ nytt" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "recv () mislykkes etter grensestreng" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "forlater nettkamera tilkoblet." #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "i ferd med Ã¥ prøve Ã¥ koble til, tid # %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "Kunne ikke Ã¥pne kameraet - sjekk konfigurasjonen din, og at nettkameraet er " "online" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "Feil ved lesing av første topptekst - prøv pÃ¥ nytt" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "Kunne ikke lese det første kamerahodet - og ga opp for nÃ¥" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "Netcam har flagg: HTTP / 1.0: %s HTTP / 1.1: %s Keep-Alive %s." #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "" "Fjernet netcam keepalive flagg pÃ¥ grunn av proxy-sett. Proxy er inkompatibel " "medHolde i live." #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "Kunne ikke lese første stream-topptekst - gi opp for nÃ¥" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "tilkoblet, fortsetter Ã¥ lese bilde." #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "Les feil, prøver Ã¥ koble til igjen .." #: src/netcam_http.c msgid "lost the cam." msgstr "mistet kammen." #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "Etterfylt buffer med [ %d] byte fra nettverket." #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "Les [ %d / %d] overskriftsbyte." #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "Ugyldig overskrift mottatt, og koble til igjen" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "Les [ %d / %d] delebytes, [ %d / %d] totalt" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "Chunk komplett, buffer brukt [ %d] byte." #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "Bilde komplett, buffer brukt [ %d] byte." #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "tilkoblet, gÃ¥r til Ã¥ lese og avkode MJPG-biter." #: src/netcam_http.c msgid "Begin" msgstr "Begynne" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "stat ( %s) feil" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]! = siste mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "venter pÃ¥ timeout for nytt filbilde" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "forsinkelse av Ã¥ vente pÃ¥ nytt filbilde" #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "behandler nytt filbilde - st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "Ã¥pen ( %s) feil: %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "lese ( %s) feil: %d" #: src/netcam_http.c msgid "End" msgstr "Slutt" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> fil-> bane %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "Ikke nok data fra netcam." #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> jpeg-feil %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "*** ny bilde forsinkelse vellykket ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "jpeg-feil %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "behandler jpeg image - innholdslengde %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "Kamerabredde / høydefeil i forhold til JPEG-bilde - forventet %dx %d, JPEG " "%dx %dgjentakelse %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s: Endret størrelse pÃ¥ pakkearray til %d" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s: av kopipakke: %s, Avbryt: %s" #: src/netcam_rtsp.c msgid "True" msgstr "ekte" #: src/netcam_rtsp.c msgid "False" msgstr "Falsk" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: Ignorerer pakke med ugyldige data" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: Rec frame frame: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "Ignorerer pakken med ugyldige data" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "Feil ved dekoding av pakke: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "%s: Feil ved overføring av HW dekodet til systemminne" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "Feil ved sending av pakke til codec: %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "Feil ved dekoding av videopakke: Kopiering til buffer" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: HW -enheter:" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s (tilgjengelig)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s (ikke implementert)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s: netcam -dekoder %s deaktivert." #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "Kunne ikke hente vaapi pix -format" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "Kunne ikke hente cuda pix -format" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s: Avbrutt." #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: mislyktes" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s: Dekoder %s fungerte ikke." #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "%s: Ignorerer og fjerner brukerens forespurte dekoder %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s: Initialiserer vaapi -dekoder" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: Kan ikke finne vaapi hw -enheten" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s: Initialiserer cuda -dekoder" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: Kan ikke finne cuda hw -enheten" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s: Initialiserer dekoder" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s: Bruker dekoder %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: Dekoder Ã¥pnet" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s: Kameralesing ( %s) gikk ut" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s: Kameraet ( %s) gikk ut" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "Kan ikke tildele swsframe i." #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "Kan ikke tildele swsframe ut." #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "Kan ikke tildele skaleringskontekst." #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "Feil ved bestemmelse av størrelsen pÃ¥ rammen ut" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "Feil ved tildeling av bilde i: %s" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "Feil ved tildeling av bilde: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "Feil ved endring av størrelse / omformatering: %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "Feil ved Ã¥ sette ramme i utgangsbuffer: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s: Avbrutt" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: av leseramme: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: For mange forsøk pÃ¥ Ã¥ hente data fra kameraet %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "%s: fangsthastighet ikke spesifisert i netcam -params. Bruker %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s: fangsthastighet ikke spesifisert i netcam -params. Bruker framerate %d" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "Nettverkskameraet sender bilder pÃ¥ et annet" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "størrelse enn spesifisert i konfigurasjonen og ogsÃ¥ en" #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "ulikt bildeformat. Bildet blir" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "kodet til YUV420P og i den ønskede størrelsen" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "i konfigurasjonsfilen. Endre om mulig netcam til" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "være i YUV420P-format og størrelsen som er forespurt i" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "config for Ã¥ muligens redusere CPU-bruken." #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "størrelse enn spesifisert i konfigurasjonsfilen." #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "Bildet blir kodet inn i størrelsen" #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "forespurt i konfigurasjonen. Endre om mulig" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "nettkamera eller konfigurasjon for Ã¥ indikere samme størrelse" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "for Ã¥ muligens redusere CPU-bruken." #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "Netcam: %dx %d => Konfigurasjon: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "Bildet som sendes blir holdt" #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "trukket til YUV420P. Skift om mulig netcam" #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "bildeformat til YUV420P for muligens Ã¥ redusere CPU-bruken." #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: Innstilling av rtsp/rtmp" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: Angi inngangsformat mjpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: Angi inndataformat video4linux2" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: Konfigurering av filmfil" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s: Konfigurering av %s" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: alternativ: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "Setter opp v4l2 via netcam" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "Setter opp fil via netcam" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "Konfigurerer %s via netcam" #: src/netcam_rtsp.c msgid "highres" msgstr "høy oppløsning" #: src/netcam_rtsp.c msgid "norm" msgstr "norm" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "Setter opp %s strøm." #: src/netcam_rtsp.c msgid "Unknown" msgstr "Ukjent" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "Strømmen er kopiert for gjennomføring" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "Null sti passert for Ã¥ koble til" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s: Kan ikke Ã¥pne kameraet ( %s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s: Ã…pnet kamera ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s: Kan ikke finne strøminfo: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s: Kan ikke Ã¥pne codec-kontekst: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s: Størrelsen pÃ¥ kameraet er ugyldig" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s: Kan ikke tildele ramme." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s: Kunne ikke kopiere strøm for gjennomføring." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s: Kunne ikke lese det første bildet" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s: Kamera ( %s) tilkoblet" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s: fangstfrekvensen for Netcam er %d." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s: Kamerakilden er %d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s: Kan ikke bestemme kamerakilden FPS." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s: fangehastigheten er lavere enn kameraets FPS." #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s: Det vil oppstÃ¥ feil ved dekoding." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "%s: opptakshastighet litt større enn kameraets FPS anbefales." #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s: Koble til igjen med kamera ...." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s: Kameraet koblet ikke til igjen." #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s: Kontroller om kameraet hvert 10. sekund." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s: KamerahandlertrÃ¥den [ %d] startet" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s: HÃ¥ndteringssløyfen er ferdig." #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s: Feil ved start av behandlertrÃ¥den" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s: Venter pÃ¥ første bilde fra behandleren." #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "klarer ikke Ã¥ opprette rtsp-kontekst" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "klarer ikke Ã¥ lage rtsp høy kontekst" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "Ingen FFmpeg -støtte" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s: SlÃ¥ av nettverkskamera." #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s: Ingen respons fra behandlertrÃ¥den." #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "Normal oppløsning: Avslutt komplett." #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "Høy oppløsning: Avslutt komplett." #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "Kan ikke sette EXIF ​​til webpunktsdel" #: src/picture.c msgid "libwebp version error" msgstr "libwebp versjonsfeil" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "libwebp feil for tildeling av bildebuffer" #: src/picture.c msgid "libwebp image compression error" msgstr "libwebp bildekomprimeringsfeil" #: src/picture.c msgid "unable to assemble webp image" msgstr "ikke i stand til Ã¥ sette sammen webbildet" #: src/picture.c msgid "unable to save webp image to file" msgstr "klarer ikke Ã¥ lagre webbildet til filen" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "Kan ikke skrive bilde til fil %s - sjekk tilgangsrettigheter til " "mÃ¥lkatalog \n" "TrÃ¥den kommer til Ã¥ bli ferdig pÃ¥ grunn av denne fatale feilen" #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "Kan ikke skrive bilde til fil %s" #: src/picture.c msgid "Error getting PGM vars." msgstr "Feil ved henting av PGM vars." #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "Dette er ikke en pgm-fil, starter med ' %s'" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "Magisk %s: Bredde %s(%d): Høyde %s(%d): Maksverdi: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "Kunne ikke lese bildedata fra pgm-fil" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "" "Maskefilen som er spesifisert, er ikke i samme størrelse som bildet fra " "kameraet." #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "Forsøker Ã¥ endre størrelse pÃ¥ maskebildet fra %dx %d til %dx %d" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "kan ikke skrive maskefil %s - sjekk tilgangsrettigheter til mÃ¥lkatalog" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "kan ikke skrive maskefil %s" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "Kunne ikke skrive standardmaske som pgm-fil" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "Oppretter tom maske %s \n" "Rediger denne filen og kjør bevegelse pÃ¥ nytt for Ã¥ aktivere maskefunksjonen" #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "Konfigureringsalternativet \"roter \" ikke et multiplum pÃ¥ 90: %d" #: src/track.c msgid "internal error" msgstr "Intern feil" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "intern feil, %hu er ikke en kjent sporetype" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "port %s dev fd %i, motor %hu kommando %hu data %hu" #: src/track.c msgid "Status byte timeout!" msgstr "Statusbyte-timeout!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "Forsøk Ã¥ Ã¥pne seriell enhet %s" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "Kan ikke Ã¥pne seriell enhet %s" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "Kan ikke initialisere seriell enhet %s" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "Ã…pnet seriell enhet %s og initialiser, fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "Ingen enhet %s startet ennÃ¥, prøver stepper center ()" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "kunne ikke initialisere stepper-enheten pÃ¥ %s, fd [ %i]." #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "lykkes, enheten startet %s, fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "SENDER port %s dev fd %i, motor %hu kommando %hu data %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "Kommandoavkastning %d" #: src/track.c msgid "Problem opening servo!" msgstr "Problem med Ã¥ Ã¥pne servo!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d, cent-> y %d, reversex %d, reversey %d manuell %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d verdi utenfor rekkevidde! ( %d - %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d verdi utenfor rekkevidde! ( %d - %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "X forskyvning %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "X cent-> x %d, cent-> y %d, reversex %d, reversey %d motorx %d data %d " "kommando%d" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Y utlignet %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Y cent-> x %d, cent-> y %d, reversex %d, reversey %d motory %d data %d " "kommando%d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "X-offset %d, Y-offset %d, x-stilling %d. y-stilling %d, reversex %d, reversey" "%d, trinnstørrelse %d" #: src/track.c msgid "Return byte timeout!" msgstr "Returner byte-timeout!" #: src/track.c msgid "Unable to set camera speed" msgstr "Kan ikke angi kamerahastighet" #: src/track.c msgid "succeed" msgstr "lykkes" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "Kunne ikke tilbakestille pwc-kameraet til startposisjon! Grunnen til" #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "mislyktes VIDIOCPWCMPTGRANGE" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "Kunne ikke panorere / vippe pwc-kamera! Grunnen til" #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "Kunne ikke tilbakestille UVC-kameraet til startposisjonen! Grunnen til" #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "Tilbakestill UVC-kamera til startposisjon" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl querycontrol" #: src/track.c msgid "Getting camera range" msgstr "FÃ¥ kameraomrÃ¥de" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "INNGANG PARAM ABS pan min %d, pan max %d, tilt min %d, tilt max %d" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "INPUT PARAM ABS X Angel %d, Y Angel %d" #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "For SET ABS flytt X %d, flytt Y %d" #: src/track.c msgid "Failed to move UVC camera!" msgstr "Kunne ikke flytte UVC-kamera!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "Fant MINMAX = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "Før ABS Y Angel: x = %d, Y = %d," #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "Etter ABS Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "For SET REL pan min %d, pan max %d, tilt min %d, tilt max %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "For SET REL sporpanel Angel %d, sporvinkling Angel %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "For SET REL flytt X %d, flytt Y %d" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, kontroll S = %d, Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, kontroll S = %d, Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "Før REL Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "Etter REL Y Angel: x = %d, Y = %d" #: src/translate.c msgid "Language: English" msgstr "SprÃ¥k Engelsk" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "Kunne ikke tildele %llu byte minne!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "" "Advarsel! Funksjon %s prøver Ã¥ endre størrelse pÃ¥ minneblokk ved %p til 0 " "byte!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "Kunne ikke endre størrelse pÃ¥ minneblokk ved forskyvning %p til %llu byte " "(funksjon %s)!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "Problem med Ã¥ lage katalog %s" #: src/util.c #, c-format msgid "creating directory %s" msgstr "opprette katalog %s" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "Feil ved Ã¥pning av fil %s med modus %s" #: src/util.c msgid "Error closing file" msgstr "Feil ved lukking av fil" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbeventid} støttes ikke. Bruk eventtid." #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "ugyldig format spesifiser nøkkelord %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "Kan ikke angi trÃ¥denavn %s" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "FFMPEG-versjonen er for gammel. Deaktiverer gjennomgangsbehandling." #: src/util.c msgid "pass-through enabled." msgstr "pass-through aktivert." #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "Feil ved innstilling av parm>%s <" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "Parset:>%s <>%s <" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "Parsed:> redacted <> redacted <" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "Feil ved analyse av parm nm -kontroller: %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "Feil ved analyse av parm vl -kontroller: %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "Feil ved innstilling av temperatur: %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "Feil ved ny kontroll av kontroller: %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "Analyse: %s" #: src/util.c msgid "Parsing: " msgstr "Parsing: " #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "Feil ved analysering av kontroller: %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "Feil: %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "Nye netcam -params: %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "Nye netcam high params: %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "Nye videoparameter: %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "Nye webkontrolloverskrifter: %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "Nye webkontrolloverskriftsparametre: " #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "Nye strømoverskriftsparametre: %s" #: src/util.c msgid "New stream_header_params: " msgstr "Nye stream header params: " #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "Programmeringsfeil. Ukjent konfigurasjonselement: %s " #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE Feilinnstilling fargetone [ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "til [ %d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE Feil ved Ã¥ fÃ¥ fargetone" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT Feil ved innstilling av metning [ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT Feil ved metning" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT Feilinnstilling av kontrast [ %d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT Feil ved Ã¥ fÃ¥ kontrast" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "METEORSBRIG lysstyrke [ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIG fÃ¥r lysstyrke" #: src/video_bktr.c msgid "Not implemented" msgstr "Ikke implementert" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "Enhetsinngang %d utenfor rekkevidde (0-4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d ugyldig -Prøve sammensatt %d" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "BT848SFMT, Kunne ikke angi inndataformatet, prøv igjen med standard" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "BT848SFMT, Kunne ikke sette inndataformatet verken som standard" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "Kunne ikke angi geometrien" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "til [ %d / %d] Norm %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "Ikke gyldig Frekvens [%ld] for kildeinngang [%i]" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "Frekvens [%ld] Kildeinngang [%i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "angi inndata [ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "angi inndataformat [ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "angi geometri [ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "Frekvenssett (ikke implementert ennÃ¥" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "Størrelse pÃ¥ buffer til 3x" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "Dimensjonering av buffer til 3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap mislyktes" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "METEORCAPTUR bruker enkeltmetode Feilfangst" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "Feil under fangst ved bruk av en enkelt metode" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "Kan ikke finne videoenhet" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "Lukker videoenhet %s" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "Fortsatt %d brukere av videoenhet %s, sÃ¥ vi lukker den ikke nÃ¥" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "config bildebredde ( %d) er ikke modulo 8" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "config image høyde ( %d) er ikke modulo 8" #: src/video_bktr.c msgid "Stopping capture" msgstr "Stopper fangst" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "" "Gjenbruk av [ %s] innganger [ %d, %d] Endre fangstmetode METEOR CAP SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "VIDEO PALETTE YUV420P innstilling imgs.size norm og imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "Ã¥pen videoenhet %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "Ã¥pen tunerenhet %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "Korrupt bilde ... fortsett" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "SOI-posisjon justert med %d byte." #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "ringer mmalcam opprydding" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "ringer netcam opprydding" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "ringer netcam rtsp opprydding" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "Rensing av V4L2-enhet" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "Rensing av BKTR-enhet" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "Ingen opprydding av kameraenhet (MMAL, Netcam, V4L2, BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "Ã…pner MMAL-cam" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "MMAL-cam kunne ikke Ã¥pnes" #: src/video_common.c msgid "Opening Netcam" msgstr "Ã…pner Netcam" #: src/video_common.c msgid "Netcam failed to open" msgstr "Netcam kunne ikke Ã¥pne" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Ã…pning Netcam RTSP" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Netcam RTSP kunne ikke Ã¥pnes" #: src/video_common.c msgid "Opening V4L2 device" msgstr "Ã…pner V4L2-enhet" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "V4L2-enheten kunne ikke Ã¥pnes" #: src/video_common.c msgid "Opening BKTR device" msgstr "Ã…pning av BKTR-enhet" #: src/video_common.c msgid "BKTR device failed to open" msgstr "BKTR-enheten kunne ikke Ã¥pnes" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "Ingen kameraenhet spesifisert (MMAL, Netcam, V4L2, BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "Kunne ikke Ã¥pne ' %s'" #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "Feil ved spesifisering av buffer: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "Ã…pningsbuffer: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "Les buffer: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "fant videoenheten ' %s' %d" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "Ã…pnet %s som rørutgang" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "Ã…pning av %s da rørutgangen mislyktes" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "Originale rørspesifikasjoner" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "ForeslÃ¥tte rørspesifikasjoner" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "Endelig rørspesifikasjoner" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "Ingen kontroller funnet for enheten" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "--------- Controls ---------" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr "V4L2 ID Navn og rekkevidde" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "Feil ved tilbakestilling av brukerverdi" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "Forlater kontroll %s \"%s\" satt til %d" #: src/video_v4l2.c msgid "Device not ready" msgstr "Enheten er ikke klar" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "Sett kontroll \" %s \" til verdi %d" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "innstilling av kontroll %s \"%s\" til %d mislyktes." #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "%s kontrollalternativverdi %s er under minimum. Bruk minimum %d " #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "%s kontrollalternativverdi %s er over maksimum. Bruker maksimal %d " #: src/video_v4l2.c msgid "control type not supported yet" msgstr "kontrolltype støttes ikke ennÃ¥" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "Kan ikke spørre om inndata %d. VIDIOC ENUMINPUT, hvis du bruker en WEBCAM " "endre inngangverdi i konf. med -1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "Navn = \" %s \", skriv 0x %08X, status %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "Navn = \" %s \", - TUNER" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "Navn = \" %s \" - KAMERA" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "Feil ved valg av inngang %d VIDIOC S INPUT" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "Enheten støtter ikke spesifisering av PAL / NTSC-norm" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "- videostandard %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "Feil ved valg av standardmetode %d VIDIOC S STD" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "Videostandard satt til NTSC" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "Videostandard satt til SECAM" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "Videostandard satt til PAL" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "tuner %d VIDIOC G TUNER" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "Still inn tuner %d" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "freq %ul VIDIOC S FREQUENCY" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "Sett frekvens til %ul" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "Kan ikke bruke %c%c%c%c (%dx%d)" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "Testpalett %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "Kontrollerer bildestørrelse %dx%d med steg %d" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "Ingen skrittverdi oppgitt fra enheten." #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "Bredde(%d) mÃ¥ være mindre enn skritt(%d)" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "Bildebredden (%d) er ikke multiplum av skrittet (%d)" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "Umulig tilstand: Bredde(%d), Skritt(%d), Per skritt(%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "Bildebredden vil være polstret %d byte" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "Justere oppløsningen fra %ix %i til %ix %i." #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "Justert oppløsning ikke modulo 8." #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "Spesifiser annen palett eller bredde / høyde i konfigurasjonsfilen." #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "Feil ved innstilling av pikselformat." #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "Bruker palett %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "Justering til bredde ( %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "Justering til høyde ( %d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "Konfigurasjonspalettindeks %d ( %s) for %dx %d fungerer ikke." #: src/video_v4l2.c msgid "Supported palettes:" msgstr "Støttede paletter:" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d - %s (komprimert: %d) ( %# x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "Valgt palett %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "Valg av palett mislyktes for format %s" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "Kan ikke finne et kompatibelt palettformat." #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "Feil ved forespørsel om buffere %d for minnekart. VIDIOC REQBUFS" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "mmap informasjon: rammer = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "Utilstrekkelig bufferminne %d %s< >%s< >%s<" msgstr "Ugyldig handling forespurt:> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "ModersmÃ¥l: pÃ¥" #: src/webu.c msgid "Native Language : off" msgstr "MorsmÃ¥l: av" #: src/webu.c msgid "Set the value to null/zero" msgstr "Sett verdien til null / null" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "Ignorerer tilkobling fra: %s" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "Kunne ikke godkjenne fra %s" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "Ingen bruker av nettkontroll: pass gitt" #: src/webu.c msgid "No stream user:pass provided" msgstr "Ingen strømbruker: pass gitt" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "Ugyldig svar" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "Feil under tilføyelse av webkontrolloverskrift %s %s" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "Feil under tilføyelse av strømtekst %s %s" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "Ugyldig metode forespurt: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "Tilkobling fra: %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "sendes side mislyktes %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "Stream -bildet er ikke klart ennÃ¥" #: src/webu.c msgid "Stream process requested to finish." msgstr "Stream -prosessen ble bedt om Ã¥ fullføre." #: src/webu.c msgid "Send page failed." msgstr "Sendesiden mislyktes." #: src/webu.c msgid "Basic authentication: available" msgstr "Grunnleggende autentisering: tilgjengelig" #: src/webu.c msgid "Basic authentication: disabled" msgstr "Grunnleggende autentisering: deaktivert" #: src/webu.c msgid "Digest authentication: available" msgstr "Digest autentisering: tilgjengelig" #: src/webu.c msgid "Digest authentication: disabled" msgstr "Digest autentisering: deaktivert" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd libary for gammel ipv6 deaktivert" #: src/webu.c msgid "IPV6: available" msgstr "IPV6: tilgjengelig" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6: deaktivert" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd libary for gammel SSL / TLS deaktivert" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS: tilgjengelig" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS: deaktivert" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "Feil under lesing av fil for SSL / TLS-støtte." #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "SSL / TLS forespurt, men ingen certifikatfil gitt. SSL / TLS deaktivert" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "SSL / TLS forespurt, men ingen nøkkelfil gitt. SSL / TLS deaktivert" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "Starter nettkontroll pÃ¥ port %d" #: src/webu.c msgid "Unable to start MHD" msgstr "Kan ikke starte MHD" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "Startet nettkontroll pÃ¥ port %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "Startet kamera %d strøm pÃ¥ port / kamera-ID %d / %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "Startet kamera %d strøm pÃ¥ port %d" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "Starte alle kamerastrømmer pÃ¥ port %d" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "Starter kamera %d strøm pÃ¥ port %d" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "Kan ikke starte strømmen for kamera %d" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "Duplisert port forespurt %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "Ugyldig webkontrolllÃ¥s maks. IPS. Innstilling lik 25. " #: src/webu_html.c msgid "Cameras" msgstr "Kameraer" #: src/webu_html.c msgid "Camera" msgstr "Kamera" #: src/webu_html.c msgid "All" msgstr "Alle" #: src/webu_html.c msgid "Action" msgstr "Handling" #: src/webu_html.c msgid "Start Event" msgstr "Start begivenhet" #: src/webu_html.c msgid "End Event" msgstr "Sluttbegivenhet" #: src/webu_html.c msgid "Snapshot" msgstr "Stillbilde" #: src/webu_html.c msgid "Change Configuration" msgstr "Endre konfigurasjon" #: src/webu_html.c msgid "Write Configuration" msgstr "Skriv konfigurasjon" #: src/webu_html.c msgid "Tracking" msgstr "Sporing" #: src/webu_html.c msgid "Pause" msgstr "Pause" #: src/webu_html.c msgid "Start" msgstr "Start" #: src/webu_html.c msgid "Restart" msgstr "Omstart" #: src/webu_html.c msgid "Quit" msgstr "Slutte" #: src/webu_html.c msgid "Help" msgstr "Hjelp" #: src/webu_html.c msgid "No Configuration Options" msgstr "Ingen konfigurasjons alternativer" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "Begrensede konfigurasjons alternativer" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "Avanserte konfigurasjon alternativer" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "Konfidensielle konfigurasjons alternativer" #: src/webu_html.c msgid "All Cameras" msgstr "Alle kameraer" #: src/webu_html.c msgid "Not running" msgstr "Ikke aktiv" #: src/webu_html.c msgid "Lost connection" msgstr "Mistet tilkobling" #: src/webu_html.c msgid "Paused" msgstr "Pauset" #: src/webu_html.c msgid "Active" msgstr "Aktiv" #: src/webu_html.c msgid "Select option" msgstr "Velg alternativ" #: src/webu_html.c msgid "Save" msgstr "Lagre" #: src/webu_html.c msgid "Pan/Tilt" msgstr "Svivel / Tilt" #: src/webu_html.c msgid "Absolute Change" msgstr "Absolutt Endring" #: src/webu_html.c msgid "Center" msgstr "Senter" #: src/webu_html.c msgid "Pan" msgstr "Svivel" #: src/webu_html.c msgid "Tilt" msgstr "Tilt" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "Ugyldig trÃ¥d spesifisert: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "Ugyldig URL for en kameraspesifikk port: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "URL for trÃ¥d 0 er ikke gyldig nÃ¥r du bruker kameraspesifikke filer: %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "DÃ¥rlig URL for en kameraspesifikk port: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "Kunne ikke fÃ¥ bilde til Ã¥ strømme." #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "Alternativet '%s' avskrives. Navnet pÃ¥ det nye alternativet er '%s' " motion-release-4.6.0/po/pt.po000066400000000000000000003305571452402535500160670ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:36-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "%s após a versão %s" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "Opção de configuração desconhecida \" %s \"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "Escrevendo arquivo de configuração para %s" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "Arquivo de configuração %s não encontrado - tentando padrões." #: src/conf.c msgid "Error getcwd" msgstr "Erro getcwd" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "não foi possível abrir o arquivo de configuração %s" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "Nome de arquivo inválido %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "Processando o encadeamento 0 - arquivo de configuração %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "Nenhum arquivo de configuração para processar, usando valores padrão" #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "Gravando parâmetros de configuração de todos os arquivos ( %d):" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "Thread %d - arquivo de configuração: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s " #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "Processando o arquivo de configuração %s" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "Configuração do diretório da câmera %s não encontrada" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "Arquivo de configuração da câmera %s não encontrado" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "Processando o arquivo de configuração da câmera %s" #: src/conf.c msgid "daemon" msgstr "daemon" #: src/conf.c msgid "setup_mode" msgstr "modo de configuração" #: src/conf.c msgid "pid_file" msgstr "arquivo pid" #: src/conf.c msgid "log_file" msgstr "arquivo de log" #: src/conf.c msgid "log_level" msgstr "nível de log" #: src/conf.c msgid "log_type" msgstr "tipo de log" #: src/conf.c msgid "quiet" msgstr "quieto" #: src/conf.c msgid "watchdog_tmo" msgstr "cão de guarda tmo" #: src/conf.c msgid "watchdog_kill" msgstr "cão de guarda matança" #: src/conf.c msgid "native_language" msgstr "língua nativa" #: src/conf.c msgid "camera_name" msgstr "nome da câmera" #: src/conf.c msgid "camera_id" msgstr "ID da câmera" #: src/conf.c msgid "target_dir" msgstr "dir de destino" #: src/conf.c msgid "video_device" msgstr "dispositivo de vídeo" #: src/conf.c msgid "video_params" msgstr "params de vídeo" #: src/conf.c msgid "auto_brightness" msgstr "Brilho automático" #: src/conf.c msgid "tuner_device" msgstr "dispositivo sintonizador" #: src/conf.c msgid "roundrobin_frames" msgstr "armações roundrobin" #: src/conf.c msgid "roundrobin_skip" msgstr "roundrobin skip" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "roundrobin switchfilter" #: src/conf.c msgid "netcam_url" msgstr "URL da webcam" #: src/conf.c msgid "netcam_params" msgstr "netcam params" #: src/conf.c msgid "netcam_high_url" msgstr "url alto da netcam" #: src/conf.c msgid "netcam_high_params" msgstr "netcam high params" #: src/conf.c msgid "netcam_userpass" msgstr "netcam userpass" #: src/conf.c msgid "mmalcam_name" msgstr "nome da mmalcam" #: src/conf.c msgid "mmalcam_params" msgstr "mmalcam params" #: src/conf.c msgid "width" msgstr "largura" #: src/conf.c msgid "height" msgstr "altura" #: src/conf.c msgid "framerate" msgstr "taxa de quadros" #: src/conf.c msgid "minimum_frame_time" msgstr "tempo mínimo de quadro" #: src/conf.c msgid "rotate" msgstr "rodar" #: src/conf.c msgid "flip_axis" msgstr "eixo de rotação" #: src/conf.c msgid "locate_motion_mode" msgstr "localize o modo de movimento" #: src/conf.c msgid "locate_motion_style" msgstr "localizar estilo de movimento" #: src/conf.c msgid "text_left" msgstr "texto deixado" #: src/conf.c msgid "text_right" msgstr "texto certo" #: src/conf.c msgid "text_changes" msgstr "alterações de texto" #: src/conf.c msgid "text_scale" msgstr "escala de texto" #: src/conf.c msgid "text_event" msgstr "evento de texto" #: src/conf.c msgid "emulate_motion" msgstr "emular movimento" #: src/conf.c msgid "pause" msgstr "pausa" #: src/conf.c msgid "threshold" msgstr "limite" #: src/conf.c msgid "threshold_maximum" msgstr "limite máximo" #: src/conf.c msgid "threshold_tune" msgstr "sintonia limiar" #: src/conf.c msgid "noise_level" msgstr "nível de ruído" #: src/conf.c msgid "noise_tune" msgstr "sintonia de ruído" #: src/conf.c msgid "despeckle_filter" msgstr "filtro de remoção de manchas" #: src/conf.c msgid "area_detect" msgstr "área detectar" #: src/conf.c msgid "mask_file" msgstr "arquivo de máscara" #: src/conf.c msgid "mask_privacy" msgstr "mascarar privacidade" #: src/conf.c msgid "smart_mask_speed" msgstr "velocidade da máscara inteligente" #: src/conf.c msgid "lightswitch_percent" msgstr "por cento do interruptor de luz" #: src/conf.c msgid "lightswitch_frames" msgstr "quadros do interruptor de luzes" #: src/conf.c msgid "minimum_motion_frames" msgstr "quadros mínimos de movimento" #: src/conf.c msgid "event_gap" msgstr "lacuna de evento" #: src/conf.c msgid "pre_capture" msgstr "pré captura" #: src/conf.c msgid "post_capture" msgstr "pós captura" #: src/conf.c msgid "on_event_start" msgstr "no início do evento" #: src/conf.c msgid "on_event_end" msgstr "no final do evento" #: src/conf.c msgid "on_picture_save" msgstr "na imagem salvar" #: src/conf.c msgid "on_area_detected" msgstr "na área detectada" #: src/conf.c msgid "on_motion_detected" msgstr "em movimento detectado" #: src/conf.c msgid "on_movie_start" msgstr "no início do filme" #: src/conf.c msgid "on_movie_end" msgstr "no final do filme" #: src/conf.c msgid "on_camera_lost" msgstr "na câmera perdida" #: src/conf.c msgid "on_camera_found" msgstr "na câmera encontrada" #: src/conf.c msgid "picture_output" msgstr "saída de imagem" #: src/conf.c msgid "picture_output_motion" msgstr "movimento de saída de imagem" #: src/conf.c msgid "picture_type" msgstr "tipo de imagem" #: src/conf.c msgid "picture_quality" msgstr "qualidade da foto" #: src/conf.c msgid "picture_exif" msgstr "imagem exif" #: src/conf.c msgid "picture_filename" msgstr "nome do arquivo da imagem" #: src/conf.c msgid "snapshot_interval" msgstr "intervalo de captura instantânea" #: src/conf.c msgid "snapshot_filename" msgstr "nome do arquivo de instantâneo" #: src/conf.c msgid "movie_output" msgstr "saída de filme" #: src/conf.c msgid "movie_output_motion" msgstr "movimento de saída de filme" #: src/conf.c msgid "movie_max_time" msgstr "tempo máximo do filme" #: src/conf.c msgid "movie_bps" msgstr "filme bps" #: src/conf.c msgid "movie_quality" msgstr "qualidade de filme" #: src/conf.c msgid "movie_codec" msgstr "codec de filme" #: src/conf.c msgid "movie_duplicate_frames" msgstr "quadros duplicados de filmes" #: src/conf.c msgid "movie_passthrough" msgstr "passagem do filme" #: src/conf.c msgid "movie_filename" msgstr "nome do arquivo do filme" #: src/conf.c msgid "movie_extpipe_use" msgstr "uso de extpipe de filme" #: src/conf.c msgid "movie_extpipe" msgstr "extpipe do filme" #: src/conf.c msgid "timelapse_interval" msgstr "intervalo de intervalo de tempo" #: src/conf.c msgid "timelapse_mode" msgstr "modo timelapse" #: src/conf.c msgid "timelapse_fps" msgstr "timelapse fps" #: src/conf.c msgid "timelapse_codec" msgstr "timelapse codec" #: src/conf.c msgid "timelapse_filename" msgstr "nome do arquivo timelapse" #: src/conf.c msgid "video_pipe" msgstr "tubo de vídeo" #: src/conf.c msgid "video_pipe_motion" msgstr "movimento de tubo de vídeo" #: src/conf.c msgid "webcontrol_port" msgstr "porta de controle da web" #: src/conf.c msgid "webcontrol_ipv6" msgstr "webcontrol ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "webcontrol localhost" #: src/conf.c msgid "webcontrol_parms" msgstr "webcontrol parms" #: src/conf.c msgid "webcontrol_interface" msgstr "interface webcontrol" #: src/conf.c msgid "webcontrol_auth_method" msgstr "método de autenticação webcontrol" #: src/conf.c msgid "webcontrol_authentication" msgstr "autenticação de controle da web" #: src/conf.c msgid "webcontrol_tls" msgstr "webcontrol tls" #: src/conf.c msgid "webcontrol_cert" msgstr "certificado webcontrol" #: src/conf.c msgid "webcontrol_key" msgstr "chave de controle da web" #: src/conf.c msgid "webcontrol_header_params" msgstr "parâmetros de cabeçalho do webcontrol" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "minutos de bloqueio do webcontrol" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "tentativas de bloqueio do webcontrol" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "webcontrol lock max ips" #: src/conf.c msgid "stream_port" msgstr "porta de fluxo" #: src/conf.c msgid "stream_localhost" msgstr "transmitir localhost" #: src/conf.c msgid "stream_auth_method" msgstr "método de autenticação de fluxo" #: src/conf.c msgid "stream_authentication" msgstr "autenticação de fluxo" #: src/conf.c msgid "stream_tls" msgstr "stream tls" #: src/conf.c msgid "stream_header_params" msgstr "parâmetros de cabeçalho de fluxo" #: src/conf.c msgid "stream_preview_scale" msgstr "escala de visualização de stream" #: src/conf.c msgid "stream_preview_newline" msgstr "nova linha de visualização de stream" #: src/conf.c msgid "stream_preview_method" msgstr "método de visualização do fluxo" #: src/conf.c msgid "stream_quality" msgstr "qualidade do fluxo" #: src/conf.c msgid "stream_grey" msgstr "fluxo cinza" #: src/conf.c msgid "stream_motion" msgstr "movimento de fluxo" #: src/conf.c msgid "stream_maxrate" msgstr "maxrate do fluxo" #: src/conf.c msgid "stream_limit" msgstr "limite de fluxo" #: src/conf.c msgid "database_type" msgstr "tipo de banco de dados" #: src/conf.c msgid "database_dbname" msgstr "nome do banco de dados db" #: src/conf.c msgid "database_host" msgstr "host do banco de dados" #: src/conf.c msgid "database_port" msgstr "porta do banco de dados" #: src/conf.c msgid "database_user" msgstr "usuário do banco de dados" #: src/conf.c msgid "database_password" msgstr "senha do banco de dados" #: src/conf.c msgid "database_busy_timeout" msgstr "tempo limite ocupado do banco de dados" #: src/conf.c msgid "sql_log_picture" msgstr "imagem de log sql" #: src/conf.c msgid "sql_log_snapshot" msgstr "instantâneo de log sql" #: src/conf.c msgid "sql_log_movie" msgstr "filme de log sql" #: src/conf.c msgid "sql_log_timelapse" msgstr "timelapse de log sql" #: src/conf.c msgid "sql_query_start" msgstr "início da consulta sql" #: src/conf.c msgid "sql_query_stop" msgstr "parada de consulta sql" #: src/conf.c msgid "sql_query" msgstr "consulta sql" #: src/conf.c msgid "track_type" msgstr "tipo de faixa" #: src/conf.c msgid "track_auto" msgstr "faixa auto" #: src/conf.c msgid "track_port" msgstr "porta da trilha" #: src/conf.c msgid "track_motorx" msgstr "motorx da trilha" #: src/conf.c msgid "track_motorx_reverse" msgstr "rastrear motorx reverso" #: src/conf.c msgid "track_motory" msgstr "pista motory" #: src/conf.c msgid "track_motory_reverse" msgstr "faixa motory reversa" #: src/conf.c msgid "track_maxx" msgstr "maxx da trilha" #: src/conf.c msgid "track_minx" msgstr "rastrear sirigaita" #: src/conf.c msgid "track_maxy" msgstr "faixa maxy" #: src/conf.c msgid "track_miny" msgstr "rastrear miny" #: src/conf.c msgid "track_homex" msgstr "rastrear homex" #: src/conf.c msgid "track_homey" msgstr "rastrear caseiro" #: src/conf.c msgid "track_iomojo_id" msgstr "rastrear ID do iomojo" #: src/conf.c msgid "track_step_angle_x" msgstr "ângulo do passo da trilha x" #: src/conf.c msgid "track_step_angle_y" msgstr "faixa passo ângulo y" #: src/conf.c msgid "track_move_wait" msgstr "acompanhar movimento esperar" #: src/conf.c msgid "track_speed" msgstr "velocidade da trilha" #: src/conf.c msgid "track_stepsize" msgstr "acompanhar o tamanho da etapa" #: src/conf.c msgid "track_generic_move" msgstr "rastrear movimento genérico" #: src/conf.c msgid "camera" msgstr "Câmera" #: src/conf.c msgid "camera_dir" msgstr "dir da câmera" #: src/dbse.c msgid "Closing MySQL library" msgstr "Fechando biblioteca MySQL" #: src/dbse.c msgid "Closing MariaDB library" msgstr "Fechando biblioteca MariaDB" #: src/dbse.c msgid "Database closed" msgstr "Banco de dados fechado" #: src/dbse.c msgid "Initializing database" msgstr "Inicializando banco de dados" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "" "Não é possível conectar ao banco de dados MySQL %s no host %s com o usuário " "%s" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "Erro no MySQL foi %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "" "Não é possível conectar ao banco de dados MariaDB %s no host %s com o " "usuário %s" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "O erro MariaDB era %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "Abrindo o banco de dados %s" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "Não é possível abrir o banco de dados SQLite3 %s. Erro %d: %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "Configurando o tempo limite de ocupado para %d ms" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "Falha na configuração do tempo limite ocupado. Erro %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "Falha na conexão com o banco de dados PostgreSQL ' %s': %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "Tipo de banco de dados %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "Executando consulta MySQL" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "A consulta MySQL falhou %s código de erro %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "" "Não é possível reconectar-se ao banco de dados MySQL %s no host %s com o " "erro %s MySQL do usuáriofoi %s" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "Reconexão com o banco de dados MySQL ' %s' bem-sucedida" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "após a reconexão com a consulta MySQL falhou %s código de erro %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "Executando consulta MariaDB" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "A consulta MariaDB falhou %s código de erro %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "Não é possível reconectar ao banco de dados MariaDB %s no host %s com o " "usuário %s MariaDBo erro foi %s" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "Reconexão ao banco de dados MariaDB ' %s' com êxito" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "após a reconexão MariaDB, a consulta falhou %s código de erro %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "Reconectado ao banco de dados PostgreSQL ' %s'" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "Executando consulta PostgreSQL" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "Tentando reconectar ao banco de dados PostgreSQL ' %s': %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "Falha na consulta PGSQL: [%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "Executando %s" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "Erro SQLite3 %d: %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "Ignorando consulta sql vazia" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "Não foi possível iniciar o comando externo ' %s'" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "Executando comando externo ' %s'" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "Gravando imagem no arquivo: %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "Gravando filme em arquivo: %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "Imagem salva no arquivo: %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "Filme salvo no arquivo: %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "Falha ao colocar a imagem no canal de vídeo" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "Não foi possível criar o link simbólico [ %s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "Erro ao criar o nome do canal de visualização %d %s" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "Erro ao criar o nome do arquivo base %d %s" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "Erro ao criar o nome de visualização %d %s" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "ENCERRAMENTO: arquivo extpipe desc %d, estado de erro %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "retorno de fechamento: %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "FPS de origem %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "caminho do filme: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "sem acesso de gravação ao diretório de destino %s" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "caminho não encontrado, tentando criá-lo %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "caminho de acesso ao erro %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "Erro ao especificar a linha de comando: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "tubos %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt-> moviefps: %d" #: src/event.c msgid "popen failed" msgstr "o popen falhou" #: src/event.c msgid "Using extpipe" msgstr "Usando extpipe" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "Erro ao gravar no canal, erro de estado %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "canal %s ainda não criado ou fechado" #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "O contêiner ogg não é mais suportado. Alterando para mpeg4" #: src/event.c msgid "Running test of the various output formats." msgstr "Teste de execução dos vários formatos de saída." #: src/event.c msgid "Error opening context for movie output." msgstr "Erro ao abrir o contexto para a saída do filme." #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffopen erro aberto ao criar arquivo (movimento) [ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "" "O contêiner swf para timelapse não é mais suportado. Usando o contêiner mpg." #: src/event.c msgid "Timelapse using mpg codec." msgstr "Timelapse usando o codec mpg." #: src/event.c msgid "Events will be appended to file" msgstr "Os eventos serão anexados ao arquivo" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "Timelapse usando o codec mpeg4." #: src/event.c msgid "Events will be trigger new files" msgstr "Eventos serão acionados novos arquivos" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffopen erro aberto ao criar arquivo (timelapse) [ %s]" #: src/event.c msgid "Error encoding image" msgstr "Erro ao codificar a imagem" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "Falha ao alocar memória para o nome do codec" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "A taxa de quadros especificada é muito alta para o tipo de filme ffmpeg " "especificado.Escolha um contêiner ffmpeg diferente ou uma taxa de quadros " "inferior." #: src/ffmpeg.c msgid "Error setting base file name" msgstr "Erro ao definir o nome do arquivo base" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "Erro ao definir o acréscimo de timelapse para o codec %s" #: src/ffmpeg.c msgid "Error setting file name" msgstr "Erro ao definir o nome do arquivo" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "o valor da opção de codec %s não é suportado" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "Não foi possível obter o codec" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "Erro ao enviar quadro para codificação: %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "O pacote de recebimento jogou EAGAIN retornando o código -2: %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "Erro ao receber o pacote de vídeo codificado: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "Erro ao codificar o vídeo: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "Erro ao codificar o vídeo" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "" "PTS % Base PTS % intervalo de ms % base de tempo %d- " "%d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "MAU MOMENTO!! Quadro ignorado." #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "" "PTS % básico PTS % intervalo de ms % base de tempo " "%d- %d Alteração%d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s codec vbr / crf / taxa de bits: %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "O codec %s preferido foi colocado na lista negra: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "Codec %s não encontrado" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "Usando o codec %s" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "Não foi possível alocar o fluxo" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "Falha ao alocar codec!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "Fps baixo. Codificando %d quadros em um contêiner de %d quadros." #: src/ffmpeg.c msgid "Unable to set quality" msgstr "Não foi possível definir a qualidade" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "FPS reportado suportado %d / %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "Não foi possível abrir o codec %s" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "Falha ao copiar os parâmetros do decodificador !: %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "não foi possível alocar quadro" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "não foi possível alocar buffers %s" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "erro ao abrir o arquivo %s" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "Permissão negada. %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "Erro ao abrir o arquivo %s" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "Não foi possível gravar o cabeçalho ffmpeg %s" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "Erro ao entrar no modo de drenagem: %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "Erro ao drenar o codec: %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "Erro ao gravar o quadro de vídeo de drenagem" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "Erro ao codificar imagem" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "Erro ao gravar o quadro de vídeo" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet: %s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "Erro ao gravar o quadro de vídeo: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "Contexto RTSP não disponível." #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "câmera rtsp não está pronta para passagem." #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "modo de passagem ativado. Mudando para o contêiner MP4." #: src/ffmpeg.c msgid "Could not get codec!" msgstr "Não foi possível obter o codec!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "Não foi possível copiar os parâmetros do codec" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "Passagem desativada. ffmpeg muito velho" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "Fluxo de passagem aberto" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "ffmpeg versão libavcodec %d. %d. %d versão libavformat %d. %d. %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "O registro do lockmgr av falhou ( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "Nenhuma funcionalidade ffmpeg incluída" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "A restauração do registro do lockmgr av falhou na limpeza" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "Não foi possível alocar o contexto de saída" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "Não foi possível configurar o passthru!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "Não foi possível definir o fluxo" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "Erro ao liberar codec" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "Tentativas excessivas de limpar pacote em buffer" #: src/ffmpeg.c msgid "Buffered packet" msgstr "Pacote com buffer" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s: dado que o buffer jpeg era muito pequeno" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "Dimensões de imagem JPEG inválidas" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "Tamanho da imagem JPEG %dx %d, JPEG era %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "Evento inesperado de retorno de chamada de controle da câmera, 0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "" "Uma alta taxa de quadros pode causar problemas com a exposição de imagens" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "" "Se a exposição automática não estiver funcionando, tente uma taxa de quadros " "menor." #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "Falha ao criar o componente da câmera MMAL %s" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "A câmera MMAL %s não possui portas de saída" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "Não foi possível ativar a porta de controle: erro %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "A instalação sem preenchimento do MMAL falhou" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "não foi possível definir o formato de vídeo da câmera" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "o componente da câmera não pôde ser ativado" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "Componente de câmera MMAL criado" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "Falha na criação do buffer pool da câmera MMAL" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "Falha na criação da fila do buffer da câmera MMAL" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "Não foi possível obter um buffer necessário %d da fila do pool" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "Não foi possível enviar um buffer para a porta ( %d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "" "MMAL Thread da câmera iniciando ... para a câmera ( %s) de %dx %d a %d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "não foi possível alocar parâmetros da câmera" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "Ativação da porta de captura da câmera MMAL" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "O início da captura da câmera MMAL falhou" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "Limpeza da câmera MMAL" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %d sinaliza %08x tamanho %d / %d em %08x, tamanho img = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "Não foi possível retornar um buffer à porta de vídeo da câmera" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "Redimensionando o buffer de pré-captura para %d itens" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "Arquivo de identificação do processo removido (arquivo pid)." #: src/motion.c msgid "Error removing pid file" msgstr "Erro ao remover o arquivo pid" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "Arquivo de log de fechamento ( %s)." #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "Movimento detectado - evento inicial %d." #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "Adicionado %d quadros de preenchimento no filme" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "" "Não foi possível determinar o tipo de câmera (MMAL, Netcam, V4L2, BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "Abrindo arquivo de máscara de privacidade" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "Abrindo arquivo de máscara de privacidade de alta resolução" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "Erro ao abrir o arquivo de máscara %s" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "Falha ao ler a imagem de privacidade da máscara. Recurso de privacidade de " "máscara desativado." #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "Mascarar o arquivo de privacidade \" %s \" carregado." #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "Escala de texto inválida. Ajustado para %d" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "Câmera %d iniciada: detecção de movimento %s" #: src/motion.c msgid "Disabled" msgstr "Desativado" #: src/motion.c msgid "Enabled" msgstr "ativado" #: src/motion.c msgid "Pass-through processing disabled." msgstr "Processamento de passagem desativado." #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "Dimensões de configuração inválidas %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "Usando dimensões padrão %dx %d" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "A largura da imagem ( %d) solicitada não é o módulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "Ajustando a largura para o próximo múltiplo mais alto de 8 ( %d)." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "A altura da imagem ( %d) solicitada não é módulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "Ajustando a altura para o próximo múltiplo mais alto de 8 ( %d)." #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "Não foi possível buscar a imagem inicial da câmera" #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "" "O movimento continua usando largura e altura do (s) arquivo (s) de " "configuração" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "O movimento suporta apenas o módulo de largura e altura 8" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "A largura da imagem ( %d) ou a altura ( %d) solicitada não são o módulo 8." #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "O movimento suporta apenas largura e altura iguais ou superiores a 64 %dx %d" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "Substream não disponível. Tamanhos de imagem não modulos 16." #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "formato de imagem webp não está disponível, retornando ao jpeg" #: src/motion.c msgid "Error capturing first image" msgstr "Erro ao capturar a primeira imagem" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "Abrindo o dispositivo de loopback de vídeo para fotos normais" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "Falha ao abrir o loopback de vídeo para fotos normais" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "Abrindo um dispositivo de loopback de vídeo para filmes" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "Falha ao abrir o loopback de vídeo para filmes" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "Falha ao ler a imagem da máscara. Recurso de máscara desativado." #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "Arquivo de máscara \" %s \" carregado." #: src/motion.c msgid "Emulating motion" msgstr "Emulando o movimento" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "Movimento na área %d detectado." #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "Tentando novamente até uma conexão bem-sucedida com a câmera" #: src/motion.c msgid "Camera has become available." msgstr "A câmera tornou-se disponível." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "Reiniciando o movimento.\n" "A largura da imagem (%d) ou altura (%d) solicitada não é módulo 8." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Reiniciando o movimento.\n" "O movimento só suporta largura e altura maiores ou iguais a 64 %dx%d" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "Reiniciando o movimento.\n" "Altura ou largura foi alterada na câmera." #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "Reiniciando o movimento.\n" "A alta resolução mudou na câmera." #: src/motion.c msgid "Video signal re-acquired" msgstr "Sinal de vídeo readquirido" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "Erro fatal do dispositivo de vídeo - Fechando o dispositivo de vídeo" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "" "Reiniciando o thread Motion para reinicializar todos os buffers de imagem" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "Sinal de vídeo perdido - Adicionando imagem em cinza" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "Sinal de vídeo ainda perdido - Tentando fechar o dispositivo de vídeo" #: src/motion.c msgid "Lightswitch detected" msgstr "Interruptor de luzes detectado" #: src/motion.c msgid "Switchfilter detected" msgstr "Switchfilter detectado" #: src/motion.c msgid "micro-lightswitch!" msgstr "micro-interruptor de luz!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "Fim do evento %d" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "Alterações brutas: %5d - alterações após ' %s': %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr "- marcadores: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "Alterações: %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr "- nível de ruído: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr "- limite: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "Argumento inválido do modo de intervalo de tempo ' %s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%: s Padrão para o modo de intervalo de tempo manual" #: src/motion.c msgid "Thread exiting" msgstr "Saída do segmento" #: src/motion.c msgid "Motion going to daemon mode" msgstr "Movimento entrando no modo daemon" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "" "Sair do movimento, não é possível criar o arquivo de identificação do " "processo (arquivo pid) %s" #: src/motion.c msgid "Could not change directory" msgstr "Não foi possível alterar o diretório" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "Arquivo de identificação do processo criado %s. O ID do processo é %d" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "" "Os Camara IDs não são exclusivos ou têm valores acima de 32.000. Voltando " "anúmeros de linhas" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2: disponível" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2: não disponível" #: src/motion.c msgid "bktr : available" msgstr "bktr: disponível" #: src/motion.c msgid "bktr : not available" msgstr "bktr: não disponível" #: src/motion.c msgid "webp : available" msgstr "webp: disponível" #: src/motion.c msgid "webp : not available" msgstr "webp: não disponível" #: src/motion.c msgid "mmal : available" msgstr "mmal: disponível" #: src/motion.c msgid "mmal : not available" msgstr "mmal: não disponível" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg: disponível" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg: não disponível" #: src/motion.c msgid "mysql : available" msgstr "mysql: disponível" #: src/motion.c msgid "mysql : not available" msgstr "mysql: não disponível" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB: disponível" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB: não disponível" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3: disponível" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3: não disponível" #: src/motion.c msgid "pgsql : available" msgstr "pgsql: disponível" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql: não disponível" #: src/motion.c msgid "nls : available" msgstr "nls: disponível" #: src/motion.c msgid "nls : not available" msgstr "nls: não disponível" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "Usando o nível de log padrão ( %s) ( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "Registrando no arquivo ( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "Sair do movimento, não é possível criar o arquivo de log %s" #: src/motion.c msgid "Logging to syslog" msgstr "Registrando no syslog" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "Movimento %s iniciado" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "Usando o tipo de log padrão ( %s)" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "Usando o tipo de log ( %s) nível de log ( %s)" #: src/motion.c msgid "Motion running as daemon process" msgstr "Movimento em execução como processo daemon" #: src/motion.c msgid "Motion running in setup mode." msgstr "Movimento em execução no modo de configuração." #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "ID da câmera: %d é de %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "ID da câmera: %d Nome da câmera: %s Serviço: %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "ID da câmera: %d Nome da câmera: %s Dispositivo: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "" "O número da porta de fluxo %d para o thread %d entra em conflito com a porta " "de controle" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "O recurso de fluxo para o encadeamento %d está desabilitado." #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "" "O número da porta de fluxo %d para o encadeamento %d entra em conflito com o " "encadeamento %d" #: src/motion.c msgid "Restarting motion." msgstr "Reiniciando o movimento." #: src/motion.c msgid "Motion restarted" msgstr "Movimento reiniciado" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "" "Thread %d - Tempo limite do cão de guarda. Tentando fazer um reinício normal" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "Thread %d - O tempo limite do Watchdog NÃO foi reiniciado, matando-o!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "Rosca %d - Rosca de limpeza." #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "" "DEBUG-1 threads executando %d motion threads executando %d, concluir %d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "Aguardando a conclusão de threads, pid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "%d De reinicialização do segmento de movimento" #: src/motion.c msgid "Threads finished" msgstr "Tópicos concluídos" #: src/motion.c #, c-format msgid "Received signal %d." msgstr "Sinal %d recebido." #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "Movimento terminando" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "URL inválida. Não é possível analisar valores." #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "Encadeamento do manipulador de câmera [ %d] iniciado" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "Fechando o soquete da câmera de vídeo como o tempo de manutenção do " "funcionamento esgotado (campo de câmera enviado Fechar). UMAreconectar deve " "acontecer." #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "reabrindo a câmera (sem streaming)" #: src/netcam.c msgid "camera re-connected" msgstr "câmera reconectada" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "Cabeçalho da imagem não reconhecido ( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "Erro no cabeçalho ( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "reabrindo a câmera (streaming)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "Erro ao obter a imagem JPEG" #: src/netcam.c msgid "Trying to re-connect" msgstr "Tentando reconectar" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "manipulador de câmera netcam: acabamento final, saída" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "Nenhuma resposta do manipulador da câmera - ele já deve ter morrido" #: src/netcam.c msgid "called with no data in buffer" msgstr "chamado sem dados no buffer" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "Câmera de rede iniciando para a câmera ( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "Proxy de webcam inválido ( %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "Nome de usuário / senha não permitidos em um URL de proxy" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "Serviço de webcam inválido ' %s'" #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "URL de webcam inválido para a câmera ( %s)" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "O parâmetro http da webcam ' %s' converte em sinalizadores: HTTP / 1.0: %s " "HTTP / 1.1: %sVivo %s." #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "agora chamando a configuração da netcam html ()" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "agora chamando netcam setup ftp" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "agora chamando o arquivo de configuração da webcam ()" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "agora chamando netcam setup mjpg ()" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "Serviço netcam inválido ' %s' - deve ser mjpeg, ftp, mjpg ou jpeg." #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "Falha ao tentar ler a primeira imagem - retval: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "falha de descompressão libjpeg no primeiro quadro - desistindo!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "A largura / altura ( %dx %d) deve ser múltiplos de 8" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "Erro ao iniciar o thread do manipulador de câmera [ %d]" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "recv falhou em ftp obter mais" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "Resposta do servidor: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "envio falhou em ftp enviar usuário" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "envio falhou no ftp send passwd" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "falha no envio ao sair do ftp" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "gethostbyname falhou na conexão ftp" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "incompatibilidade de endereço gethostbyname no ftp connect" #: src/netcam_ftp.c msgid "socket failed" msgstr "falha no soquete" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "Falha ao criar uma conexão" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "Servidor FTP pedindo ACCT em anônimo" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "opção de soquete de configuração SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "envio falhou no ftp obter conexão" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "Resposta inválida para PASV" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "Falha ao criar uma conexão de dados" #: src/netcam_ftp.c msgid "bind failed" msgstr "ligação falhada" #: src/netcam_ftp.c msgid "listen failed" msgstr "escuta falhou" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "o envio falhou no ftp get socket" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "aceitar em ftp get socket" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "recv falhou na leitura do ftp" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "ftp get socket falhou" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "Erro ao enviar o TIPO I para o servidor FTP" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "token malformado Comprimento do conteúdo, mas valor %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "Comprimento do conteúdo %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "Tipo de conteúdo %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "" "Erro ao ler o cabeçalho da imagem, modo de streaming (1). Cabeçalho nulo." #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "" "Erro ao ler o cabeçalho da imagem, modo de streaming (1). Cabeçalho " "desconhecido ' %s'" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "Erro ao ler o cabeçalho da imagem (2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "Cabeçalho não JPEG" #: src/netcam_http.c msgid "Content-Length 0" msgstr "Comprimento do conteúdo 0" #: src/netcam_http.c msgid "Found image header record" msgstr "Registro de cabeçalho de imagem encontrado" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "Erro ao enviar solicitação de 'conexão'" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "Primeiro cabeçalho recebido (' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "Erro ao ler o primeiro cabeçalho ( %s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "Código de resultado HTTP %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "" "Removido o sinalizador netcam Keep-Alive devido à aparente conexão HTTP " "fechada." #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "Câmera sem streaming (conjunto keep-alive)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "Câmera sem streaming (manter ativo não definido)" #: src/netcam_http.c msgid "Streaming camera" msgstr "Câmera de streaming" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "String de limite [ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "String de limite não encontrada no cabeçalho" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "" "Câmera de streaming provavelmente usando blocos MJPG, considere usar mjpg: //" "URL da webcam." #: src/netcam_http.c msgid "Unrecognized content type" msgstr "Tipo de conteúdo não reconhecido" #: src/netcam_http.c msgid "Content-length present" msgstr "Presente de comprimento de conteúdo" #: src/netcam_http.c msgid "Content-length 0" msgstr "Comprimento do conteúdo 0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "Conexão encontrada: fechar cabeçalho (' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "" "Recebido o cabeçalho 'Connection: Keep-Alive' e 'Connection: close'.O " "movimento remove o keepalive." #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "" "Recebido o cabeçalho 'Connection: Keep-Alive' e 'Connection: close'.O " "movimento continua inalterado." #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "Recebeu um campo Keep-Alive neste conjunto de cabeçalhos." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "Nenhum cabeçalho 'Conexão: Manter ativo' nem 'Conexão: fechar' recebido. \n" " O movimento remove o keepalive." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "Nenhum cabeçalho 'Conexão: Manter ativo' nem 'Conexão: fechar' recebido. \n" " O movimento continua inalterado." #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "Removido o sinalizador Keep-Alive da netcam porque o cabeçalho 'Conexão: " "fechar' foi recebido. \n" " A Netcam não suporta o Keep-Alive. O movimento continua em não-Keep-Alive." #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "O Keep-Alive chegou ao final do período válido. \n" " O movimento fechará a webcam e, em seguida, retomará o Keep-Alive com um " "novo soquete." #: src/netcam_http.c msgid "disconnect" msgstr "desconectar" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo () falhou ( %s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "desconectando a webcam (1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "desconectando a webcam porque o keep-alive não está definido." #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "sem keepalive, a tentativa de criar soquete falhou." #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "sem keepalive, novo soquete criado fd %d" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "com keepalive definido, soquete inválido. Essa pode ser a primeira vez. " "Criando umnovo falhou." #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "" "com keepalive set, socket inválido. Isso poderia ser a primeira vez que " "criava um novoum com fd %d" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "ASSIM KEEPALIVE é %s" #: src/netcam_http.c msgid "ON" msgstr "EM" #: src/netcam_http.c msgid "OFF" msgstr "FORA" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "SO KEEPALIVE definido no soquete." #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "fcntl (1) no soquete" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "fcntl (2) no soquete" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "connect () falhou ( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "desconectando a webcam (4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "tempo limite em connect ()" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "desconectando a webcam (2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "getsockopt após conectar" #: src/netcam_http.c msgid "connect returned error" msgstr "conectar erro retornado" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "desconectando a webcam (3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "buffer de expansão de [ %d / %d] para [ %d / %d] bytes." #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "" "Limite de divisão potencial - %d caracteres nivelados, %d reposicionados" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "recv () falha após a string de limite" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "deixando a netcam conectada." #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "prestes a tentar se conectar, o tempo # %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "Falha ao abrir a câmera - verifique sua configuração e se a webcam está " "online" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "Erro ao ler o primeiro cabeçalho - tentar novamente" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "Falha ao ler o primeiro cabeçalho da câmera - desistindo por enquanto" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "" "A Netcam possui sinalizadores: HTTP / 1.0: %s HTTP / 1.1: %s Manter ativo %s." #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "" "Foi removido o sinalizador de manutenção da webcam devido ao conjunto de " "proxy. O proxy é incompatível comMantenha vivo." #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "Falha ao ler o cabeçalho do primeiro fluxo - desistindo por enquanto" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "conectado, passando a ler a imagem." #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "Erro de leitura, tentando reconectar .." #: src/netcam_http.c msgid "lost the cam." msgstr "perdeu a câmera." #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "Buffer recarregado com [ %d] bytes da rede." #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "Leia [ %d / %d] bytes do cabeçalho." #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "Cabeçalho inválido recebido, reconectando" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "Ler [ %d / %d] bytes de bloco, [ %d / %d] total" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "Pedaço completo, buffer usado [ %d] bytes." #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "Imagem concluída, buffer usado [ %d] bytes." #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "conectado, lendo e decodificando pedaços MJPG." #: src/netcam_http.c msgid "Begin" msgstr "Início" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "erro de stat ( %s)" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]! = último st mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "aguardando novo tempo limite da imagem do arquivo" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "atraso na espera da nova imagem de arquivo" #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "processando nova imagem de arquivo - st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "erro de abertura ( %s): %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "erro de leitura ( %s): %d" #: src/netcam_http.c msgid "End" msgstr "Fim" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> arquivo-> caminho %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "Não há dados suficientes da webcam." #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> erro jpeg %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "*** novo atraso na foto bem-sucedido ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "erro de jpeg %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "processando imagem jpeg - comprimento do conteúdo %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "Incompatibilidade de largura / altura da câmera com imagem JPEG - %dx %d " "esperado, JPEG %dx %dretval %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s: matriz de pacotes redimensionada para %d" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s: pacote de cópias av: %s, interrupção: %s" #: src/netcam_rtsp.c msgid "True" msgstr "Verdade" #: src/netcam_rtsp.c msgid "False" msgstr "Falso" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: Ignorando pacote com dados inválidos" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: Erro de frame de gravação: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "Ignorando pacote com dados inválidos" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "Erro ao decodificar pacote: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "%s: Erro ao transferir HW decodificado para a memória do sistema" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "Erro ao enviar pacote para o codec: %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "Erro ao decodificar o pacote de vídeo: Copiando para o buffer" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: Dispositivos HW:" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s (disponível)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s (não implementado)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s: decodificador netcam %s desativado." #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "Falha ao obter o formato vaapi pix" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "Falha ao obter o formato cuda pix" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s: interrompido." #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: falhou" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s: o decodificador %s não funcionou." #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "%s: Ignorando e removendo o decodificador %s solicitado pelo usuário" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s: inicializando o decodificador vaapi" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: não foi possível encontrar o dispositivo vaapi hw" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s: Inicializando o decodificador cuda" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: não foi possível encontrar o dispositivo cuda hw" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s: Inicializando o decodificador" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s: usando o decodificador %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: decodificador aberto" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s: tempo limite da leitura da câmera ( %s) excedido" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s: o tempo limite da câmera ( %s) expirou" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "Não foi possível alocar swsframe em." #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "Não foi possível alocar o swsframe." #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "Não foi possível alocar o contexto de dimensionamento." #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "Erro ao determinar o tamanho do quadro" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "Erro ao alocar imagem em: %s" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "Erro ao alocar a saída da imagem: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "Erro ao redimensionar / reformatar: %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "Erro ao colocar o quadro no buffer de saída: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s: interrompido" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: av read frame: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: Tentativas excessivas de obter dados da câmera %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "%s: taxa de captura não especificada nos parâmetros netcam. Usando %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s: taxa de captura não especificada nos parâmetros netcam. Usando a taxa de " "quadros %d" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "A câmera de rede está enviando fotos em um" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "tamanho que o especificado na configuração e também um" #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "formato de imagem diferente. A imagem está sendo" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "transcodificado para YUV420P e no tamanho solicitado" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "no arquivo de configuração. Se possível, mude a webcam para" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "estar no formato YUV420P e o tamanho solicitado no" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "config para possivelmente diminuir o uso da CPU." #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "tamanho que o especificado no arquivo de configuração." #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "A imagem está sendo transcodificada para o tamanho" #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "solicitado na configuração. Se possível, mude" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "webcam ou configuração para indicar o mesmo tamanho" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "possivelmente para diminuir o uso da CPU." #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "Netcam: %dx %d => Configuração: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "A imagem enviada está sendo" #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "trancoded para YUV420P. Se possível, mude a webcam" #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "" "formato de imagem para YUV420P para possivelmente diminuir o uso da CPU." #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: Configurando rtsp / rtmp" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: Configurando o formato de entrada mjpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: Definindo o formato de entrada video4linux2" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: Configurando arquivo de filme" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s: configurando %s" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: opção: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "Configurando v4l2 via netcam" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "Configurando arquivo via netcam" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "Configurando %s via netcam" #: src/netcam_rtsp.c msgid "highres" msgstr "alta resolução" #: src/netcam_rtsp.c msgid "norm" msgstr "norma" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "Configurando %s fluxo." #: src/netcam_rtsp.c msgid "Unknown" msgstr "Desconhecido" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "Fluxo copiado para passagem" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "Caminho nulo passado para conectar" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s: não é possível abrir a câmera ( %s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s: câmera aberta ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s: não foi possível encontrar informações do fluxo: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s: Não foi possível abrir o contexto do codec: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s: o tamanho da imagem da câmera é inválido" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s: Não foi possível alocar o quadro." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s: falha ao copiar o fluxo para passagem." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s: falha ao ler a primeira imagem" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s: câmera ( %s) conectada" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s: a taxa de captura da Netcam é %d." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s: a fonte da câmera é %d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s: não é possível determinar o FPS de origem da câmera." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s: a taxa de captura é menor que o FPS da câmera." #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s: Ocorrerão erros de decodificação." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "" "%s: a taxa de captura ligeiramente maior do que o FPS da câmera é " "recomendada." #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s: reconectando com a câmera ...." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s: a câmera não reconectou." #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s: verificando a câmera a cada 10 segundos." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s: segmento do manipulador de câmera [ %d] iniciado" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s: loop do manipulador concluído." #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s: Erro ao iniciar o thread do manipulador" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s: aguardando a primeira imagem do manipulador." #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "incapaz de criar contexto rtsp" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "incapaz de criar alto contexto rtsp" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "Sem suporte FFmpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s: desligando a câmera de rede." #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s: Nenhuma resposta do encadeamento do manipulador." #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "Resolução normal: desligamento completo." #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "Alta resolução: desligamento completo." #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "Não foi possível definir EXIF ​​para o pedaço da webp" #: src/picture.c msgid "libwebp version error" msgstr "erro de versão da libwebp" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "erro de alocação de buffer de imagem libwebp" #: src/picture.c msgid "libwebp image compression error" msgstr "erro de compactação de imagem libwebp" #: src/picture.c msgid "unable to assemble webp image" msgstr "incapaz de montar a imagem do webp" #: src/picture.c msgid "unable to save webp image to file" msgstr "incapaz de salvar a imagem da webp no arquivo" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "Não é possível gravar a imagem no arquivo %s - verifique os direitos de " "acesso ao diretório de destino \n" "O encadeamento será concluído devido a este erro fatal" #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "Não é possível gravar a imagem no arquivo %s" #: src/picture.c msgid "Error getting PGM vars." msgstr "Erro ao obter PGM vars." #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "Este não é um arquivo pgm, começa com ' %s'" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "Magia %s: Largura %s(%d): Altura %s(%d): MaxVal: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "Falha ao ler os dados da imagem do arquivo pgm" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "" "O arquivo de máscara especificado não tem o mesmo tamanho da imagem da " "câmera." #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "Tentativa de redimensionar a imagem da máscara de %dx %d para %dx %d" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "" "não é possível gravar o arquivo de máscara %s - verifique os direitos de " "acesso ao diretório de destino" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "Não é possível gravar o arquivo de máscara %s" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "Falha ao gravar a máscara padrão como arquivo pgm" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "Criando máscara vazia %s \n" "Edite este arquivo e execute novamente o movimento para ativar o recurso de " "máscara" #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "A opção de configuração \"rotate \" não é um múltiplo de 90: %d" #: src/track.c msgid "internal error" msgstr "erro interno" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "erro interno, %hu não é um tipo de faixa conhecido" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "porta %s dev fd %i, comando %hu do motor %hu dados %hu" #: src/track.c msgid "Status byte timeout!" msgstr "Tempo limite do byte de status!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "Tente abrir o dispositivo serial %s" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "Não foi possível abrir o dispositivo serial %s" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "Não foi possível inicializar o dispositivo serial %s" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "Dispositivo serial aberto %s e inicializado, fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "Nenhum dispositivo %s foi iniciado ainda, tentando o stepper center ()" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "falha ao inicializar o dispositivo deslizante em %s, fd [ %i]." #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "com êxito, o dispositivo iniciou %s, fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "Porta SENDS %s dev fd %i, comando %hu do motor %hu dados %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "Comando retornar %d" #: src/track.c msgid "Problem opening servo!" msgstr "Problema ao abrir o servo!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d, cent-> y %d, reversex %d, reversey %d manual %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d valor fora da faixa! ( %d - %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d valor fora da faixa! ( %d - %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "X deslocamento %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "Comando X cent-> x %d, cent-> y %d, reversex %d, reversey %d motorx %d dados " "%d%d" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Y deslocamento %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Comando Y cent-> x %d, cent-> y %d, reversex %d, reversey %d motory %d dados " "%d%d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "Deslocamento X %d, deslocamento Y %d, posição x %d. posição y %d, reversex " "%d, reversey%d, tamanho da etapa %d" #: src/track.c msgid "Return byte timeout!" msgstr "Tempo limite de retorno de bytes!" #: src/track.c msgid "Unable to set camera speed" msgstr "Não foi possível definir a velocidade da câmera" #: src/track.c msgid "succeed" msgstr "ter sucesso" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "Falha ao redefinir a câmera pwc para a posição inicial! Razão" #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "falhou VIDIOCPWCMPTGRANGE" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "Falha ao deslocar / inclinar a câmera pwc! Razão" #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "Falha ao redefinir a câmera UVC para a posição inicial! Razão" #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "Redefinindo a câmera UVC para a posição inicial" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl querycontrol" #: src/track.c msgid "Getting camera range" msgstr "Obtendo o alcance da câmera" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "" "PARAM DE ENTRADA ABS pan min %d, pan max %d, inclinação min %d, inclinação " "max %d" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "PARAM DE ENTRADA ABS X Anjo %d, Y Anjo %d" #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "Para SET ABS, mova X %d, mova Y %d" #: src/track.c msgid "Failed to move UVC camera!" msgstr "Falha ao mover a câmera UVC!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "MINMAX encontrado = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "Antes do ABS Y Angel: x = %d, Y = %d," #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "Após ABS Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "" "Para SET REL pan min %d, pan max %d, inclinação min %d, inclinação max %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "" "Para definir o ângulo de deslocamento da faixa REL %d, incline o ângulo %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "Para SET REL, mova X %d, mova Y %d" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, endereço = %d, controle S = %d, Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, endereço = %d, controle S = %d, Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "Antes de REL Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "Após REL Y Angel: x = %d, Y = %d" #: src/translate.c msgid "Language: English" msgstr "Língua inglesa" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "Não foi possível alocar %llu bytes de memória!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "" "Atenção! A função %s tenta redimensionar o bloco de memória em %p para 0 " "bytes!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "Não foi possível redimensionar o bloco de memória no deslocamento %p para " "%llu bytes (função %s)!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "Problema ao criar o diretório %s" #: src/util.c #, c-format msgid "creating directory %s" msgstr "criando diretório %s" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "Erro ao abrir o arquivo %s com o modo %s" #: src/util.c msgid "Error closing file" msgstr "Erro ao fechar o arquivo" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbeventid} não é compatível. Use eventid." #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "palavra-chave do especificador de formato inválida %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "Não foi possível definir o nome do encadeamento %s" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "Versão FFMPEG muito antiga. Desativando o processamento de passagem." #: src/util.c msgid "pass-through enabled." msgstr "passagem habilitada." #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "Erro ao definir parm> %s <" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "Analisado:> %s <> %s <" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "Analisado:> redigido <> redigido <" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "Erro ao analisar controles de parm nm: %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "Erro ao analisar os controles parm vl: %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "Erro ao definir a temperatura: %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "Controle de análise de erro: %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "Análise: %s" #: src/util.c msgid "Parsing: " msgstr "Análise: " #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "Erro ao analisar controles: %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "Erro: %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "Novos parâmetros netcam: %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "Novos parâmetros elevados da netcam: %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "Novos parâmetros de vídeo: %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "Novos parâmetros de cabeçalho de controle da web: %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "Novos parâmetros de cabeçalho de webcontrol: " #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "Novos parâmetros de cabeçalho de fluxo: %s" #: src/util.c msgid "New stream_header_params: " msgstr "Novos parâmetros de cabeçalho de stream: " #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "Erro de programação. Item de configuração desconhecido: %s " #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE Erro ao definir o matiz [ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "para [ %d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE Erro ao obter o matiz" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "Erro METEORSCSAT ao definir a saturação [ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT Erro ao obter saturação" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT Erro ao definir contraste [ %d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT Erro ao obter contraste" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "METEORSBRIG brilho [ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIG obtendo brilho" #: src/video_bktr.c msgid "Not implemented" msgstr "Não implementado" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "Entrada do dispositivo %d fora do intervalo (0-4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d inválido - Tentando composição %d" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "" "BT848SFMT, Não foi possível definir o formato de entrada, tente novamente " "com o padrão" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "BT848SFMT, não foi possível definir o formato de entrada como padrão" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "Não foi possível definir a geometria" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "para [ %d / %d] Norma %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "Frequência inválida [ %ld] para entrada de fonte [ %i]" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "Frequência [ %ld] Entrada da fonte [ %i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "definir entrada [ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "definir formato de entrada [ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "definir geometria [ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "Conjunto de frequências (ainda não implementado" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "Buffer de dimensionamento para 3x" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "Buffer de dimensionamento para 3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap falhou" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "METEORCAPTUR usando o método único Captura de erro" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "Erro ao capturar usando o método único" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "Não foi possível encontrar o dispositivo de vídeo" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "Fechando o dispositivo de vídeo %s" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "" "Ainda existem %d usuários do dispositivo de vídeo %s, então não o fechamos " "agora" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "largura da imagem de configuração ( %d) não é módulo 8" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "a altura da imagem de configuração ( %d) não é módulo 8" #: src/video_bktr.c msgid "Stopping capture" msgstr "Parando a captura" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "" "Reutilizando entradas [ %s] [ %d, %d] Alterar método de captura METEOR CAP " "SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "VIDEO PALETTE YUV420P configuração imgs.size norma e imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "abrir dispositivo de vídeo %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "dispositivo sintonizador aberto %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "Imagem corrompida ... continue" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "Posição SOI ajustada por %d bytes." #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "chamando limpeza mmalcam" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "chamando limpeza de webcam" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "chamada netcam rtsp limpeza" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "Limpando o dispositivo V4L2" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "Limpando o dispositivo BKTR" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "Nenhuma limpeza do dispositivo da câmera (MMAL, Netcam, V4L2, BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "Abrindo a câmera MMAL" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "Não foi possível abrir a câmera MMAL" #: src/video_common.c msgid "Opening Netcam" msgstr "Abrindo a Netcam" #: src/video_common.c msgid "Netcam failed to open" msgstr "Falha ao abrir a webcam" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Abrindo o Netcam RTSP" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Não foi possível abrir o Netcam RTSP" #: src/video_common.c msgid "Opening V4L2 device" msgstr "Abrindo o dispositivo V4L2" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "Falha ao abrir o dispositivo V4L2" #: src/video_common.c msgid "Opening BKTR device" msgstr "Abrindo dispositivo BKTR" #: src/video_common.c msgid "BKTR device failed to open" msgstr "Falha ao abrir o dispositivo BKTR" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "Nenhum dispositivo de câmera especificado (MMAL, Netcam, V4L2, BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "Falha ao abrir ' %s'" #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "Erro ao especificar buffer: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "Buffer de abertura: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "Buffer de leitura: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "dispositivo de vídeo encontrado ' %s' %d" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "%s aberto como saída do tubo" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "Abrindo %s como falha na saída do tubo" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "Especificações do tubo original" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "Especificações de tubos propostas" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "Especificações finais do tubo" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "Nenhum controle encontrado para o dispositivo" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "--------- Controles ---------" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr "Nome e intervalo do ID V4L2" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "Erro ao redefinir o valor do usuário" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "Deixando o controle %s \"%s\" definido como %d" #: src/video_v4l2.c msgid "Device not ready" msgstr "Dispositivo não pronto" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "Defina o controle \" %s \" para o valor %d" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "falha na configuração do controle %s \"%s\" para %d." #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "" "O valor da opção de controle %s %s está abaixo do mínimo. Usando no mínimo " "%d " #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "" "O valor da opção de controle %s %s está acima do máximo. Usando no máximo %d " #: src/video_v4l2.c msgid "control type not supported yet" msgstr "tipo de controle ainda não suportado" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "Não foi possível consultar a entrada %d. VIDIOC ENUMINPUT, se você usar uma " "entrada de alteração WEBCAMvalor em conf por -1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "Nome = \" %s \", digite 0x %08X, status %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "Nome = \" %s \", - TUNER" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "Nome = \" %s \" - CÂMERA" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "Erro ao selecionar a entrada %d VIDIOC S INPUT" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "O dispositivo não suporta a especificação da norma PAL / NTSC" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "- padrão de vídeo %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "Erro ao selecionar o método padrão %d VIDIOC S STD" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "Padrão de vídeo definido como NTSC" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "Padrão de vídeo definido como SECAM" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "Padrão de vídeo definido como PAL" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "sintonizador %d SINTONIZADOR G VIDIOC" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "Definir sintonizador %d" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "freq %ul FREQUÊNCIA VIDIOC S" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "Defina Frequência como %ul" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "Não foi possível usar %c%c%c%c (%dx%d)" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "Paleta de teste %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "Verificando o tamanho da imagem %dx%d com passo %d" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "Nenhum valor de passada fornecido pelo dispositivo." #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "A largura(%d) deve ser menor que o passo(%d)" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "A largura da imagem(%d) não é múltiplo do passo(%d)" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "Condição impossível: Largura(%d), Passo(%d), Por passo(%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "A largura da imagem será preenchida com %d bytes" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "Ajustando a resolução de %ix %i para %ix %i." #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "Resolução ajustada, não módulo 8." #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "" "Especifique paleta diferente ou largura / altura no arquivo de configuração." #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "Erro ao definir o formato de pixel." #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "Usando a paleta %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "Ajustando à largura ( %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "Ajustando a altura ( %d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "O índice da paleta de configuração %d ( %s) para %dx %d não funciona." #: src/video_v4l2.c msgid "Supported palettes:" msgstr "Paletas suportadas:" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d - %s (compactado: %d) ( %# x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "Paleta selecionada %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "Falha na seleção da paleta para o formato %s" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "Não foi possível encontrar um formato de paleta compatível." #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "Erro ao solicitar buffers %d para o mapa de memória. REIDBUFS VIDIOC" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "informações do mmap: frames = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "Memória insuficiente do buffer %d %s< >%s< >%s<" msgstr "Ação inválida solicitada:> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "Idioma nativo: ativado" #: src/webu.c msgid "Native Language : off" msgstr "Idioma nativo: desativado" #: src/webu.c msgid "Set the value to null/zero" msgstr "Defina o valor como nulo / zero" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "Ignorando conexão de: %s" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "Falha na autenticação de %s" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "Nenhum usuário do webcontrol: passe fornecido" #: src/webu.c msgid "No stream user:pass provided" msgstr "Nenhum usuário de stream: passe fornecido" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "Resposta inválida" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "Erro ao adicionar o cabeçalho do webcontrol %s %s" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "Erro ao adicionar cabeçalho do stream %s %s" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "Método inválido solicitado: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "Conexão de: %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "página de envio falhada %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "A imagem do stream ainda não está pronta" #: src/webu.c msgid "Stream process requested to finish." msgstr "Processo de stream solicitado para terminar." #: src/webu.c msgid "Send page failed." msgstr "Falha no envio da página." #: src/webu.c msgid "Basic authentication: available" msgstr "Autenticação básica: disponível" #: src/webu.c msgid "Basic authentication: disabled" msgstr "Autenticação básica: desativada" #: src/webu.c msgid "Digest authentication: available" msgstr "Autenticação Digest: disponível" #: src/webu.c msgid "Digest authentication: disabled" msgstr "Autenticação Digest: desativada" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd libary ipv6 muito antigo desativado" #: src/webu.c msgid "IPV6: available" msgstr "IPV6: disponível" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6: desativado" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd libary SSL / TLS muito antigo desativado" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS: disponível" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS: desativado" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "Erro ao ler o arquivo para suporte a SSL / TLS." #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "SSL / TLS solicitado, mas nenhum arquivo de certificado foi fornecido. SSL / " "TLS desativado" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "" "SSL / TLS solicitado, mas nenhum arquivo de chave foi fornecido. SSL / TLS " "desativado" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "Iniciando o webcontrol na porta %d" #: src/webu.c msgid "Unable to start MHD" msgstr "Não foi possível iniciar o MHD" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "Webcontrol iniciado na porta %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "Câmera %d iniciada na porta / ID da câmera %d / %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "Câmera %d stream iniciada na porta %d" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "Iniciando todos os fluxos de câmera na porta %d" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "Iniciando o fluxo da câmera %d na porta %d" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "Não foi possível iniciar o fluxo para a câmera %d" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "Porta duplicada solicitada %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "" "IPs máximos de bloqueio de controle da web inválidos. Configuração igual a " "25. " #: src/webu_html.c msgid "Cameras" msgstr "Câmeras" #: src/webu_html.c msgid "Camera" msgstr "Câmera" #: src/webu_html.c msgid "All" msgstr "Todos" #: src/webu_html.c msgid "Action" msgstr "Açao" #: src/webu_html.c msgid "Start Event" msgstr "Evento inicial" #: src/webu_html.c msgid "End Event" msgstr "Evento final" #: src/webu_html.c msgid "Snapshot" msgstr "Instantâneo" #: src/webu_html.c msgid "Change Configuration" msgstr "Alterar configuração" #: src/webu_html.c msgid "Write Configuration" msgstr "Escrever configuração" #: src/webu_html.c msgid "Tracking" msgstr "Rastreamento" #: src/webu_html.c msgid "Pause" msgstr "Pausa" #: src/webu_html.c msgid "Start" msgstr "Comece" #: src/webu_html.c msgid "Restart" msgstr "Reiniciar" #: src/webu_html.c msgid "Quit" msgstr "Sair" #: src/webu_html.c msgid "Help" msgstr "Socorro" #: src/webu_html.c msgid "No Configuration Options" msgstr "Nenhuma opção de configuração" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "Opções de configuração limitadas" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "Opções avançadas de configuração" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "Opções de Configuração Restrita" #: src/webu_html.c msgid "All Cameras" msgstr "Todas as Câmeras" #: src/webu_html.c msgid "Not running" msgstr "Não ativo" #: src/webu_html.c msgid "Lost connection" msgstr "Conexão perdida" #: src/webu_html.c msgid "Paused" msgstr "Pausado" #: src/webu_html.c msgid "Active" msgstr "Ativo" #: src/webu_html.c msgid "Select option" msgstr "Selecione a opção" #: src/webu_html.c msgid "Save" msgstr "Salve" #: src/webu_html.c msgid "Pan/Tilt" msgstr "Giro / inclinação" #: src/webu_html.c msgid "Absolute Change" msgstr "Mudança Absoluta" #: src/webu_html.c msgid "Center" msgstr "Centro" #: src/webu_html.c msgid "Pan" msgstr "Giro" #: src/webu_html.c msgid "Tilt" msgstr "Inclinação" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "Encadeamento inválido especificado: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "URL inválido para uma porta específica da câmera: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "" "O URL do segmento 0 não é válido ao usar arquivos específicos da câmera: %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "URL inválido para uma porta específica da câmera: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "Não foi possível obter a imagem para transmitir." #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "A opção ' %s' está depreciada. O novo nome da opção é '%s'" motion-release-4.6.0/po/sk.po000066400000000000000000003266261452402535500160630ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:37-0600\n" "Last-Translator: Dusan Mikulas \n" "Language-Team: Dusan Mikulas \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "%s po verzii %s" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "Neznáme nastavenie\"%s\"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "Zápis konfig. súboru %s" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "Konfig. súbor %s nenájdený - skúste predvolený." #: src/conf.c msgid "Error getcwd" msgstr "Chyba getcwd" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "Problém otvoriÅ¥ konfig. súbor %s" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "Neplatný názov súboru %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "Vlákno procesu 0 - konfig súbor %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "Konfig. súbor nie je spustený, použijú sa predvolené hodnoty " #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "Zapísanie konfig. parametrov zo vÅ¡etkých súborov (%d):" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "Vlákno %d - konfig. súbor: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s " #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "Spracovávaný konfig. súbor %s" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "Konfigurácia adresára fotoaparátu %s sa nenaÅ¡la" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "KonfiguraÄný súbor fotoaparátu %s nebol nájdený" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "Spracovávaný konfig. súbor kamery %s" #: src/conf.c msgid "daemon" msgstr "démon" #: src/conf.c msgid "setup_mode" msgstr "režim nastavenia" #: src/conf.c msgid "pid_file" msgstr "súbor pid" #: src/conf.c msgid "log_file" msgstr "súbor denníka" #: src/conf.c msgid "log_level" msgstr "log úroveň" #: src/conf.c msgid "log_type" msgstr "typ denníka" #: src/conf.c msgid "quiet" msgstr "tichý" #: src/conf.c msgid "watchdog_tmo" msgstr "strážny pes tmo" #: src/conf.c msgid "watchdog_kill" msgstr "strážny pes zabíja" #: src/conf.c msgid "native_language" msgstr "materinský jazyk" #: src/conf.c msgid "camera_name" msgstr "názov kamery" #: src/conf.c msgid "camera_id" msgstr "ID kamery" #: src/conf.c msgid "target_dir" msgstr "cieľová r" #: src/conf.c msgid "video_device" msgstr "video zariadenie" #: src/conf.c msgid "video_params" msgstr "video parametre" #: src/conf.c msgid "auto_brightness" msgstr "automatický jas" #: src/conf.c msgid "tuner_device" msgstr "tunerové zariadenie" #: src/conf.c msgid "roundrobin_frames" msgstr "rámy na guľatinu" #: src/conf.c msgid "roundrobin_skip" msgstr "preskoÄiÅ¥" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "spínaný filter" #: src/conf.c msgid "netcam_url" msgstr "webová adresa netcam" #: src/conf.c msgid "netcam_params" msgstr "parametre netcam" #: src/conf.c msgid "netcam_high_url" msgstr "netcam vysoká adresa URL" #: src/conf.c msgid "netcam_high_params" msgstr "netcam vysoké parametre" #: src/conf.c msgid "netcam_userpass" msgstr "netcam userpass" #: src/conf.c msgid "mmalcam_name" msgstr "mmalcam name" #: src/conf.c msgid "mmalcam_params" msgstr "mmalcam params" #: src/conf.c msgid "width" msgstr "šírka" #: src/conf.c msgid "height" msgstr "výška" #: src/conf.c msgid "framerate" msgstr "snímok za sekundu" #: src/conf.c msgid "minimum_frame_time" msgstr "minimálny Äas na snímku" #: src/conf.c msgid "rotate" msgstr "toÄiÅ¥ sa" #: src/conf.c msgid "flip_axis" msgstr "preklopná os" #: src/conf.c msgid "locate_motion_mode" msgstr "vyhľadajte režim pohybu" #: src/conf.c msgid "locate_motion_style" msgstr "vyhľadajte Å¡týl pohybu" #: src/conf.c msgid "text_left" msgstr "text zostáva" #: src/conf.c msgid "text_right" msgstr "text vpravo" #: src/conf.c msgid "text_changes" msgstr "zmeny textu" #: src/conf.c msgid "text_scale" msgstr "textová stupnica" #: src/conf.c msgid "text_event" msgstr "textová udalosÅ¥" #: src/conf.c msgid "emulate_motion" msgstr "napodobniÅ¥ pohyb" #: src/conf.c msgid "pause" msgstr "pauza" #: src/conf.c msgid "threshold" msgstr "prah" #: src/conf.c msgid "threshold_maximum" msgstr "maximálna prahová hodnota" #: src/conf.c msgid "threshold_tune" msgstr "prahová hodnota" #: src/conf.c msgid "noise_level" msgstr "úroveň hluku" #: src/conf.c msgid "noise_tune" msgstr "ladenie hluku" #: src/conf.c msgid "despeckle_filter" msgstr "odvápňovací filter" #: src/conf.c msgid "area_detect" msgstr "detekcia oblasti" #: src/conf.c msgid "mask_file" msgstr "súbor masky" #: src/conf.c msgid "mask_privacy" msgstr "maska ​​súkromia" #: src/conf.c msgid "smart_mask_speed" msgstr "rýchlosÅ¥ inteligentnej masky" #: src/conf.c msgid "lightswitch_percent" msgstr "percento prepínaÄa svetiel" #: src/conf.c msgid "lightswitch_frames" msgstr "rámy svetiel" #: src/conf.c msgid "minimum_motion_frames" msgstr "minimum pohybových rámcov" #: src/conf.c msgid "event_gap" msgstr "medzera udalosti" #: src/conf.c msgid "pre_capture" msgstr "pred zachytením" #: src/conf.c msgid "post_capture" msgstr "po zachytení" #: src/conf.c msgid "on_event_start" msgstr "na zaÄiatku udalosti" #: src/conf.c msgid "on_event_end" msgstr "na konci udalosti" #: src/conf.c msgid "on_picture_save" msgstr "na obrázku uložiÅ¥" #: src/conf.c msgid "on_area_detected" msgstr "na zistenej ploche" #: src/conf.c msgid "on_motion_detected" msgstr "pri detekcii pohybu" #: src/conf.c msgid "on_movie_start" msgstr "na zaÄiatku filmu" #: src/conf.c msgid "on_movie_end" msgstr "na konci filmu" #: src/conf.c msgid "on_camera_lost" msgstr "na kamere stratil" #: src/conf.c msgid "on_camera_found" msgstr "nájdená kamera" #: src/conf.c msgid "picture_output" msgstr "obrazový výstup" #: src/conf.c msgid "picture_output_motion" msgstr "obrazový výstupný pohyb" #: src/conf.c msgid "picture_type" msgstr "typ obrázku" #: src/conf.c msgid "picture_quality" msgstr "kvalita obrazu" #: src/conf.c msgid "picture_exif" msgstr "obrázok exif" #: src/conf.c msgid "picture_filename" msgstr "názov súboru obrázka" #: src/conf.c msgid "snapshot_interval" msgstr "interval snímok" #: src/conf.c msgid "snapshot_filename" msgstr "názov súboru snímky" #: src/conf.c msgid "movie_output" msgstr "filmový výstup" #: src/conf.c msgid "movie_output_motion" msgstr "pohyb výstupu filmu" #: src/conf.c msgid "movie_max_time" msgstr "maximálny Äas filmu" #: src/conf.c msgid "movie_bps" msgstr "filmový bps" #: src/conf.c msgid "movie_quality" msgstr "kvalita filmu" #: src/conf.c msgid "movie_codec" msgstr "filmový kodek" #: src/conf.c msgid "movie_duplicate_frames" msgstr "film duplicitné snímky" #: src/conf.c msgid "movie_passthrough" msgstr "filmový priechod" #: src/conf.c msgid "movie_filename" msgstr "názov súboru filmu" #: src/conf.c msgid "movie_extpipe_use" msgstr "použitie filmovej extéry" #: src/conf.c msgid "movie_extpipe" msgstr "filmová dráha" #: src/conf.c msgid "timelapse_interval" msgstr "Äasový odstup" #: src/conf.c msgid "timelapse_mode" msgstr "režim timelapse" #: src/conf.c msgid "timelapse_fps" msgstr "timelapse fps" #: src/conf.c msgid "timelapse_codec" msgstr "timelapse kodek" #: src/conf.c msgid "timelapse_filename" msgstr "názov súboru timelapse" #: src/conf.c msgid "video_pipe" msgstr "video kanál" #: src/conf.c msgid "video_pipe_motion" msgstr "pohyb videa" #: src/conf.c msgid "webcontrol_port" msgstr "webcontrol port" #: src/conf.c msgid "webcontrol_ipv6" msgstr "webcontrol ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "webcontrol localhost" #: src/conf.c msgid "webcontrol_parms" msgstr "webcontrol parms" #: src/conf.c msgid "webcontrol_interface" msgstr "rozhranie webcontrol" #: src/conf.c msgid "webcontrol_auth_method" msgstr "metóda autorizácie webcontrol" #: src/conf.c msgid "webcontrol_authentication" msgstr "autentifikácia pomocou webového riadenia" #: src/conf.c msgid "webcontrol_tls" msgstr "webcontrol tls" #: src/conf.c msgid "webcontrol_cert" msgstr "webcontrol cert" #: src/conf.c msgid "webcontrol_key" msgstr "webcontrol key" #: src/conf.c msgid "webcontrol_header_params" msgstr "Parametre hlaviÄky webcontrol" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "minúty zámku webového ovládania" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "pokusy o zablokovanie webového ovládania" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "zámok webcontrol, max. ips" #: src/conf.c msgid "stream_port" msgstr "port prúdu" #: src/conf.c msgid "stream_localhost" msgstr "stream localhost" #: src/conf.c msgid "stream_auth_method" msgstr "metóda autorizácie toku" #: src/conf.c msgid "stream_authentication" msgstr "autentifikácia prúdom" #: src/conf.c msgid "stream_tls" msgstr "stream tls" #: src/conf.c msgid "stream_header_params" msgstr "parametre hlaviÄky streamu" #: src/conf.c msgid "stream_preview_scale" msgstr "mierka ukážky prúdu" #: src/conf.c msgid "stream_preview_newline" msgstr "ukážka prúdu Newline" #: src/conf.c msgid "stream_preview_method" msgstr "metóda ukážky prúdu" #: src/conf.c msgid "stream_quality" msgstr "kvalita prúdu" #: src/conf.c msgid "stream_grey" msgstr "prúd Å¡edá" #: src/conf.c msgid "stream_motion" msgstr "prúdový pohyb" #: src/conf.c msgid "stream_maxrate" msgstr "maximálny tok" #: src/conf.c msgid "stream_limit" msgstr "limit prúdu" #: src/conf.c msgid "database_type" msgstr "typ databázy" #: src/conf.c msgid "database_dbname" msgstr "databáza dbname" #: src/conf.c msgid "database_host" msgstr "hostiteľ databázy" #: src/conf.c msgid "database_port" msgstr "databázový port" #: src/conf.c msgid "database_user" msgstr "užívateľ databázy" #: src/conf.c msgid "database_password" msgstr "heslo databázy" #: src/conf.c msgid "database_busy_timeout" msgstr "Äasový limit databázy zaneprázdnený" #: src/conf.c msgid "sql_log_picture" msgstr "sql log obrázok" #: src/conf.c msgid "sql_log_snapshot" msgstr "SQL log snímka" #: src/conf.c msgid "sql_log_movie" msgstr "sql log film" #: src/conf.c msgid "sql_log_timelapse" msgstr "sql log timelapse" #: src/conf.c msgid "sql_query_start" msgstr "sql dotaz start" #: src/conf.c msgid "sql_query_stop" msgstr "sql dotaz stop" #: src/conf.c msgid "sql_query" msgstr "sql dotaz" #: src/conf.c msgid "track_type" msgstr "typ stopy" #: src/conf.c msgid "track_auto" msgstr "sledovaÅ¥ auto" #: src/conf.c msgid "track_port" msgstr "sledovaÅ¥ port" #: src/conf.c msgid "track_motorx" msgstr "sledovaÅ¥ motorx" #: src/conf.c msgid "track_motorx_reverse" msgstr "sledovaÅ¥ motorx dozadu" #: src/conf.c msgid "track_motory" msgstr "koľajové motory" #: src/conf.c msgid "track_motory_reverse" msgstr "spätný chod" #: src/conf.c msgid "track_maxx" msgstr "sledovaÅ¥ maxx" #: src/conf.c msgid "track_minx" msgstr "stopa minx" #: src/conf.c msgid "track_maxy" msgstr "sledovaÅ¥ maxy" #: src/conf.c msgid "track_miny" msgstr "sledovaÅ¥ miny" #: src/conf.c msgid "track_homex" msgstr "sledovaÅ¥ homex" #: src/conf.c msgid "track_homey" msgstr "sledovaÅ¥ domácke" #: src/conf.c msgid "track_iomojo_id" msgstr "stopa iomojo id" #: src/conf.c msgid "track_step_angle_x" msgstr "uhol krokovania stopy x" #: src/conf.c msgid "track_step_angle_y" msgstr "uhol krokovania stopy y" #: src/conf.c msgid "track_move_wait" msgstr "sledovaÅ¥ pohyb ÄakaÅ¥" #: src/conf.c msgid "track_speed" msgstr "rýchlosÅ¥ koľaje" #: src/conf.c msgid "track_stepsize" msgstr "sledovaÅ¥ kroky" #: src/conf.c msgid "track_generic_move" msgstr "sledovaÅ¥ generický Å¥ah" #: src/conf.c msgid "camera" msgstr "fotoaparát" #: src/conf.c msgid "camera_dir" msgstr "kamera dir" #: src/dbse.c msgid "Closing MySQL library" msgstr "Zatváranie knižnice MySQL" #: src/dbse.c msgid "Closing MariaDB library" msgstr "Zatvára sa knižnica MariaDB" #: src/dbse.c msgid "Database closed" msgstr "Databáza je zatvorená" #: src/dbse.c msgid "Initializing database" msgstr "Inicializácia databázy" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "" "Nemožno sa pripojiÅ¥ k databáze MySQL %s na hostiteľovi %s pomocou " "používateľa %s" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "Chyba MySQL bola %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "" "Nedá sa pripojiÅ¥ k databáze MariaDB %s na hostiteľovi %s s používateľom %s" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "Chyba MariaDB bola %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "Otvára sa databáza %s" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "Nedá sa otvoriÅ¥ SQLite3 databáza %s. Chyba %d: %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "ÄŒasový limit obsadenosti sa nastavuje na %d ms" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "Nastavenie Äasového limitu zaneprázdnenia zlyhalo. Chyba %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "Pripojenie na PostgreSQL '%s' chybné : %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "Typ databázy %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "Vykonáva sa dotaz MySQL" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "Dotaz MySQL zlyhal %s kód chyby %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "" "Problém so znovupripojením na MySql db %s host %s uživateľ %s MySQL chyba " "bol %s" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "Opätovné pripojenie k databáze MySQL '%s' bolo úspeÅ¡né" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "po opätovnom pripojení zlyhal dotaz MySQL %s kód chyby %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "Vykonáva sa dotaz MariaDB" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "Dotaz MariaDB zlyhal %s kód chyby %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "Nedá sa znova pripojiÅ¥ k databáze MariaDB %s na hostiteľovi %s s " "používateľom %s MariaDBchyba bola %s" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "Opätovné pripojenie k databáze MariaDB '%s' bolo úspeÅ¡né" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "po opätovnom pripojení zlyhal dotaz MariaDB %s kód chyby %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "Znovu pripojené k databáze PostgreSQL '%s'" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "Vykonáva sa dotaz PostgreSQL" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "Pokus o opätovné pripojenie k databáze PostgreSQL ' %s': %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "Dopyt PGSQL zlyhal: [%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "Prebieha %s" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "Chyba SQLite3 %d: %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "Ignorovanie prázdneho dotazu SQL" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "Nedá sa spustiÅ¥ externý príkaz '%s'" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "Spustenie externého príkazu '%s'" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "Zápis obrázku do súboru: %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "Zápis filmu do súboru: %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "Uložený obrázok do súboru: %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "Film bol uložený do súboru: %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "Problém vložiÅ¥ obrázok do video rúry" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "Problém vytvoriÅ¥ symbolickú linku [%s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "Chyba zápisu do rúry, chybný stav %d %s" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "Chyba zápisu do rúry, chybný stav %d %s" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "Pri vytváraní názvu ukážky %d %s sa vyskytla chyba" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "ZATVORENÉ: súbor extpipe desc %d, chybový stav %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "návrat výplaty: %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "Zdroj FPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "cesta filmu: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "nie sú práva na prístop do adresára %s" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "cesta nenájdená, pokúšam sa ju vytvoriÅ¥ %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "chyba prístupu na cestu %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "Chyba pri urÄovaní príkazového riadku: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "pipe: %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt-> moviefps: %d" #: src/event.c msgid "popen failed" msgstr "popen zlyhalo" #: src/event.c msgid "Using extpipe" msgstr "pužítie extpipe" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "Chyba zápisu do rúry, chybný stav %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "rúra %s nevytvorená, alebo už zatvorená " #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "Ogg kontajner už nie je podporovaný. Zmena na MPEG4" #: src/event.c msgid "Running test of the various output formats." msgstr "Bežiaci test rôznych výstupných formátov." #: src/event.c msgid "Error opening context for movie output." msgstr "Pri otváraní kontextu pre výstup filmu sa vyskytla chyba." #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffopen otvoriÅ¥ chybu pri vytváraní (pohybu) súboru [ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "" "Kontajner SWF pre Äasový odstup už nie je podporovaný. Použitie kontajnera " "mpg." #: src/event.c msgid "Timelapse using mpg codec." msgstr "Timelapse pužíva codec mpg." #: src/event.c msgid "Events will be appended to file" msgstr "UdalosÅ¥ bude zapísana do súboru" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "Timelapse pužíva codec mpeg4." #: src/event.c msgid "Events will be trigger new files" msgstr "Udalosti spustia nové súbory" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffopen_open chyba vytvorenia (timelapse) súboru [%s]" #: src/event.c msgid "Error encoding image" msgstr "Chyba kódovania obrázku" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "Chyba získania pamäte pre názov kodeku" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "Obnovovací kmitoÄet je príliÅ¡ veľký pre Å¡pecifikované ffmpeg video. Zmeň " "ffmpeg kontainer, alebo zníž obnovovací kmitoÄet." #: src/ffmpeg.c msgid "Error setting base file name" msgstr "Pri nastavovaní základného názvu súboru sa vyskytla chyba" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "Pri nastavovaní dodatku timelapse pre kodek %s sa vyskytla chyba" #: src/ffmpeg.c msgid "Error setting file name" msgstr "Chyba kódovania obrázku" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "volená hodnota kodeka %s nie je podporovaná" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "Nie je možné získaÅ¥ kodek" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "Chyba pri odosielaní rámca na kódovanie: %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "PrijaÅ¥ paket hodil EAGAIN vrátením -2 kód: %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "Chyba pri prijímaní kódovaného paketového videa: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "Chyba pri kódovaní videa: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "Chyba pri kódovaní videa" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "" "PTS % Základný PTS % ms interval % timebase %d- %d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "ZLÉ NAÄŒASOVANIE!! Rám bol preskoÄený." #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "" "PTS % Základný PTS % ms interval % timebase %d- %d " "Zmena %d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s kodek vbr / crf / bitová rýchlosÅ¥: %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "Preferovaný kodek %s bol zaradený na Äiernu listinu: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "Kodek %s nebol nájdený" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "Použitie kodeku %s" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "Nepodarilo sa prideliÅ¥ stream" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "Nepodarilo sa prideliÅ¥ kodek!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "Nízke fps. Kódovanie %d snímok do kontajnera %d snímok." #: src/ffmpeg.c msgid "Unable to set quality" msgstr "Nemožno nastaviÅ¥ kvalitu" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "Podporované hlásené FPS %d / %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "Nepodarilo sa otvoriÅ¥ kodek %s" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "Nepodarilo sa skopírovaÅ¥ parametre dekodéra !: %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "rám nemohol prideliÅ¥" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "Problém otvoriÅ¥ konfig. súbor %s" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "Chyba pri otváraní súboru %s" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "Prístup zamietnutý. %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "Chyba pri otváraní súboru %s" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "Nepodarilo sa zapísaÅ¥ hlaviÄku ffmpeg %s" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "Chyba pri vstupe do odtokového režimu: %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "Chyba pri vyprázdňovaní kodeku: %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "Chyba pri vyprázdňovaní videa" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "Chyba pri kódovaní obrázka" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "Chyba pri zápise videa" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet: %s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "Chyba pri zápise video snímky: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "Kontext RTSP nie je k dispozícii." #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "rtsp kamera nie je pripravená na prechod." #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "režim pass-through povolený. Zmena na kontajner MP4." #: src/ffmpeg.c msgid "Could not get codec!" msgstr "Nepodarilo sa získaÅ¥ kodek!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "Nie je možné kopírovaÅ¥ parametre kodeku" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "Prechod zakázaný. ffmpeg je príliÅ¡ starý" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "Priechodný tok sa otvoril" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "ffmpeg libavcodec verzia %d. %d. %d libavformat verzia %d. %d. %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "av lockmgr register zlyhal ( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "Nie sú zahrnuté žiadne funkcie ffmpeg" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "Vynulovanie registrov lockmgr zlyhalo pri vyÄistení" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "Nepodarilo sa priradiÅ¥ výstupný kontext" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "Passthru sa nepodarilo nastaviÅ¥!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "Stream sa nepodarilo nastaviÅ¥" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "Chyba pri preplachovaní kodeku" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "Nadmerné pokusy o vyÄistenie vyrovnávaného paketu" #: src/ffmpeg.c msgid "Buffered packet" msgstr "Vyrovnávací paket" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s: Daný buffer jpeg bol príliÅ¡ malý" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "Neplatné rozmery obrázka JPEG" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "VeľkosÅ¥ obrázka JPEG %dx %d, JPEG bolo %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "Prijatá neoÄakávaná udalosÅ¥ spätného volania s kamerou, 0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "" "Vysoká snímková frekvencia môže spôsobiÅ¥ problémy s expozíciou obrázkov" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "" "Ak automatická expozícia nefunguje, skúste použiÅ¥ nižšiu obnovovaciu " "frekvenciu." #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "Nepodarilo sa vytvoriÅ¥ zložku kamery MMAL %s" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "Kamera MMAL %s nemá výstupné porty" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "Nemožno povoliÅ¥ riadiaci port: chyba %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "Nastavenie bez vypnutia MMAL zlyhalo" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "video formát kamery nie je možné nastaviÅ¥" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "komponent fotoaparátu nebolo možné povoliÅ¥" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "Komponent kamery MMAL bol vytvorený" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "Vytvorenie fondu vyrovnávacej pamäte MMAL kamery zlyhalo" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "Vytvorenie frontu vyrovnávacej pamäte kamery MMAL zlyhalo" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "Požadovaný buffer %d sa nedá získaÅ¥ z frontu oblasti" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "Nepodarilo sa poslaÅ¥ vyrovnávaciu pamäť na port ( %d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "MMAL ZaÄiatok vlákna kamery ... pre kameru ( %s) %dx %d pri %d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "parametre fotoaparátu nebolo možné priradiÅ¥" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "Povolenie portu na zachytenie kamery MMAL zlyhalo" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "ZaÄatie snímania kamery MMAL zlyhalo" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "MMAL VyÄistenie kamery" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %d príznaky %08x veľkosÅ¥ %d / %d pri %08x, veľkosÅ¥ img = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "Nie je možné vrátiÅ¥ vyrovnávaciu pamäť na port videa kamery" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "Zmena veľkosti vyrovnávacej pamäte pred zachytením na %d položky" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "Odstránený súbor s ID procesu (súbor pid)." #: src/motion.c msgid "Error removing pid file" msgstr "Chyba pri odstraňovaní súboru pid" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "Zatvára sa logfile ( %s)." #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "Detegovaný pohyb – zaÄínajúca udalosÅ¥ %d." #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "Do filmu bolo pridané %d výplňové snímky" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "Nie je možné urÄiÅ¥ typ kamery (MMAL, Netcam, V4L2, BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "Otvorenie súboru masky na ochranu súkromia" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "Otvorenie súboru masky súkromia s vysokým rozlíšením" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "Chyba pri otváraní súboru masky %s" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "Nepodarilo sa preÄítaÅ¥ obrázok ochrany masky. Funkcia ochrany osobných " "údajov masky je zakázaná." #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "NaÄítal sa súbor ochrany osobných údajov masky \" %s \"." #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "Neplatná stupnica textu. Upravené na %d" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "Fotoaparát %d zaÄal: detekcia pohybu %s" #: src/motion.c msgid "Disabled" msgstr "invalidný" #: src/motion.c msgid "Enabled" msgstr "povolené" #: src/motion.c msgid "Pass-through processing disabled." msgstr "Spracovanie priechodu je zakázané." #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "Neplatné konfiguraÄné rozmery %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "Použitie predvolených rozmerov %dx %d" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "Požadovaná šírka obrázka ( %d) nie je modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "Šírka nastavenia na najbližšiu vyššiu, násobok 8 ( %d)." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "Požadovaná výška obrázka ( %d) nie je modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "Nastavenie výšky na najbližší vyšší násobok 8 ( %d)." #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "Nepodarilo sa naÄítaÅ¥ poÄiatoÄný obrázok z fotoaparátu" #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "Pohyb naÄalej používa šírku a výšku z konfiguraÄného súboru (súborov)" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "Pohyb podporuje iba šírku a výšku modulo 8" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "Požadovaná šírka obrázka ( %d) alebo výška ( %d) nie je modulo 8." #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "Pohyb podporuje iba šírku a výšku väÄÅ¡iu alebo rovnú 64 %dx %d" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "Substream nie je k dispozícii. Veľkosti obrázkov nie sú modulo 16." #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "" "obrazový formát webového servera nie je k dispozícii a nedarí sa mu vrátiÅ¥ " "späť do formátu JPEG" #: src/motion.c msgid "Error capturing first image" msgstr "Chyba pri zachytávaní prvého obrázka" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "Otváranie videozáberov pre normálne obrázky" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "Nepodarilo sa otvoriÅ¥ spätnú sluÄku videa pre bežné obrázky" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "Otváranie video sluÄky pre filmy" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "Nepodarilo sa otvoriÅ¥ spätnú sluÄku videa pre filmy" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "Nepodarilo sa preÄítaÅ¥ obrázok masky. Funkcia masky je zakázaná." #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "Maskfile \" %s \" je naÄítaný." #: src/motion.c msgid "Emulating motion" msgstr "Emulujúci pohyb" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "Bol detekovaný pohyb v oblasti %d." #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "Opakuje sa pokus, až kým sa nepripojí k fotoaparátu" #: src/motion.c msgid "Camera has become available." msgstr "Fotoaparát sa stal dostupným." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "ReÅ¡tartuje sa Motion.\n" "Požadovaná šírka obrázka (%d) alebo výška (%d) nie je modulo 8." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "ReÅ¡tartuje sa Motion.\n" "Pohyb podporuje iba šírku a výšku väÄÅ¡iu alebo rovnú 64 %dx%d" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "ReÅ¡tartuje sa Motion.\n" "Na fotoaparáte sa zmenila výška alebo šírka." #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "ReÅ¡tartuje sa Motion.\n" "Vysoké rozlíšenie fotoaparátu sa zmenilo." #: src/motion.c msgid "Video signal re-acquired" msgstr "Video signál bol znovu získaný" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "Závažná chyba obrazového zariadenia - zatvorenie obrazového zariadenia" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "" "ReÅ¡tartovaním vlákna vlákna sa inicializujú vÅ¡etky vyrovnávacie pamäte " "obrázkov" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "Video signál sa stratil - Pridáva sa sivý obrázok" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "Video signál stále stratený - Pokúša sa zatvoriÅ¥ video zariadenie" #: src/motion.c msgid "Lightswitch detected" msgstr "Bol zistený spínaÄ svetiel" #: src/motion.c msgid "Switchfilter detected" msgstr "Rozpoznaný prepínací filter" #: src/motion.c msgid "micro-lightswitch!" msgstr "micro-LightSwitch!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "Koniec udalosti %d" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "Nespracované zmeny: %5d - zmeny po ' %s': %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr "- menovky: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "Zmeny: %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr "- hladina hluku: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr "- prahová hodnota: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "Neplatný argument režimu timelapse ' %s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%: s Predvolené na manuálny režim timelapse" #: src/motion.c msgid "Thread exiting" msgstr "UkonÄenie vlákna" #: src/motion.c msgid "Motion going to daemon mode" msgstr "Pohyb prejde do režimu démona" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "UkonÄite pohyb, nemôžete vytvoriÅ¥ súbor ID procesu (súbor pid) %s" #: src/motion.c msgid "Could not change directory" msgstr "Adresár sa nepodarilo zmeniÅ¥" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "Vytvorený ID súboru procesu %s. ID procesu je %d" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "" "ID Camara nie sú jedineÄné alebo majú hodnoty vyÅ¡e 32 000. Spadá späť " "doÄísla nití" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2: k dispozícii" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2: nie je k dispozícii" #: src/motion.c msgid "bktr : available" msgstr "bktr: k dispozícii" #: src/motion.c msgid "bktr : not available" msgstr "bktr: nie je k dispozícii" #: src/motion.c msgid "webp : available" msgstr "webp: k dispozícii" #: src/motion.c msgid "webp : not available" msgstr "webp: nie je k dispozícii" #: src/motion.c msgid "mmal : available" msgstr "mmal: k dispozícii" #: src/motion.c msgid "mmal : not available" msgstr "mmal: nie je k dispozícii" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg: k dispozícii" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg: nie je k dispozícii" #: src/motion.c msgid "mysql : available" msgstr "mysql: k dispozícii" #: src/motion.c msgid "mysql : not available" msgstr "mysql: nie je k dispozícii" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB: k dispozícii" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB: nie je k dispozícii" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3: k dispozícii" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3: nie je k dispozícii" #: src/motion.c msgid "pgsql : available" msgstr "pgsql: k dispozícii" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql: nie je k dispozícii" #: src/motion.c msgid "nls : available" msgstr "nls: k dispozícii" #: src/motion.c msgid "nls : not available" msgstr "nls: nie je k dispozícii" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "Použitie predvolenej úrovne denníka ( %s) ( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "Prihlasovanie do súboru ( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "UkonÄite pohyb, nemôžete vytvoriÅ¥ súbor denníka %s" #: src/motion.c msgid "Logging to syslog" msgstr "Prihlasovanie do syslogu" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "Pohyb %s zaÄal" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "Použitie predvoleného typu denníka ( %s)" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "Použitie typu denníka ( %s) úroveň denníka ( %s)" #: src/motion.c msgid "Motion running as daemon process" msgstr "Pohyb beží ako proces démona" #: src/motion.c msgid "Motion running in setup mode." msgstr "Pohyb beží v nastavovacom režime." #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "ID kamery: %d je od %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "ID kamery: %d Názov kamery: %s Služba: %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "ID kamery: %d Názov kamery: %s Zariadenie: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "" "Streamujte Äíslo portu %d pre vlákno %d v konflikte s kontrolným portom" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "Funkcia toku pre vlákno %d je zakázaná." #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "Číslo portu prúdu %d pre vlákno %d je v konflikte s vláknom %d" #: src/motion.c msgid "Restarting motion." msgstr "Opätovné spustenie pohybu." #: src/motion.c msgid "Motion restarted" msgstr "Pohyb sa znova spustil" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "" "Vlákno %d - ÄŒasový limit strážneho psa. Pokúšam sa urobiÅ¥ elegantný reÅ¡tart" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "Vlákno %d - Timeout strážneho psa sa nereÅ¡tartoval a nezabil!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "Závit %d - ÄŒistiaca niÅ¥." #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "Vlákna DEBUG-1 s %d pohybovými vláknami s %d, dokonÄovacie %d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "ÄŒaká sa na dokonÄenie vlákien, pid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "Pohybové vlákno %d reÅ¡tartujte" #: src/motion.c msgid "Threads finished" msgstr "Vlákna skonÄili" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "UkonÄenie pohybu" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "Neplatná URL adresa. Nemožno analyzovaÅ¥ hodnoty." #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "ZaÄalo sa vlákno obsluhy fotoaparátu [ %d]" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "Uzatvára sa zásuvka netcam, keÄ je Äas Keep-Alive vyprÅ¡aný (kamera odoslala " "pole Close).malo by dôjsÅ¥ k opätovnému pripojeniu." #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "znovuotvorenie fotoaparátu (bez streamingu)" #: src/netcam.c msgid "camera re-connected" msgstr "kamera je znova pripojená" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "Nerozpoznaná hlaviÄka obrázka ( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "Chyba v hlaviÄke ( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "opätovné otvorenie kamery (streamovanie)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "Chyba pri získavaní obrázka vo formáte JPEG" #: src/netcam.c msgid "Trying to re-connect" msgstr "Pokúšam sa znova pripojiÅ¥" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "obsluha kamery netcam: dokonÄovacia sada, ukonÄenie" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "Žiadna odozva od obsluhy kamery - musí už zomrieÅ¥" #: src/netcam.c msgid "called with no data in buffer" msgstr "volaná bez údajov vo vyrovnávacej pamäti" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "SieÅ¥ová kamera zaÄína pre kameru ( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "Neplatný proxy servera netcam ( %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "Používateľské meno / heslo nie je povolené na proxy serveri" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "Neplatná služba netcam ' %s'" #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "Neplatná webová adresa netcam pre kameru ( %s)" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "Parameter http %s sa prevádza na príznaky: HTTP / 1.0: %s HTTP / 1.1: %s " "Keep-Živé %s." #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "teraz volá netcam setup html ()" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "teraz volá netcam setup ftp" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "teraz sa volá inÅ¡talaÄný súbor netcam ()" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "teraz volá netcam setup mjpg ()" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "Neplatná služba netcam '%s' - musí byÅ¥ mjpeg, ftp, mjpg alebo jpeg." #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "Nepodarilo sa preÄítaÅ¥ prvý obrázok - retval: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "zlyhanie dekompresie libjpeg na prvom snímke - vzdanie sa!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "Šírka / výška ( %dx %d) musí byÅ¥ násobkom 8" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "Pri spúšťaní vlákna obsluhy fotoaparátu [ %d] sa vyskytla chyba" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "recv zlyhalo v ftp získaÅ¥ viac" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "Odozva servera: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "odoslanie zlyhalo v ftp odoslaÅ¥ používateľa" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "odoslanie zlyhalo v ftp odoslaÅ¥ passwd" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "odoslanie zlyhalo v ftp quit" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "gethostbyname zlyhalo v ftp connect" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "nezhoda adresy gethostbyname v ftp connect" #: src/netcam_ftp.c msgid "socket failed" msgstr "soket zlyhal" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "Nepodarilo sa vytvoriÅ¥ pripojenie" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "FTP server so žiadosÅ¥ou o ACCT anonymne" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "nastavenie možnosti soketu SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "odoslanie zlyhalo v pripojení ftp" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "Neplatná odpoveÄ na PASV" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "Nepodarilo sa vytvoriÅ¥ dátové pripojenie" #: src/netcam_ftp.c msgid "bind failed" msgstr "väzba zlyhala" #: src/netcam_ftp.c msgid "listen failed" msgstr "poÄúvanie zlyhalo" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "odoslanie zlyhalo v zásuvke ftp" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "akceptovaÅ¥ v ftp get socket" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "V Äítaní ftp zlyhalo recv" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "FTP soket zlyhal" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "Chyba pri odosielaní TYPU I na ftp server" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "chybne tvarovaný token Content-Length, ale hodnota %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "Dĺžka obsahu %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "Typ obsahu %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "" "Pri Äítaní hlaviÄky obrázka sa vyskytla chyba, režim streamovania (1). " "Nulová hlaviÄka." #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "" "Pri Äítaní hlaviÄky obrázka sa vyskytla chyba, režim streamovania (1). " "Neznáma hlaviÄka '%s'" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "Chyba pri Äítaní hlaviÄky obrázka (2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "HlaviÄka nie je JPEG" #: src/netcam_http.c msgid "Content-Length 0" msgstr "Obsah-dĺžka 0" #: src/netcam_http.c msgid "Found image header record" msgstr "NaÅ¡iel sa záznam hlaviÄky obrázka" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "Pri odosielaní žiadosti o pripojenie doÅ¡lo k chybe" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "Prijatá prvá hlaviÄka (' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "Chyba pri Äítaní prvej hlaviÄky ( %s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "Výsledný kód HTTP %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "" "Odstránený príznak netcam Keep-Alive v dôsledku zjavného uzavretého " "pripojenia HTTP." #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "Neprúdová kamera (sada udržiavaná nažive)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "Neprúdová kamera (udržiavaná naživo nie je nastavená)" #: src/netcam_http.c msgid "Streaming camera" msgstr "Streamovanie kamery" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "HraniÄný reÅ¥azec [ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "HraniÄný reÅ¥azec sa nenaÅ¡iel v hlaviÄke" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "" "Streamujúca kamera pravdepodobne používa bloky MJPG, zvážte použitie " "mjpg: // webová adresa netcam." #: src/netcam_http.c msgid "Unrecognized content type" msgstr "Nerozpoznaný typ obsahu" #: src/netcam_http.c msgid "Content-length present" msgstr "Obsahová dĺžka je prítomná" #: src/netcam_http.c msgid "Content-length 0" msgstr "Obsahová dĺžka 0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "Found Conn: close header (' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "" "Prijali sa hlaviÄky „Connection: Keep-Alive“ a „Connection: close“.Pohyb " "odstraňuje udržovaÄ." #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "" "Prijali sa hlaviÄky „Connection: Keep-Alive“ a „Connection: close“.Pohyb " "pokraÄuje bez zmeny." #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "V tejto sade hlaviÄiek sme dostali pole Keep-Alive." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "Nebolo prijaté žiadne spojenie „Spojenie: ZachovaÅ¥ živé“ ani „Spojenie: " "zatvorené“. \n" " Pohyb odstraňuje udržovaÄ." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "Nebolo prijaté žiadne spojenie „Spojenie: ZachovaÅ¥ živé“ ani „Spojenie: " "zatvorené“. \n" " Pohyb pokraÄuje bez zmeny." #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "Odstránený príznak netcam Keep-Alive, pretože bola prijatá hlaviÄka " "'Connection: close'. \n" " Netcam nepodporuje Keep-Alive. Pohyb pokraÄuje non-Keep-Alive." #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "Keep-Alive dosiahol koniec platného obdobia. \n" " Pohyb sa zatvorí netcam, potom sa obnoví funkcia Keep-Alive s novou " "zásuvkou." #: src/netcam_http.c msgid "disconnect" msgstr "odpojiÅ¥" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo () zlyhalo ( %s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "odpojovací netcam (1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "odpojenie netcam, pretože udržanie nažive nie je nastavené." #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "bez udržania, pokus o vytvorenie soketu zlyhal." #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "bez udržania, nový soket vytvorený fd %d" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "s setalive set, neplatný socket.To by mohlo byÅ¥ prvýkrát. Vytvorenie anový " "zlyhal." #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "" "s setalive set, neplatný socket.To by mohlo byÅ¥ prvýkrát, vytvoril novýjeden " "s fd %d" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "Takže KEEPALIVE je %s" #: src/netcam_http.c msgid "ON" msgstr "ON" #: src/netcam_http.c msgid "OFF" msgstr "OFF" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "SO KEEPALIVE nastavený na pätici." #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "fcntl (1) na sokete" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "fcntl (2) na sokete" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "pripojenie () zlyhalo ( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "odpojovací netcam (4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "Äasový limit pri pripojení ()" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "odpojovací netcam (2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "getockopt po pripojení" #: src/netcam_http.c msgid "connect returned error" msgstr "chyba vrátenia pripojenia" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "odpojovací netcam (3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "expandujúci pufer z [ %d / %d] na [ %d / %d] bajtov." #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "" "Potenciálna hranica rozdelenia - %d znakov spláchnutých, %d premiestnených" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "recv () zlyhá po hraniÄnom reÅ¥azci" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "necháva netcam pripojený." #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "o pokuse o pripojenie, Äas # %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "Nepodarilo sa otvoriÅ¥ fotoaparát - skontrolujte svoju konfiguráciu a že " "sieÅ¥ová kamera je online" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "Pri Äítaní prvej hlaviÄky sa vyskytla chyba - skúste to znova" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "Nepodarilo sa preÄítaÅ¥ prvú hlaviÄku kamery - zatiaľ sa nevzdáva" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "Netcam má príznaky: HTTP / 1.0: %s HTTP / 1.1: %s Keep-Alive %s." #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "" "Odstránený príznak udržiavania siete netcam kvôli množine proxyUdržaÅ¥ nažive." #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "Nepodarilo sa preÄítaÅ¥ hlaviÄku prvého toku - zatiaľ sa nevzdávam" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "pripojený, pokraÄuje v Äítaní obrázka." #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "Chyba pri Äítaní, pokus o opätovné pripojenie." #: src/netcam_http.c msgid "lost the cam." msgstr "stratil kameru." #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "Doplnená vyrovnávacia pamäť s [ %d] bajtov zo siete." #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "Čítajte [ %d / %d] bajtov záhlavia." #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "Bola prijatá neplatná hlaviÄka, obnovuje sa pripojenie" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "OdÄítané [ %d / %d] chunk bajtov, celkom [ %d / %d]" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "Chunk kompletný, použitý pufer [ %d] bajtov." #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "Obrázok je kompletný, použitý buffer [ %d] bajtov." #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "pripojený, pokraÄuje v Äítaní a dekódovaní blokov MJPG." #: src/netcam_http.c msgid "Begin" msgstr "ZaÄaÅ¥" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "chyba stat ( %s)" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]! = posledný st mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "Äaká sa na vyprÅ¡anie Äasového limitu obrázka nového súboru" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "oneskorenie Äakania na nový obrázok" #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "spracovanie nového súboru - st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "chyba otvorenia ( %s): %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "chyba Äítania ( %s): %d" #: src/netcam_http.c msgid "End" msgstr "Koniec" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> súbor-> cesta %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "Nedostatok údajov z netcam." #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> jpeg chyba %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "*** nové pic oneskorenie úspeÅ¡né ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "Chyba jpeg %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "spracovanie obrázka JPEG - dĺžka obsahu %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "Nesúlad šírky a výšky kamery s obrázkom JPEG - oÄakávané %dx %d, JPEG %dx " "%dretval %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s: Zmenené pole paketov na %d" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s: av kópia paketu: %s, preruÅ¡enie: %s" #: src/netcam_rtsp.c msgid "True" msgstr "pravdivý" #: src/netcam_rtsp.c msgid "False" msgstr "nepravdivý" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: Paket s neplatnými údajmi sa ignoruje" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: Chyba rámca záznamu: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "Ignorovanie paketu s neplatnými údajmi" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "Chyba pri dekódovaní paketu: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "%s: Chyba pri prenose HW dekódovaného do systémovej pamäte" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "Chyba pri odosielaní paketu do kodeku: %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "Chyba pri dekódovaní video paketu: Kopírovanie do vyrovnávacej pamäte" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: HW zariadenia:" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s (k dispozícii)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s (neimplementované)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s: dekodér netcam %s je deaktivovaný." #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "Nepodarilo sa získaÅ¥ formát vaapi pix" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "Nepodarilo sa získaÅ¥ formát cuda pix" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s: preruÅ¡ené." #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: Zlyhalo" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s: Dekodér %s nefungoval." #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "%s: Ignorovanie a odstránenie dekodéra požadovaného používateľom %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s: Inicializácia dekodéra vaapi" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: Nedá sa nájsÅ¥ vaapi hw zariadenie" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s: Inicializácia dekodéra cuda" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: Nedá sa nájsÅ¥ cuda hw zariadenie" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s: Inicializácia dekodéra" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s: Použitie dekodéra %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: Dekodér je otvorený" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s: ÄŒasový limit Äítania kamery ( %s) vyprÅ¡al" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s: ÄŒasový limit fotoaparátu ( %s) vyprÅ¡al" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "Nemožno prideliÅ¥ swsframe v systéme Windows." #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "Nemožno prideliÅ¥ swsframe von." #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "Nie je možné priradiÅ¥ kontext mierky." #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "Chyba pri urÄovaní veľkosti rámca" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "Chyba pri alokácii obrázka za: %s" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "Chyba pri alokácii obrázka: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "Chyba pri zmene veľkosti / preformátovaní: %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "Chyba pri vkladaní rámca do výstupnej vyrovnávacej pamäte: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s: preruÅ¡ené" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: av rám na Äítanie: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: Nadmerný pokus o získanie údajov z kamery %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "%s: rýchlosÅ¥ snímania nie je uvedená v parametroch netcam. Použitie %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s: rýchlosÅ¥ snímania nie je uvedená v parametroch netcam. Použitie " "framerate %d" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "SieÅ¥ová kamera odosiela obrázky v inom" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "veľkosÅ¥ uvedená v konfigurácii a tiež a" #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "iný formát obrazu. Obrázok je" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "transkódované do YUV420P a do požadovanej veľkosti" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "v konfiguraÄnom súbore. Ak je to možné, zmeňte netcam na" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "byÅ¥ vo formáte YUV420P a požadovaná veľkosÅ¥ vo formáte" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "konfigurovaÅ¥ možné nižšie využitie CPU." #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "veľkosÅ¥, ako je uvedené v konfiguraÄnom súbore." #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "Obrázok sa prepisuje do veľkosti" #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "požadované v konfigurácii. Ak je to možné, zmena" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "netcam alebo konfigurácia oznaÄujúca rovnakú veľkosÅ¥" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "aby sa znížilo využitie procesora." #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "Netcam: %dx %d => Konfigurácia: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "Posiela sa obrázok" #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "transkódované na YUV420P. Ak je to možné, zmeňte netcam" #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "obrazový formát podľa YUV420P pre prípadné nižšie využitie procesora." #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: Nastavenie rtsp/rtmp" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: Nastavenie vstupného formátu mjpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: Nastavenie vstupného formátu video4linux2" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: Nastavenie súboru filmu" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s: Nastavenie %s" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: možnosÅ¥: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "Nastavenie v4l2 cez netcam" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "Nastavenie súboru cez netcam" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "Nastavenie %s cez netcam" #: src/netcam_rtsp.c msgid "highres" msgstr "vysoké rozlíšenie" #: src/netcam_rtsp.c msgid "norm" msgstr "norma" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "Nastavenie streamu %s." #: src/netcam_rtsp.c msgid "Unknown" msgstr "nevedno" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "Stream bol skopírovaný na odovzdanie" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "Na pripojenie preÅ¡la nulová cesta" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s: Nie je možné otvoriÅ¥ fotoaparát ( %s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s: Otvorená kamera ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s: Nepodarilo sa nájsÅ¥ informácie o streame: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s: Nie je možné otvoriÅ¥ kontext kodeku: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s: VeľkosÅ¥ obrázka z kamery je neplatná" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s: Nie je možné priradiÅ¥ rámec." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s: Nepodarilo sa skopírovaÅ¥ tok na odovzdanie." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s: Nepodarilo sa preÄítaÅ¥ prvý obrázok" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s: Kamera ( %s) je pripojená" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s: RýchlosÅ¥ snímania kamery Netcam je %d." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s: Zdroj fotoaparátu je %d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s: Nedá sa urÄiÅ¥ FPS zdroja fotoaparátu." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s: RýchlosÅ¥ snímania je nižšia ako FPS fotoaparátu." #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s: Vyskytnú sa chyby dekódovania." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "" "%s: odporúÄa sa snímacia frekvencia o nieÄo väÄÅ¡ia ako FPS fotoaparátu." #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s: Pripája sa k fotoaparátu ...." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s: Fotoaparát sa znova nepripojil." #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s: Kontrola kamery každých 10 sekúnd." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s: ZaÄalo sa vlákno obsluhy fotoaparátu [ %d]" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s: SluÄka obsluhy dokonÄená." #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s: Chyba pri spúšťaní vlákna obsluhy" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s: ÄŒaká sa na prvý obrázok od obsluhy." #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "nie je možné vytvoriÅ¥ kontext rtsp" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "nie je možné vytvoriÅ¥ vysoký kontext rtsp" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "Žiadna podpora FFmpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s: Vypína sa sieÅ¥ová kamera." #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s: Žiadna odozva od vlákna obsluhy." #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "Normálne rozlíšenie: Vypnutie je dokonÄené." #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "Vysoké rozlíšenie: vypnutie dokonÄené." #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "Nie je možné nastaviÅ¥ množinu EXIF ​​na webovú ÄasÅ¥" #: src/picture.c msgid "libwebp version error" msgstr "Chyba verzie libwebp" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "Chyba priradenia vyrovnávacej pamäte obrazového súboru libwebp" #: src/picture.c msgid "libwebp image compression error" msgstr "Chyba kompresie obrázka libwebp" #: src/picture.c msgid "unable to assemble webp image" msgstr "nie je možné zostaviÅ¥ obrázok webovej stránky" #: src/picture.c msgid "unable to save webp image to file" msgstr "obrázok webovej stránky sa nedá uložiÅ¥ do súboru" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "Obrázok sa nedá zapísaÅ¥ do súboru %s - skontrolujte prístupové práva do " "cieľového adresára \n" " Vlákno bude dokonÄené kvôli tejto fatálnej chybe" #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "Obrázok sa nedá zapísaÅ¥ do súboru %s" #: src/picture.c msgid "Error getting PGM vars." msgstr "Chyba pri získavaní PGM vars." #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "Toto nie je pgm súbor zaÄínajúci ' %s'" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "Magic %s: Šírka %s(%d): Výška %s(%d): MaxVal: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "Nepodarilo sa naÄítaÅ¥ obrazové údaje zo súboru pgm" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "Zadaný súbor masky nemá rovnakú veľkosÅ¥ ako obrázok z fotoaparátu." #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "Pokus o zmenu veľkosti masky z %dx %d na %dx %d" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "" "nedá sa zapísaÅ¥ súbor masky %s - skontrolujte prístupové práva do cieľového " "adresára" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "súbor masky %s nie je možné zapísaÅ¥" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "Nepodarilo sa zapísaÅ¥ predvolenú masku ako súbor pgm" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "Vytvára sa prázdna maska %s \n" " Upravte tento súbor a znova spustite pohyb, aby ste povolili funkciu masky" #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "KonfiguraÄná možnosÅ¥ \"otoÄiÅ¥ \" nie je násobkom 90: %d" #: src/track.c msgid "internal error" msgstr "vnútorná chyba" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "vnútorná chyba, %hu nie je známy typ stopy" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "port %s dev fd %i, motor %hu príkaz %hu dáta %hu" #: src/track.c msgid "Status byte timeout!" msgstr "ÄŒasový limit bajtu stavu!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "Pokúste sa otvoriÅ¥ sériové zariadenie %s" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "Nemožno otvoriÅ¥ sériové zariadenie %s" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "Nemožno inicializovaÅ¥ sériové zariadenie %s" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "Otvorené sériové zariadenie %sa inicializuje, fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "" "Zatiaľ nebolo spustené žiadne zariadenie %s, vyskúšajte krokové centrum ()" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "Nepodarilo sa inicializovaÅ¥ krokové zariadenie na %s, fd [ %i]." #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "uspieÅ¥, zariadenie spustené %s, fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "ODOSIELà port %s dev fd %i, motor %hu príkaz %hu dáta %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "Návrat príkazu %d" #: src/track.c msgid "Problem opening servo!" msgstr "Problém s otváraním servo!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d, cent-> y %d, reverseex %d, reversey %d manuálne %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d hodnota je mimo rozsahu! ( %d - %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "hodnota y %d je mimo rozsahu! ( %d - %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "X posun %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "X cent-> x %d, cent-> y %d, reverseex %d, reversey %d motorx %d dáta %d " "príkaz%d" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Y posun %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Y cent-> x %d, cent-> y %d, reverseex %d, reversey %d motory %d dáta %d " "príkaz%d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "X-posun %d, Y-posun %d, x-poloha %d. poloha y %d, reverzný index %d, " "reversey %d, zmena veľkosti %d" #: src/track.c msgid "Return byte timeout!" msgstr "ÄŒasový limit vrátenia bajtov!" #: src/track.c msgid "Unable to set camera speed" msgstr "Nie je možné nastaviÅ¥ rýchlosÅ¥ fotoaparátu" #: src/track.c msgid "succeed" msgstr "maÅ¥ úspech" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "Nepodarilo sa resetovaÅ¥ kameru pwc do východiskovej polohy! Dôvod" #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "zlyhalo VIDIOCPWCMPTGRANGE" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "Nepodarilo sa posunúť / nakloniÅ¥ kameru pwc! Dôvod" #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "Nepodarilo sa resetovaÅ¥ UVC kameru do východiskovej polohy! Dôvod" #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "Obnovenie UVC kamery do východiskovej polohy" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl querycontrol" #: src/track.c msgid "Getting camera range" msgstr "Dosah dosahu kamery" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "" "VSTUP PARAM ABS panvica min %d, panvica max %d, sklon min %d, sklon max %d" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "INPUT PARAM ABS X Angel %d, Y Angel %d" #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "Pre SET ABS presunúť X %d, presunúť Y %d" #: src/track.c msgid "Failed to move UVC camera!" msgstr "Nepohol sa UVC kamera!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "Nájdené MINMAX = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "Pred ABS Y Angel: x = %d, Y = %d," #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "Po ABS Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "" "Pre SET REL posúvanie min %d, posúvanie max %d, naklopenie min %d, " "naklopenie max %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "Pre pákový ovládaÄ SET REL Angel %d, sklon Angel %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "Pri pohybe SET REL X %d presuňte Y %d" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, kontrola S = %d, Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, kontrola S = %d, Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "Pred REL Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "Po REL Y Angel: x = %d, Y = %d" #: src/translate.c msgid "Language: English" msgstr "Jazyk angliÄtina" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "Nepodarilo sa prideliÅ¥ %llu bajtov pamäte!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "" "Výstraha! Funkcia %s sa pokúša zmeniÅ¥ veľkosÅ¥ bloku pamäte na %p na 0 bajtov!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "Nepodarilo sa zmeniÅ¥ veľkosÅ¥ bloku pamäte pri posunu %p na %llu bajtov " "(funkcia %s)!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "Pri vytváraní adresára %s sa vyskytol problém" #: src/util.c #, c-format msgid "creating directory %s" msgstr "vytvára sa prieÄinok %s" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "Chyba pri otváraní súboru %s v režime %s" #: src/util.c msgid "Error closing file" msgstr "Chyba pri zatváraní súboru" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbeventid} nie je podporovaný. Použite eventid." #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "neplatné kľúÄové slovo so Å¡pecifikátorom formátu %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "Názov vlákna %s sa nedá nastaviÅ¥" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "Verzia FFMPEG je príliÅ¡ stará. Zakázanie spracovania pass-through." #: src/util.c msgid "pass-through enabled." msgstr "prechod povolený." #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "Chyba pri nastavovaní parametra>%s <" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "Analyzované:>%s <>%s <" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "Analyzované:> redigované <> redigované <" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "Chyba pri analýze ovládacích prvkov parm nm: %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "Chyba pri analýze ovládacích prvkov parametra vl: %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "Chyba pri nastavovaní teploty: %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "Chyba pri reparácii ovládacích prvkov: %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "Analýza: %s" #: src/util.c msgid "Parsing: " msgstr "Analýza: " #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "Chyba pri analýze ovládacích prvkov: %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "Chyba: %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "Nové parametre netcam: %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "Nové parametre netcamu - vysoké parametre: %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "Nové parametre videa: %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "Nové parametre hlaviÄky webcontrol: %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "Nové parametre hlaviÄky webcontrol: " #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "Nové parametre hlaviÄky streamu: %s" #: src/util.c msgid "New stream_header_params: " msgstr "Nové parametre hlaviÄky streamu: " #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "Chyba programovania. Neznáma položka konfigurácie: %s " #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE Chyba nastavenia odtieňa [ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "do [ %d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE Chyba pri získaní odtieňa" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT Chyba nastavenia saturácie [ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT Chyba pri saturácii" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT Chyba pri nastavovaní kontrastu [ %d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT Chyba pri získavaní kontrastu" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "Jas METEORSBRIG [ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIG získava jas" #: src/video_bktr.c msgid "Not implemented" msgstr "Nie je implementovaný" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "Vstup zariadenia %d mimo rozsah (0-4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d neplatné - skúste zložiÅ¥ %d" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "" "BT848SFMT, Nie je možné nastaviÅ¥ vstupný formát, skúste to znova s ​​" "predvoleným nastavením" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "BT848SFMT, Vstupný formát nie je možné nastaviÅ¥ ako predvolený" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "Nepodarilo sa nastaviÅ¥ geometriu" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "do [ %d / %d] Norm. %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "Neplatná frekvencia [%ld] pre vstup zdroja [%i]" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "Frekvencia [%ld] Vstup zdroja [%i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "nastaviÅ¥ vstup [ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "nastaviÅ¥ vstupný formát [ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "nastaviÅ¥ geometriu [ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "Frekvencia je nastavená (zatiaľ nie je implementovaná" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "Tlmivý roztok na 3x" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "KalibraÄný tlmivý roztok na 3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap zlyhal" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "METEORCAPTUR pomocou jedinej metódy Zachytávanie chýb" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "Chyba pri snímaní pomocou jedinej metódy" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "Video zariadenie sa nepodarilo nájsÅ¥" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "Zatvára sa video zariadenie %s" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "Stále %d používateľov video zariadenia %s, takže ho teraz nezatvoríme" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "konfiguraÄná šírka obrázka ( %d) nie je modulo 8" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "konfiguraÄná výška obrázka ( %d) nie je modulo 8" #: src/video_bktr.c msgid "Stopping capture" msgstr "Zastavuje sa snímanie" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "" "Opakované použitie vstupov [ %s] [ %d, %d] Zmena metódy snímania METEOR CAP " "SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "VIDEO PALETTE YUV420P nastavenie normy imgs.size a imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "otvoriÅ¥ video zariadenie %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "otvoriÅ¥ tuner zariadenie %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "PoÅ¡kodený obraz ... pokraÄovaÅ¥" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "Poloha SOI upravená o %d bajtov." #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "volanie mmalcam Äistenie" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "volanie vyÄistenia netcam" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "volá netcam rtsp vyÄistenie" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "ÄŒistenie zariadenia V4L2" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "ÄŒistenie zariadenia BKTR" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "Žiadne Äistenie zariadenia fotoaparátu (MMAL, Netcam, V4L2, BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "Otvorenie vaÄky MMAL" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "Nepodarilo sa otvoriÅ¥ kameru MMAL" #: src/video_common.c msgid "Opening Netcam" msgstr "Otvára sa Netcam" #: src/video_common.c msgid "Netcam failed to open" msgstr "Netcam sa nepodarilo otvoriÅ¥" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Otvorenie Netcam RTSP" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Netcam RTSP sa nepodarilo otvoriÅ¥" #: src/video_common.c msgid "Opening V4L2 device" msgstr "Otvorenie zariadenia V4L2" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "Zariadenie V4L2 sa nepodarilo otvoriÅ¥" #: src/video_common.c msgid "Opening BKTR device" msgstr "Otváranie zariadenia BKTR" #: src/video_common.c msgid "BKTR device failed to open" msgstr "Zariadenie BKTR sa nepodarilo otvoriÅ¥" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "" "Nie je zadané žiadne zariadenie s fotoaparátom (MMAL, Netcam, V4L2, BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "Nepodarilo sa otvoriÅ¥ ' %s'" #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "Chyba pri urÄovaní vyrovnávacej pamäte: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "PoÄiatoÄný tlmivý roztok: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "Čítacia vyrovnávacia pamäť: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "nájdené video zariadenie ' %s' %d" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "%s otvorený ako výstup potrubia" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "Otvorenie %s, pretože výstup potrubia zlyhal" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "Pôvodná Å¡pecifikácia potrubia" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "Navrhované technické parametre potrubia" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "KoneÄné technické parametre potrubia" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "Pre zariadenie sa nenaÅ¡li žiadne ovládacie prvky" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "--------- --------- Controls" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr "Názov a rozsah ID V4L2" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "Chyba pri resetovaní používateľskej hodnoty" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "Opúšťate ovládací prvok %s \"%s\" nastavený na %d" #: src/video_v4l2.c msgid "Device not ready" msgstr "Zariadenie nie je pripravené" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "Nastavte ovládací prvok \" %s \" na hodnotu %d" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "nastavenie ovládacieho prvku %s \"%s\" na %d zlyhalo." #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "" "Hodnota možnosti ovládania %s %s je nižšia ako minimum. Použitie minimálneho " "%d " #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "" "Hodnota možnosti ovládania %s %s je nad maximom. Použitie maximálne %d " #: src/video_v4l2.c msgid "control type not supported yet" msgstr "typ ovládania zatiaľ nie je podporovaný" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "Nie je možné zadaÅ¥ dopyt %d. VIDIOC ENUMINPUT, ak používate vstup WEBCAM pre " "zmenuhodnota v conf o -1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "Meno = \" %s \", zadajte 0x %08X, stav %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "Meno = \" %s \", - TUNER" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "Meno = \" %s \" - FOTOAPARÃT" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "Chyba pri výbere vstupu %d VIDIOC S INPUT" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "Zariadenie nepodporuje Å¡pecifikáciu normy PAL / NTSC" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "- video Å¡tandard %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "Chyba pri výbere Å¡tandardnej metódy %d VIDIOC S STD" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "Video Å¡tandard je nastavený na NTSC" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "Video Å¡tandard je nastavený na SECAM" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "Video Å¡tandard je nastavený na PAL" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "tuner %d VIDIOC G TUNER" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "Nastavte tuner %d" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "freq %ul VIDIOC S FREQUENCY" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "Nastavte frekvenciu na %ul" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "Nedá sa použiÅ¥ %c%c%c%c (%dx%d)" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "Testovacia paleta %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "Kontrola veľkosti obrázka %dx%d s krokom %d" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "Zo zariadenia nebola poskytnutá žiadna hodnota kroku." #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "Šírka (%d) musí byÅ¥ menÅ¡ia ako krok (%d)" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "Šírka obrázka (%d) nie je násobkom kroku (%d)" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "Nemožná podmienka: Šírka (%d), Krok (%d), Na krok (%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "Šírka obrázka bude doplnená o %d bajtov" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "Úprava rozlíšenia od %ix %i do %ix %i." #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "Upravené rozlíšenie nie je modulo 8." #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "V konfiguraÄnom súbore zadajte inú paletu alebo šírku / výšku." #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "Chyba pri nastavovaní formátu pixelov." #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "Použitie palety %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "Prispôsobenie šírky ( %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "Nastavenie výšky ( %d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "Index konfiguraÄnej palety %d ( %s) pre %dx %d nefunguje." #: src/video_v4l2.c msgid "Supported palettes:" msgstr "Podporované palety:" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d - %s (komprimované: %d) ( %# x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "Vybratá paleta %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "Výber palety pre formát %s zlyhal" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "Nie je možné nájsÅ¥ kompatibilný formát palety." #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "" "Chyba pri požadovaní vyrovnávacích pamätí %d pre mapu pamäte. VIDIOC REQBUFS" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "mmap informácie: rámce = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "NedostatoÄná vyrovnávacia pamäť %d %s< >%s< >%s<" msgstr "Požadovaná neplatná akcia:> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "Národný jazyk : zapnutý" #: src/webu.c msgid "Native Language : off" msgstr "Národný jazyk : Vypnutý" #: src/webu.c msgid "Set the value to null/zero" msgstr "Nastavte hodnotu na null / nula" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "Ignorovanie pripojenia od: %s" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "Overenie zlyhalo z %s" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "Žiadny používateľ webcontrol: poskytnutý preukaz" #: src/webu.c msgid "No stream user:pass provided" msgstr "Žiadny používateľ prúdu: poskytnutý prístup" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "Neplatná odpoveÄ" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "Chyba pri pridávaní hlaviÄky webového ovládania %s %s" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "Chyba pri pridávaní hlaviÄky streamu %s %s" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "Požadovaná neplatná metóda: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "Pripojenie od: %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "odoslanie stránky zlyhalo %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "Streamovaný obrázok eÅ¡te nie je pripravený" #: src/webu.c msgid "Stream process requested to finish." msgstr "DokonÄil sa proces streamu." #: src/webu.c msgid "Send page failed." msgstr "Odoslanie stránky zlyhalo." #: src/webu.c msgid "Basic authentication: available" msgstr "Základné overenie: dostupné" #: src/webu.c msgid "Basic authentication: disabled" msgstr "Základné overenie totožnosti: vypnuté" #: src/webu.c msgid "Digest authentication: available" msgstr "Overenie totožnosti: dostupné" #: src/webu.c msgid "Digest authentication: disabled" msgstr "Overenie totožnosti: zakázané" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd libary príliÅ¡ starý ipv6 je deaktivovaný" #: src/webu.c msgid "IPV6: available" msgstr "IPV6: k dispozícii" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6: deaktivované" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd libary príliÅ¡ starý SSL / TLS vypnutý" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS: k dispozícii" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS: vypnuté" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "Pri Äítaní súboru kvôli podpore SSL / TLS sa vyskytla chyba." #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "Vyžaduje sa SSL / TLS, ale nebol poskytnutý žiadny certifikaÄný súbor. SSL / " "TLS je zakázané" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "" "Vyžaduje sa SSL / TLS, ale nebol poskytnutý žiadny súbor kľúÄov. SSL / TLS " "je zakázané" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "Spustenie webovej kontroly na porte %d" #: src/webu.c msgid "Unable to start MHD" msgstr "Nemožno spustiÅ¥ MHD" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "Spustená webová kontrola na porte %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "Spustený stream kamery %d na porte / ID kamery %d / %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "Spustil sa fotoaparát %d stream na porte %d" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "Spustenie vÅ¡etkých tokov kamier na porte %d" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "Spustenie prúdu kamery %d na porte %d" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "Nemožno spustiÅ¥ stream pre kameru %d" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "Vyžaduje sa duplikát portu %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "" "Neplatný max. PoÄet ips zámku webového ovládania. Nastavenie rovné 25. " #: src/webu_html.c msgid "Cameras" msgstr "Caméras" #: src/webu_html.c msgid "Camera" msgstr "Caméra" #: src/webu_html.c msgid "All" msgstr "Toutes" #: src/webu_html.c msgid "Action" msgstr "Action" #: src/webu_html.c msgid "Start Event" msgstr "Å tart udalostí" #: src/webu_html.c msgid "End Event" msgstr "Koniec udalostí" #: src/webu_html.c msgid "Snapshot" msgstr "Momentka" #: src/webu_html.c msgid "Change Configuration" msgstr "Zmena konfigurácie" #: src/webu_html.c msgid "Write Configuration" msgstr "Zápis konfigurácie" #: src/webu_html.c msgid "Tracking" msgstr "sledovanie" #: src/webu_html.c msgid "Pause" msgstr "Pauza" #: src/webu_html.c msgid "Start" msgstr "Å tart" #: src/webu_html.c msgid "Restart" msgstr "ReÅ¡tart" #: src/webu_html.c msgid "Quit" msgstr "prestaÅ¥" #: src/webu_html.c msgid "Help" msgstr "Pomoc" #: src/webu_html.c msgid "No Configuration Options" msgstr "Nie sú konfiguraÄné možnosti" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "Obmedzené konfiguraÄné možnosti" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "Rozšírené konfiguraÄné možnosti" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "ReÅ¡trikÄné konfiguraÄné možnosti" #: src/webu_html.c msgid "All Cameras" msgstr "VÅ¡etky kamery" #: src/webu_html.c msgid "Not running" msgstr "Nebežiace" #: src/webu_html.c msgid "Lost connection" msgstr "Strata pripojenia" #: src/webu_html.c msgid "Paused" msgstr "Pauza" #: src/webu_html.c msgid "Active" msgstr "Aktívne" #: src/webu_html.c msgid "Select option" msgstr "nastaviÅ¥ možnosti" #: src/webu_html.c msgid "Save" msgstr "Záapis" #: src/webu_html.c msgid "Pan/Tilt" msgstr "Rotácia / sklon" #: src/webu_html.c msgid "Absolute Change" msgstr "Absolútna zmena" #: src/webu_html.c msgid "Center" msgstr "Stred" #: src/webu_html.c msgid "Pan" msgstr "Rotácia" #: src/webu_html.c msgid "Tilt" msgstr "Sklon" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "Zadané neplatné vlákno: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "Neplatná adresa URL pre port Å¡pecifický pre kameru: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "" "URL pre vlákno 0 nie je platné pri použití súborov Å¡pecifických pre " "kameru .: %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "Chybná adresa URL pre port Å¡pecifický pre kameru: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "Nemožné dostaÅ¥ obrázok do stream-u." #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "MožnosÅ¥ ' %s' je odpisovaná. Nový názov voľby je '%s' " motion-release-4.6.0/po/sv.po000066400000000000000000003202471452402535500160670ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:37-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "%s efter version %s" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "Okänt konfigurationsalternativ \" %s \"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "Skrivar konfigurationsfilen till %s" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "Konfigfil %s hittades inte - försöker standard." #: src/conf.c msgid "Error getcwd" msgstr "Fel getcwd" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "kunde inte öppna configfile %s" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "Ogiltigt filnamn %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "Bearbetar trÃ¥d 0 - konfigurationsfil %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "Ingen konfigurationsfil att bearbeta med hjälp av standardvärden" #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "Skriva konfigurationsparametrar frÃ¥n alla filer ( %d):" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "TrÃ¥d %d - Konfigurera fil: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr "%-25s " #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "Bearbetar konfigurationsfilen %s" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "Kamerakatalogkonfigur %s hittades inte" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "Kamerakonfigur %s hittades inte" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "Bearbetar kamerakonfigur %s" #: src/conf.c msgid "daemon" msgstr "demon" #: src/conf.c msgid "setup_mode" msgstr "inställningsläge" #: src/conf.c msgid "pid_file" msgstr "pid-fil" #: src/conf.c msgid "log_file" msgstr "loggfil" #: src/conf.c msgid "log_level" msgstr "loggnivÃ¥" #: src/conf.c msgid "log_type" msgstr "loggtyp" #: src/conf.c msgid "quiet" msgstr "tyst" #: src/conf.c msgid "watchdog_tmo" msgstr "vakthund tmo" #: src/conf.c msgid "watchdog_kill" msgstr "vakthund dödar" #: src/conf.c msgid "native_language" msgstr "modersmÃ¥l" #: src/conf.c msgid "camera_name" msgstr "kamerans namn" #: src/conf.c msgid "camera_id" msgstr "kamera-id" #: src/conf.c msgid "target_dir" msgstr "mÃ¥l dir" #: src/conf.c msgid "video_device" msgstr "videoenhet" #: src/conf.c msgid "video_params" msgstr "videoparam" #: src/conf.c msgid "auto_brightness" msgstr "automatisk ljusstyrka" #: src/conf.c msgid "tuner_device" msgstr "tuner" #: src/conf.c msgid "roundrobin_frames" msgstr "roundrobin ramar" #: src/conf.c msgid "roundrobin_skip" msgstr "roundrobin hoppa över" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "roundrobin switchfilter" #: src/conf.c msgid "netcam_url" msgstr "netcam url" #: src/conf.c msgid "netcam_params" msgstr "nätkameror" #: src/conf.c msgid "netcam_high_url" msgstr "netcam hög url" #: src/conf.c msgid "netcam_high_params" msgstr "netcam high params" #: src/conf.c msgid "netcam_userpass" msgstr "netcam userpass" #: src/conf.c msgid "mmalcam_name" msgstr "mmalcam namn" #: src/conf.c msgid "mmalcam_params" msgstr "mmalcam params" #: src/conf.c msgid "width" msgstr "bredd" #: src/conf.c msgid "height" msgstr "höjd" #: src/conf.c msgid "framerate" msgstr "framerate" #: src/conf.c msgid "minimum_frame_time" msgstr "minsta bildtid" #: src/conf.c msgid "rotate" msgstr "rotera" #: src/conf.c msgid "flip_axis" msgstr "vändaxel" #: src/conf.c msgid "locate_motion_mode" msgstr "hitta rörelse-läge" #: src/conf.c msgid "locate_motion_style" msgstr "hitta rörelsestil" #: src/conf.c msgid "text_left" msgstr "text kvar" #: src/conf.c msgid "text_right" msgstr "texten rätt" #: src/conf.c msgid "text_changes" msgstr "textändringar" #: src/conf.c msgid "text_scale" msgstr "text skala" #: src/conf.c msgid "text_event" msgstr "texthändelse" #: src/conf.c msgid "emulate_motion" msgstr "emulera rörelse" #: src/conf.c msgid "pause" msgstr "paus" #: src/conf.c msgid "threshold" msgstr "tröskel" #: src/conf.c msgid "threshold_maximum" msgstr "tröskel maximalt" #: src/conf.c msgid "threshold_tune" msgstr "tröskeljustering" #: src/conf.c msgid "noise_level" msgstr "ljudnivÃ¥" #: src/conf.c msgid "noise_tune" msgstr "bullernivÃ¥" #: src/conf.c msgid "despeckle_filter" msgstr "avfästningsfilter" #: src/conf.c msgid "area_detect" msgstr "omrÃ¥desdetektera" #: src/conf.c msgid "mask_file" msgstr "maskfil" #: src/conf.c msgid "mask_privacy" msgstr "mask sekretess" #: src/conf.c msgid "smart_mask_speed" msgstr "smart maskhastighet" #: src/conf.c msgid "lightswitch_percent" msgstr "ljusbrytare procent" #: src/conf.c msgid "lightswitch_frames" msgstr "Ljusbrytare ramar" #: src/conf.c msgid "minimum_motion_frames" msgstr "lägsta rörelsesramar" #: src/conf.c msgid "event_gap" msgstr "händelse gap" #: src/conf.c msgid "pre_capture" msgstr "före fÃ¥ngst" #: src/conf.c msgid "post_capture" msgstr "efter fÃ¥ngst" #: src/conf.c msgid "on_event_start" msgstr "vid händelsestart" #: src/conf.c msgid "on_event_end" msgstr "vid slutet av evenemanget" #: src/conf.c msgid "on_picture_save" msgstr "pÃ¥ bild spara" #: src/conf.c msgid "on_area_detected" msgstr "pÃ¥ detekterat omrÃ¥de" #: src/conf.c msgid "on_motion_detected" msgstr "pÃ¥ rörelse upptäckt" #: src/conf.c msgid "on_movie_start" msgstr "vid filmstart" #: src/conf.c msgid "on_movie_end" msgstr "pÃ¥ film slut" #: src/conf.c msgid "on_camera_lost" msgstr "pÃ¥ kameran förlorad" #: src/conf.c msgid "on_camera_found" msgstr "pÃ¥ kameran hittades" #: src/conf.c msgid "picture_output" msgstr "bildutgÃ¥ng" #: src/conf.c msgid "picture_output_motion" msgstr "bildutgÃ¥ngsrörelse" #: src/conf.c msgid "picture_type" msgstr "bildtyp" #: src/conf.c msgid "picture_quality" msgstr "bildkvalitet" #: src/conf.c msgid "picture_exif" msgstr "bild exif" #: src/conf.c msgid "picture_filename" msgstr "bildnamn" #: src/conf.c msgid "snapshot_interval" msgstr "snapshot-intervall" #: src/conf.c msgid "snapshot_filename" msgstr "snapshot filnamn" #: src/conf.c msgid "movie_output" msgstr "filmutgÃ¥ng" #: src/conf.c msgid "movie_output_motion" msgstr "film utgÃ¥ngsrörelse" #: src/conf.c msgid "movie_max_time" msgstr "film max tid" #: src/conf.c msgid "movie_bps" msgstr "film bps" #: src/conf.c msgid "movie_quality" msgstr "filmkvalitet" #: src/conf.c msgid "movie_codec" msgstr "film codec" #: src/conf.c msgid "movie_duplicate_frames" msgstr "filmer dubbla ramar" #: src/conf.c msgid "movie_passthrough" msgstr "film genomgÃ¥ng" #: src/conf.c msgid "movie_filename" msgstr "filnamn" #: src/conf.c msgid "movie_extpipe_use" msgstr "användning av filmuttag" #: src/conf.c msgid "movie_extpipe" msgstr "filmuttag" #: src/conf.c msgid "timelapse_interval" msgstr "timelapse-intervall" #: src/conf.c msgid "timelapse_mode" msgstr "timelapse-läge" #: src/conf.c msgid "timelapse_fps" msgstr "timelapse fps" #: src/conf.c msgid "timelapse_codec" msgstr "timelapse codec" #: src/conf.c msgid "timelapse_filename" msgstr "timelapse filnamn" #: src/conf.c msgid "video_pipe" msgstr "videorör" #: src/conf.c msgid "video_pipe_motion" msgstr "video rörelse" #: src/conf.c msgid "webcontrol_port" msgstr "webbkontrollport" #: src/conf.c msgid "webcontrol_ipv6" msgstr "webbkontroll ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "webbkontroll localhost" #: src/conf.c msgid "webcontrol_parms" msgstr "webbkontrollparmer" #: src/conf.c msgid "webcontrol_interface" msgstr "webbkontrollgränssnitt" #: src/conf.c msgid "webcontrol_auth_method" msgstr "metod för webbkontroll" #: src/conf.c msgid "webcontrol_authentication" msgstr "verifiering av webbkontroll" #: src/conf.c msgid "webcontrol_tls" msgstr "webbkontroll tls" #: src/conf.c msgid "webcontrol_cert" msgstr "webcontrol cert" #: src/conf.c msgid "webcontrol_key" msgstr "webbkontrollnyckel" #: src/conf.c msgid "webcontrol_header_params" msgstr "webbkontrollhuvudparametrar" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "webbkontrolllÃ¥s minuter" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "webbkontroll lÃ¥s försök" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "webbkontroll lÃ¥s max ips" #: src/conf.c msgid "stream_port" msgstr "strömport" #: src/conf.c msgid "stream_localhost" msgstr "strömma localhost" #: src/conf.c msgid "stream_auth_method" msgstr "ström autorisationsmetod" #: src/conf.c msgid "stream_authentication" msgstr "strömautentisering" #: src/conf.c msgid "stream_tls" msgstr "ström tls" #: src/conf.c msgid "stream_header_params" msgstr "strömma rubrikparametrar" #: src/conf.c msgid "stream_preview_scale" msgstr "strömmen för förhandsgranskning" #: src/conf.c msgid "stream_preview_newline" msgstr "strömmen förhandsvisning av ny linje" #: src/conf.c msgid "stream_preview_method" msgstr "stream preview-metod" #: src/conf.c msgid "stream_quality" msgstr "strömkvalitet" #: src/conf.c msgid "stream_grey" msgstr "ström grÃ¥" #: src/conf.c msgid "stream_motion" msgstr "strömma rörelse" #: src/conf.c msgid "stream_maxrate" msgstr "ström maxrate" #: src/conf.c msgid "stream_limit" msgstr "strömgräns" #: src/conf.c msgid "database_type" msgstr "databastyp" #: src/conf.c msgid "database_dbname" msgstr "databas dbname" #: src/conf.c msgid "database_host" msgstr "databasvärd" #: src/conf.c msgid "database_port" msgstr "databasport" #: src/conf.c msgid "database_user" msgstr "databasanvändare" #: src/conf.c msgid "database_password" msgstr "databaslösenord" #: src/conf.c msgid "database_busy_timeout" msgstr "timeout för databas upptagen" #: src/conf.c msgid "sql_log_picture" msgstr "SQL loggbild" #: src/conf.c msgid "sql_log_snapshot" msgstr "SQL-stillbildsbild" #: src/conf.c msgid "sql_log_movie" msgstr "SQL logfilm" #: src/conf.c msgid "sql_log_timelapse" msgstr "sql log timelapse" #: src/conf.c msgid "sql_query_start" msgstr "sql frÃ¥ga start" #: src/conf.c msgid "sql_query_stop" msgstr "sql frÃ¥gestopp" #: src/conf.c msgid "sql_query" msgstr "SQL-frÃ¥ga" #: src/conf.c msgid "track_type" msgstr "spÃ¥r typ" #: src/conf.c msgid "track_auto" msgstr "spÃ¥ra auto" #: src/conf.c msgid "track_port" msgstr "spÃ¥rport" #: src/conf.c msgid "track_motorx" msgstr "spÃ¥rmotor" #: src/conf.c msgid "track_motorx_reverse" msgstr "spÃ¥r motorx bakÃ¥t" #: src/conf.c msgid "track_motory" msgstr "spÃ¥rmotor" #: src/conf.c msgid "track_motory_reverse" msgstr "spÃ¥r motory reverse" #: src/conf.c msgid "track_maxx" msgstr "spÃ¥r maxx" #: src/conf.c msgid "track_minx" msgstr "spÃ¥r minx" #: src/conf.c msgid "track_maxy" msgstr "spÃ¥r maxy" #: src/conf.c msgid "track_miny" msgstr "spÃ¥ra miny" #: src/conf.c msgid "track_homex" msgstr "spÃ¥ra homex" #: src/conf.c msgid "track_homey" msgstr "spÃ¥ra hemma" #: src/conf.c msgid "track_iomojo_id" msgstr "spÃ¥r iomojo id" #: src/conf.c msgid "track_step_angle_x" msgstr "spÃ¥r stegvinkel x" #: src/conf.c msgid "track_step_angle_y" msgstr "spÃ¥r stegvinkel y" #: src/conf.c msgid "track_move_wait" msgstr "spÃ¥r flytta vänta" #: src/conf.c msgid "track_speed" msgstr "spÃ¥rhastighet" #: src/conf.c msgid "track_stepsize" msgstr "spÃ¥ra stegstorlek" #: src/conf.c msgid "track_generic_move" msgstr "spÃ¥ra generiska drag" #: src/conf.c msgid "camera" msgstr "kamera" #: src/conf.c msgid "camera_dir" msgstr "kamera dir" #: src/dbse.c msgid "Closing MySQL library" msgstr "Stänger MySQL -bibliotek" #: src/dbse.c msgid "Closing MariaDB library" msgstr "Stänger MariaDB -biblioteket" #: src/dbse.c msgid "Database closed" msgstr "Databasen stängd" #: src/dbse.c msgid "Initializing database" msgstr "Initiera databasen" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "" "Det gÃ¥r inte att ansluta till MySQL-databasen %s pÃ¥ värden %s med användaren " "%s" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "MySQL-felet var %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "" "Kan inte ansluta till MariaDB -databasen %s pÃ¥ värd %s med användaren %s" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "MariaDB -felet var %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "Öppnar databasen %s" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "Kan inte öppna SQLite3-databasen %s. Fel %d: %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "Ställer in upptaget timeout till %d msec" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "Det gick inte att ställa in timeout för upptaget. Fel %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "Anslutning till PostgreSQL-databasen ' %s' misslyckades: %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "Databastyp %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "Kör MySQL -frÃ¥ga" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "MySQL -frÃ¥gan misslyckades %s felkod %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "" "Det gÃ¥r inte att ansluta till MySQL-databasen %s pÃ¥ värden %s med användaren " "%s MySQL-feletvar %s" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "Ã…teranslutning till MySQL-databasen '%s' Lyckas" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "efter Ã¥teranslutning misslyckades MySQL-frÃ¥gan %s felkod %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "Kör MariaDB -frÃ¥ga" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "MariaDB -frÃ¥gan misslyckades %s felkod %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "Kan inte Ã¥teransluta till MariaDB -databasen %s pÃ¥ värd %s med användaren %s " "MariaDBfelet var %s" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "Ã…teranslutning till MariaDB-databasen '%s' Lyckas" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "efter Ã¥teranslutning misslyckades MariaDB-frÃ¥gan %s felkod %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "Ã…teransluter till PostgreSQL-databasen '%s'" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "Kör PostgreSQL -frÃ¥ga" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "Försöker Ã¥teransluta till PostgreSQL -databasen ' %s': %s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "PGSQL-frÃ¥gan misslyckades: [%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "Kör %s" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "SQLite3-fel %d: %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "Ignorerar tom sql-frÃ¥ga" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "Det gick inte att starta externt kommando ' %s'" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "Utför externt kommando ' %s'" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "Skriva bild till fil: %s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "Skriva film till fil: %s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "Sparad bild i filen: %s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "Sparad film i filen: %s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "Det gick inte att sätta bilden i videopipan" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "Det gick inte att skapa symbolisk länk [ %s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "Fel vid skapandet av förhandsgranskningsrörets namn %d %s" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "Fel vid skapande av filnamnbas %d %s" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "Fel vid skapande av förhandsgranskningsnamn %d %s" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "STÄNGNING: extpipe-fil desc %d, feltillstÃ¥nd %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "pclose return: %d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "Källa FPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "filmväg: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "ingen skrivÃ¥tkomst till mÃ¥lkatalogen %s" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "sökväg inte hittad, försöker skapa den %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "fel vid anslutning till sökväg %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "Fel vid specificering av kommandorad: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "rör: %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt-> moviefps: %d" #: src/event.c msgid "popen failed" msgstr "popen misslyckades" #: src/event.c msgid "Using extpipe" msgstr "Använd extpipe" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "Fel vid skrivning i röret, ange fel %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "pipe %s har inte skapats eller stängts redan" #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "Ogg-behÃ¥llaren stöds inte längre. Ändrar till mpeg4" #: src/event.c msgid "Running test of the various output formats." msgstr "Körningstest av de olika utgÃ¥ngsformaten." #: src/event.c msgid "Error opening context for movie output." msgstr "Fel vid öppning av kontext för filmutdata." #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffopen öppet fel skapande (rörelse) fil [ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "Swf-behÃ¥llaren för timelapse stöds inte längre. Använda mpg-behÃ¥llare." #: src/event.c msgid "Timelapse using mpg codec." msgstr "Timelapse med mpg-codec." #: src/event.c msgid "Events will be appended to file" msgstr "Händelser läggs till i filen" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "Timelapse med mpeg4-codec." #: src/event.c msgid "Events will be trigger new files" msgstr "Händelser kommer att utlösa nya filer" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffopen öppet fel skapande (timelapse) fil [ %s]" #: src/event.c msgid "Error encoding image" msgstr "Fel vid kodning av bild" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "Det gick inte att tilldela minne för codec-namn" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "Den angivna bildhastigheten är för hög för den angivna filtypen ffmpeg.Välj " "en annan ffmpeg-behÃ¥llare eller lägre framerate." #: src/ffmpeg.c msgid "Error setting base file name" msgstr "Fel vid inställning av basfilnamn" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "Fel vid inställning av timelapse-append för codec %s" #: src/ffmpeg.c msgid "Error setting file name" msgstr "Fel vid inställning av filnamn" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "codec-alternativets värde %s stöds inte" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "Det gick inte att hämta codec" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "Fel vid skickning av ram för kodning: %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "Mottagande paket kastade EAGAIN returnerar -2-kod: %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "Fel vid mottagning av kodat paketvideo: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "Fel vid kodning av video: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "Fel vid kodning av video" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "PTS % Bas PTS % ms intervall % tidsbas %d- %d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "DÃ…LIG TAJMING!! Ramen hoppade över." #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "" "PTS % Bas PTS % ms intervall % tidsbas %d- %d Ändra%d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr "%s codec vbr / crf / bit rate: %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "Föredragen codec %s har svartlistats: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "Codec %s hittades inte" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "Med hjälp av codec %s" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "Det gick inte att tilldela strömmen" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "Det gick inte att tilldela codec!" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "LÃ¥ga fps. Kodning av %d ramar i en %d rambehÃ¥llare." #: src/ffmpeg.c msgid "Unable to set quality" msgstr "Det gÃ¥r inte att ställa in kvalitet" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "Rapporterat FPS-stöd %d/ %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "Det gick inte att öppna codec %s" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "Det gick inte att kopiera avkodningsparametrar !: %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "kunde inte tilldela ram" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "kunde inte tilldela buffertar %s" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "fel öppnar filen %s" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "Ã…tkomst nekad. %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "Fel vid öppning av fil %s" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "Det gick inte att skriva ffmpeg-rubriken %s" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "Fel vid inmatning av dräneringsläge: %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "Fel vid tömning av codec: %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "Fel vid skrivning av tömning av videoram" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "Fel vid kodning av bild" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "Fel vid skrivning av videoram" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet: %s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "Fel vid skrivning av videoram: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "RTSP-sammanhang inte tillgängligt." #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "rtsp-kamera är inte redo för genomgÃ¥ng." #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "genomgÃ¥ngsläge aktiverat. Byter till MP4-behÃ¥llare." #: src/ffmpeg.c msgid "Could not get codec!" msgstr "Det gick inte att fÃ¥ codec!" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "Det gÃ¥r inte att kopiera codec-parametrar" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "GenomgÃ¥ng avstängd. ffmpeg för gammal" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "GenomgÃ¥ngsströmmen öppnades" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "ffmpeg libavcodec version %d. %d. %d libavformat version %d. %d. %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "av lockmgr-register misslyckades ( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "Ingen ffmpeg-funktion ingÃ¥r" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "av lockmgr registerställning misslyckades vid sanering" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "Det gick inte att tilldela utgÃ¥ngskontext" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "Det gick inte att ställa in passthru!" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "Det gick inte att ställa in strömmen" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "Fel vid spolning av codec" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "För stora försök att rensa buffertpaket" #: src/ffmpeg.c msgid "Buffered packet" msgstr "Buffrat paket" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr "%s: Givet jpeg-buffert var för liten" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "Ogiltiga JPEG-bilddimensioner" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "JPEG-bildstorlek %dx %d, JPEG var %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "Mottog oväntat Ã¥teruppringningshändelse för kamerakontroll, 0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "En hög bildfrekvens kan orsaka problem med exponering av bilder" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "Om autoexponering inte fungerar, prova en lägre bildhastighet." #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "Det gick inte att skapa MMAL-kamerakomponent %s" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "MMAL-kamera %s har inte utgÃ¥ngsportar" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "Det gÃ¥r inte att aktivera kontrollporten: fel %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "MMAL-inställningen för ingen stoppning misslyckades" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "kameravideoformatet kunde inte ställas in" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "kamerakomponenten kunde inte aktiveras" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "MMAL-kamerakomponent skapad" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "MMAL-kamerabuffertpool skapades misslyckades" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "MMAL-kamerabuffertkö skapades misslyckades" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "Det gick inte att fÃ¥ en nödvändig buffert %d frÃ¥n poolkön" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "Det gick inte att skicka en buffert till porten ( %d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "MMAL KameratrÃ¥d startar ... för kamera ( %s) pÃ¥ %dx %d vid %d fps" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "kameraparam kunde inte tilldelas" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "MMAL-kamerainspelningsporten aktiverade misslyckades" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "MMAL-kamerafÃ¥ngstart misslyckades" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "MMAL Kamerorengöring" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd %d flaggor %08x storlek %d / %d vid %08x, img storlek = %d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "Det gÃ¥r inte att returnera en buffert till kamerans videoport" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "Ändra storleken pÃ¥ pre capture-bufferten till %d objekt" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "Borttagen process-id-fil (pid-fil)." #: src/motion.c msgid "Error removing pid file" msgstr "Fel vid borttagning av pid-fil" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "Stäng loggfil ( %s)." #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "Rörelse upptäckt - starthändelse %d." #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "Lade till %d fillerframes i filmen" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "Det gÃ¥r inte att fastställa kameratyp (MMAL, Netcam, V4L2, BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "Öppna sekretessmaskfilen" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "Öppnar fil med högupplösta sekretess" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "Fel vid öppning av maskfil %s" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "" "Det gick inte att läsa maskens sekretessbild. Funktionen Mask sekretess " "inaktiverad." #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "Mask sekretessfil \" %s \" laddad." #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "Ogiltig textskala. Justerat till %d" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "Kameran %d startade: rörelsedetektering %s" #: src/motion.c msgid "Disabled" msgstr "Inaktiverad" #: src/motion.c msgid "Enabled" msgstr "Aktiverad" #: src/motion.c msgid "Pass-through processing disabled." msgstr "GenomgÃ¥ngsbehandling avaktiverad." #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "Ogiltiga konfigurationsdimensioner %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "Använda standarddimensioner %dx %d" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "Bildbredd ( %d) som begärs är inte modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "Justera bredden till nästa högre multipel av 8 ( %d)." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "Bildhöjd ( %d) begärd är inte modulo 8." #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "Justera höjden till nästa högre multipel av 8 ( %d)." #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "Det gick inte att hämta den första bilden frÃ¥n kameran" #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "" "Rörelse fortsätter att använda bredd och höjd frÃ¥n konfigurationsfil (er)" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "Rörelse stöder endast bredd- och höjdmodulo 8" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "Bildbredd ( %d) eller höjd ( %d) som begärs är inte modulo 8." #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Rörelse stöder endast bredd och höjd större än eller lika med 64 %dx %d" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "Underströmmen är inte tillgänglig. Bildstorlekar inte modulo 16." #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "webp-bildformat är inte tillgängligt, och gÃ¥r inte tillbaka till jpeg" #: src/motion.c msgid "Error capturing first image" msgstr "Fel vid inspelning av första bilden" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "Öppna video loopback-enhet för vanliga bilder" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "Det gick inte att öppna video loopback för vanliga bilder" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "Öppna video loopback-enhet för film" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "Det gick inte att öppna video loopback för filmer" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "Det gick inte att läsa maskbilden. Maskfunktionen är inaktiverad." #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "Maskfilen \" %s \" laddad." #: src/motion.c msgid "Emulating motion" msgstr "Efterliknande rörelse" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "Rörelse i omrÃ¥de %d upptäckt." #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "Försöker igen tills framgÃ¥ngsrik anslutning med kameran" #: src/motion.c msgid "Camera has become available." msgstr "Kameran har blivit tillgänglig." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "Startar om rörelse.\n" "Den begärda bildens bredd (%d) eller höjd (%d) är inte modulo 8." #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "Startar om rörelse.\n" "Rörelse stöder endast bredd och höjd större än eller lika med 64 %dx%d" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "Startar om rörelse.\n" "Höjd eller bredd har ändrats pÃ¥ kameran." #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "Startar om rörelse.\n" "Hög upplösning har ändrats pÃ¥ kameran." #: src/motion.c msgid "Video signal re-acquired" msgstr "Ã…tervinnad videosignal" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "Dödligt fel i videoenhet - Stängning av videoenhet" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "Starta om rörelsetrÃ¥d för att Ã¥terinitiera alla bildbuffertar" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "Förlust av videosignal - lägger till grÃ¥ bild" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "Videosignalen fortfarande förlorad - Försöker stänga videoenheten" #: src/motion.c msgid "Lightswitch detected" msgstr "Ljusbrytare upptäckt" #: src/motion.c msgid "Switchfilter detected" msgstr "Switchfilter upptäckt" #: src/motion.c msgid "micro-lightswitch!" msgstr "mikro-light!" #: src/motion.c #, c-format msgid "End of event %d" msgstr "Händelsens slut %d" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "RÃ¥ förändringar: %5d - förändringar efter ' %s': %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr "- etiketter: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "Ändringar: %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr "- ljudnivÃ¥: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr "- tröskel: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "Ogiltigt argument för tidsinställningsläge ' %s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr "%: s Standardinställning till manuellt timelapse-läge" #: src/motion.c msgid "Thread exiting" msgstr "TrÃ¥d spännande" #: src/motion.c msgid "Motion going to daemon mode" msgstr "Rörelse gÃ¥r till daemonläge" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "Avsluta rörelse, kan inte skapa process-id-fil (pid-fil) %s" #: src/motion.c msgid "Could not change directory" msgstr "Det gick inte att ändra katalogen" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "Skapad process-id-fil %s. Process-ID är %d" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "" "Camara-ID: er är inte unika eller har värden över 32 000. Faller tillbaka " "tilltrÃ¥dnummer" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2: tillgänglig" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2: inte tillgänglig" #: src/motion.c msgid "bktr : available" msgstr "bktr: tillgängligt" #: src/motion.c msgid "bktr : not available" msgstr "bktr: inte tillgängligt" #: src/motion.c msgid "webp : available" msgstr "webp: tillgänglig" #: src/motion.c msgid "webp : not available" msgstr "webp: inte tillgänglig" #: src/motion.c msgid "mmal : available" msgstr "mmal: tillgänglig" #: src/motion.c msgid "mmal : not available" msgstr "mmal: ej tillgänglig" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg: tillgängligt" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg: inte tillgänglig" #: src/motion.c msgid "mysql : available" msgstr "mysql: tillgänglig" #: src/motion.c msgid "mysql : not available" msgstr "mysql: inte tillgänglig" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB: tillgänglig" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB: inte tillgänglig" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3: tillgänglig" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3: ej tillgänglig" #: src/motion.c msgid "pgsql : available" msgstr "pgsql: tillgängligt" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql: inte tillgänglig" #: src/motion.c msgid "nls : available" msgstr "nls: tillgängligt" #: src/motion.c msgid "nls : not available" msgstr "nls: inte tillgänglig" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "Med standardloggnivÃ¥ ( %s) ( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "Loggar till fil ( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "Avsluta rörelse, kan inte skapa loggfil %s" #: src/motion.c msgid "Logging to syslog" msgstr "Loggar till syslog" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "Rörelse %s började" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "Med standardloggtyp ( %s)" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "Använd loggtyp ( %s) loggnivÃ¥ ( %s)" #: src/motion.c msgid "Motion running as daemon process" msgstr "Rörelse körs som daemonprocess" #: src/motion.c msgid "Motion running in setup mode." msgstr "Rörelse körs i inställningsläge." #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "Kamer ID: %d är frÃ¥n %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "Kamer ID: %d Kameranamn: %s Service: %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "Kamer ID: %d Kameranamn: %s Enhet: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "Strömport nummer %d för trÃ¥d %d konflikter med kontrollporten" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "Strömningsfunktionen för trÃ¥d %d är inaktiverad." #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "Strömport nummer %d för trÃ¥d %d konflikter med trÃ¥d %d" #: src/motion.c msgid "Restarting motion." msgstr "Starta om rörelse." #: src/motion.c msgid "Motion restarted" msgstr "Rörelsen startades om" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "TrÃ¥d %d - Timeout för vakthund. Försöker göra en graciös omstart" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "TrÃ¥d %d - Timeout för vakthund startade INTE och dödade den!" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "Gänga %d - RengöringstrÃ¥d." #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "DEBUG-1 trÃ¥dar kör %d rörelsetrÃ¥dar som kör %d, finish %d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "Väntar pÃ¥ att trÃ¥darna är slut, pid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "RörelsetrÃ¥d %d starta om" #: src/motion.c msgid "Threads finished" msgstr "TrÃ¥dar färdiga" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "Rörelse avslutande" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "Ogiltig URL. Kan inte analysera värden." #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "KamerahanteringstrÃ¥d [ %d] startade" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "Stänger netcam-uttaget när Keep-Alive-tiden är slut (kamera skickas Stäng " "fält). ENÃ¥teranslutning ska ske." #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "Ã¥teröppningskamera (icke-strömmande)" #: src/netcam.c msgid "camera re-connected" msgstr "kameran Ã¥teransluten" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "Oigenkänd bildrubrik ( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "Fel i rubrik ( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "Ã¥teröppna kameran (streaming)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "Fel vid jpeg-bild" #: src/netcam.c msgid "Trying to re-connect" msgstr "Försöker ansluta igen" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "netcam camera handler: finish set, exit" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "Inget svar frÃ¥n kamerahanteraren - den mÃ¥ste redan ha dött" #: src/netcam.c msgid "called with no data in buffer" msgstr "kallas utan data i buffert" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "Nätverkskamera startar för kamera ( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "Ogiltig netcam-proxy ( %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "Användarnamn / lösenord är inte tillÃ¥tet pÃ¥ en proxy-URL" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "Ogiltig netcam-tjänst ' %s'" #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "Ogiltig webbkamera-url för kamera ( %s)" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "Netcam http-parameter ' %s' konverterar till flaggor: HTTP / 1.0: %s HTTP / " "1.1: %s Keep-Lever %s." #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "nu ringer netcam setup html ()" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "nu ringer netcam setup ftp" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "nu anropar netcam-installationsfilen ()" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "nu ringer netcam setup mjpg ()" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "Ogiltig netcam -tjänst '%s' - mÃ¥ste vara mjpeg, ftp, mjpg eller jpeg." #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "Det gick inte att försöka läsa första bilden - retval: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "libjpeg dekompressionsfel vid första bildrutan - att ge upp!" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "Bredd / höjd ( %dx %d) mÃ¥ste vara multiplar om 8" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "Fel vid start av kamerahanteraren [ %d]" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "recv misslyckades i ftp fÃ¥ mer" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "Server svar: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "skicka misslyckades i ftp skicka användare" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "skicka misslyckades i ftp skicka passwd" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "skicka misslyckades i ftp avsluta" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "gethostbyname misslyckades i ftp-anslutning" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "gethostbyname adressmatch i ftp connect" #: src/netcam_ftp.c msgid "socket failed" msgstr "uttag misslyckades" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "Det gick inte att skapa en anslutning" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "FTP-server som ber om ACCT pÃ¥ anonym" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "inställning av socketalternativ SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "skicka misslyckades i ftp fÃ¥ anslutning" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "Ogiltigt svar pÃ¥ PASV" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "Det gick inte att skapa en dataförbindelse" #: src/netcam_ftp.c msgid "bind failed" msgstr "bindning misslyckades" #: src/netcam_ftp.c msgid "listen failed" msgstr "lyssna misslyckades" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "skicka misslyckades i ftp fÃ¥ uttag" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "acceptera i ftp fÃ¥ uttag" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "recv misslyckades i ftp läst" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "ftp fÃ¥ uttag misslyckades" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "Fel vid skickning av TYPE I till ftp-server" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "missbildad token InnehÃ¥llslängd men värde %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "InnehÃ¥llslängd %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "InnehÃ¥llstyp %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "Fel vid läsning av bildrubrik, strömningsläge (1). Noll rubrik." #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "Fel vid läsning av bildrubrik, strömningsläge (1). Okänd rubrik ' %s'" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "Fel vid läsning av bildrubrik (2)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "Header inte JPEG" #: src/netcam_http.c msgid "Content-Length 0" msgstr "InnehÃ¥llslängd 0" #: src/netcam_http.c msgid "Found image header record" msgstr "Hittade bildhuvudposten" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "Fel vid skicka 'anslutningsförfrÃ¥gan'" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "FÃ¥tt första rubriken (' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "Fel vid läsning av första rubriken ( %s)" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "HTTP-resultatkod %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "" "Borttagna netcam Keep-Alive-flaggan pÃ¥ grund av synlig stängd HTTP-" "anslutning." #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "Icke-strömmande kamera (hÃ¥ll vid liv)" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "Icke-strömmande kamera (hÃ¥ll vid liv inte inställt)" #: src/netcam_http.c msgid "Streaming camera" msgstr "Streaming kamera" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "Gränssträng [ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "Gränssträng hittades inte i rubriken" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "" "Strömma kameran antagligen med MJPG-block, överväg att använda mjpg: //" "netcam url." #: src/netcam_http.c msgid "Unrecognized content type" msgstr "Okänt innehÃ¥llstyp" #: src/netcam_http.c msgid "Content-length present" msgstr "InnehÃ¥llslängd närvarande" #: src/netcam_http.c msgid "Content-length 0" msgstr "InnehÃ¥llslängd 0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "Hittade Conn: close header (' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "" "BÃ¥de \"Connection: Keep-Alive\" och \"Connection: close\" -huvudet mottagna." "Rörelse tar bort keepalive." #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "" "BÃ¥de \"Connection: Keep-Alive\" och \"Connection: close\" -huvudet mottagna." "Rörelsen fortsätter oförändrad." #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "Fick ett Keep-Alive-fält i den här rubriken." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "Ingen \"Connection: Keep-Alive\" eller \"Connection: close\" -huvud " "mottagen. \n" " Rörelse tar bort keepalive." #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "Ingen \"Connection: Keep-Alive\" eller \"Connection: close\" -huvud " "mottagen. \n" " Rörelsen fortsätter oförändrad." #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "Borttagna netcam Keep-Alive-flaggan eftersom \"Connection: close\" -huvudet " "mottogsNetcam stöder inte Keep-Alive. Rörelse fortsätter i icke-Keep-Alive." #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "Keep-Alive har nÃ¥tt slutet pÃ¥ giltig period. \n" " Rörelse stänger netcam och fortsätter sedan Keep-Alive med ett nytt uttag." #: src/netcam_http.c msgid "disconnect" msgstr "koppla frÃ¥n" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo () misslyckades ( %s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "koppla bort nätkamera (1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "koppla bort nätkamera eftersom hÃ¥ller vid liv inte inställt." #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "utan att hÃ¥lla kvar, försök att skapa socket misslyckades." #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "utan keepalive, nytt uttag skapat fd %d" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "" "med keepalive set, ogiltig socket.Detta kan vara första gÃ¥ngen. Skapa ennya " "misslyckades." #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "" "med keepalive set, ogiltig socket.Detta kan vara första gÃ¥ngen, skapade en " "nyen med fd %d" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "SÃ… KEEPALIV är %s" #: src/netcam_http.c msgid "ON" msgstr "PÃ…" #: src/netcam_http.c msgid "OFF" msgstr "AV" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "SÃ… KEEPALIV inställd pÃ¥ uttaget." #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "fcntl (1) pÃ¥ uttaget" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "fcntl (2) pÃ¥ uttaget" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "anslut () misslyckades ( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "frÃ¥nkoppling av nätkamera (4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "timeout vid connect ()" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "frÃ¥nkoppling av nätkamera (2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "getockopt efter anslut" #: src/netcam_http.c msgid "connect returned error" msgstr "anslut returnerat fel" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "frÃ¥nkoppling av nätkamera (3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "expanderar buffert frÃ¥n [ %d / %d] till [ %d / %d] byte." #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "Potentiell delad gräns - %d rader spolade, %d Ã¥terplacerade" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "recv () misslyckas efter gränssträng" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "lämnar nätkamera ansluten." #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "pÃ¥ väg att försöka ansluta, tid # %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "" "Det gick inte att öppna kameran - kontrollera din konfigurering och att " "netkamera är online" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "Fel vid läsning av första rubriken - försök pÃ¥ nytt" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "Det gick inte att läsa första kamerahuvudet - ge upp för nu" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "Netcam har flaggor: HTTP / 1.0: %s HTTP / 1.1: %s Keep-Alive %s." #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "" "Borttagna netcam keepalive flagga pÃ¥ grund av proxyset. Proxy är inte " "kompatibelt medHÃ¥ll vid liv." #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "Det gick inte att läsa första strömhuvudet - ge upp för nu" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "ansluten, kommer att läsa bilden." #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "Läs fel, försöker ansluta igen .." #: src/netcam_http.c msgid "lost the cam." msgstr "tappade kammen." #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "Ã…terfyllt buffert med [ %d] byte frÃ¥n nätverket." #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "Läs [ %d / %d] rubrikbyte." #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "Ogiltig rubrik mottagen, anslut igen" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "Läs [ %d / %d] bitbyte, [ %d / %d] totalt" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "Chunk komplett, buffert som används [ %d] byte." #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "Bilden är komplett, bufferten används [ %d] byte." #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "ansluten, kommer att läsa och avkoda MJPG-bitar." #: src/netcam_http.c msgid "Begin" msgstr "Börja" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "stat ( %s) -fel" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]! = sista st mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "väntar pÃ¥ timeout för ny filbild" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "fördröja vänta pÃ¥ ny filbild" #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "bearbetar ny filbild - st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "öppet ( %s) fel: %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "läs ( %s) fel: %d" #: src/netcam_http.c msgid "End" msgstr "Slutet" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "netcam-> fil-> sökväg %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "Inte tillräckligt med data frÃ¥n netcam." #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "netcam-> jpeg-fel %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "*** ny bildfördröjning framgÃ¥ngsrik ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "jpeg-fel %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "bearbeta jpeg-bild - innehÃ¥llslängd %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "" "Kamerans bredd / höjdmatchning med JPEG-bild - förväntad %dx %d, JPEG %dx " "%dretval %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr "%s: Ändrade storlek pÃ¥ paketuppsättningen till %d" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr "%s: av kopieringspaket: %s, Avbrott: %s" #: src/netcam_rtsp.c msgid "True" msgstr "Sann" #: src/netcam_rtsp.c msgid "False" msgstr "Falsk" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: Ignorerar paket med ogiltiga data" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: Rec frame frame: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "Ignorerar paketet med ogiltiga data" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "Fel vid avkodning av paket: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "%s: Fel vid överföring av HW -avkodat till systemminne" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "Fel vid skicka paket till codec: %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "Fel vid avkodning av videopaket: Kopiering till buffert" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: HW -enheter:" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s (tillgängligt)" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s (ej implementerat)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s: netcam -avkodare %s inaktiverad." #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "Det gick inte att fÃ¥ vaapi pix -format" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "Det gick inte att fÃ¥ cuda pix -format" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s: Avbruten." #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: Misslyckades" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s: Avkodaren %s fungerade inte." #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "%s: Ignorerar och tar bort den av användaren begärda avkodaren %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s: Initierar vaapi -avkodare" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: Det gick inte att hitta vaapi hw -enheten" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s: Initierar cuda -avkodare" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: Det gick inte att hitta cuda hw -enheten" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s: Initierar avkodare" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr "%s: Använda avkodare %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: Avkodare öppnad" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr "%s: Kameravläsning ( %s) har gÃ¥tt ut" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr "%s: Kameran ( %s) har gÃ¥tt ut" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "Det gÃ¥r inte att tilldela swsframe i." #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "Det gÃ¥r inte att tilldela swsframe ut." #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "Det gÃ¥r inte att tilldela skalningskontext." #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "Fel vid bestämning av ramens storlek" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "Fel vid allokering av bild i: %s" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "Fel vid tilldelning av bild: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "Fel vid storleksändring / omformatering: %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "Fel vid inställning av ram i utgÃ¥ngsbuffert: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s: Avbruten" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: av läsram: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: För mÃ¥nga försök att hämta data frÃ¥n kameran %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "" "%s: fÃ¥ngsthastighet inte specificerad i nätkameraparametrar. Använda %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "" "%s: fÃ¥ngsthastighet inte specificerad i nätkameraparametrar. Använda " "framerate %d" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "Nätverkskameran skickar bilder pÃ¥ en annan" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "storlek än angiven i konfigurationen och ocksÃ¥ en" #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "olika bildformat. Bilden är" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "transkodad till YUV420P och till önskad storlek" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "i konfigurationsfilen. Ändra om möjligt netcam till" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "vara i YUV420P-format och den önskade storleken i" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "config för att möjligen sänka CPU-användningen." #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "storlek än angiven i konfigurationsfilen." #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "Bilden omkodas till storleken" #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "begärda i konfigurationen. Ändra om möjligt" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "netcam eller konfiguration för att ange samma storlek" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "för att möjligen sänka CPU-användningen." #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "Netcam: %dx %d => Konfigur: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "Den skickade bilden hÃ¥ller pÃ¥ att hÃ¥llas" #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "transkodad till YUV420P. Ändra om möjligt netcam" #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "bildformat till YUV420P för att möjligen sänka CPU-användningen." #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: Inställning rtsp/rtmp" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: Inställning av inmatningsformat mjpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: Inställning av inmatningsformat video4linux2" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: Konfigurera filmfil" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s: Konfigurera %s" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: alternativ: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "Konfigurera v4l2 via netcam" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "Konfigurera fil via netcam" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "Konfigurera %s via netcam" #: src/netcam_rtsp.c msgid "highres" msgstr "högupplöst" #: src/netcam_rtsp.c msgid "norm" msgstr "norm" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "Ställer in %s ström." #: src/netcam_rtsp.c msgid "Unknown" msgstr "Okänd" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "Strömmen kopierades för genomgÃ¥ng" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "Null väg passerad för att ansluta" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr "%s: Det gÃ¥r inte att öppna kameran ( %s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr "%s: Öppnad kamera ( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr "%s: Det gick inte att hitta ströminfo: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr "%s: Det gÃ¥r inte att öppna codec-sammanhang: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr "%s: Kamerans bildstorlek är ogiltig" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr "%s: Det gÃ¥r inte att tilldela ram." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr "%s: Det gick inte att kopiera ström för genomgÃ¥ng." #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr "%s: Det gick inte att läsa första bilden" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr "%s: Kameran ( %s) ansluten" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s: FÃ¥ngstfrekvensen för Netcam är %d." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%s: Kamerakällan är %d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%s: Det gick inte att bestämma kamerakällans FPS." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s: inspelningshastigheten är lägre än kamerans FPS." #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s: Avkodningsfel uppstÃ¥r." #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "%s: inspelningshastighet nÃ¥got större än kamerans FPS rekommenderas." #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr "%s: Anslut igen med kameran ...." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr "%s: Kameran anslöt inte igen." #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr "%s: Kontrollerar om kameran var tionde sekund." #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr "%s: TrÃ¥d för kamerahanterare [ %d] startade" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr "%s: Hanteringsslinga är klar." #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr "%s: Fel vid start av hanterartrÃ¥d" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr "%s: Väntar pÃ¥ första bilden frÃ¥n hanteraren." #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "kan inte skapa rtsp-kontext" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "kan inte skapa rtsp-hög kontext" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "Inget FFmpeg -stöd" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr "%s: Stäng av nätverkskamera." #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr "%s: Inget svar frÃ¥n hanterartrÃ¥den." #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "Normal upplösning: Stäng av komplett." #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "Hög upplösning: Stäng av komplett." #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "Det gÃ¥r inte att ställa in EXIF ​​till webbsnitt" #: src/picture.c msgid "libwebp version error" msgstr "libwebp-versionfel" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "libwebp allokeringsfel för bildbuffert" #: src/picture.c msgid "libwebp image compression error" msgstr "libwebp-bildkomprimeringsfel" #: src/picture.c msgid "unable to assemble webp image" msgstr "oförmögen att montera webb-bild" #: src/picture.c msgid "unable to save webp image to file" msgstr "kan inte spara webbsidan till filen" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "Kan inte skriva bild till fil %s - kontrollera Ã¥tkomsträttigheterna till " "mÃ¥lkatalogen \n" "TrÃ¥den kommer att slutföras pÃ¥ grund av detta dödliga fel" #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "Kan inte skriva bild till fil %s" #: src/picture.c msgid "Error getting PGM vars." msgstr "Det gick inte att hämta PGM vars." #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "Detta är inte en pgm-fil, börjar med ' %s'" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "Magisk %s: Bredd %s(%d): Höjd %s(%d): MaxVal: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "Det gick inte att läsa bilddata frÃ¥n pgm-filen" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "Den angivna maskfilen har inte samma storlek som bilden frÃ¥n kameran." #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "Försök att ändra storlek pÃ¥ maskbilden frÃ¥n %dx %d till %dx %d" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "" "kan inte skriva maskfil %s - kontrollera Ã¥tkomsträttigheterna till " "mÃ¥lkatalogen" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "kan inte skriva maskfil %s" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "Det gick inte att skriva standardmask som pgm-fil" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "Skapar tom mask %s \n" "Redigera den här filen och kör rörelse igen för att aktivera maskfunktionen" #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "Konfigureringsalternativ \"rotera \" inte en multipel pÃ¥ 90: %d" #: src/track.c msgid "internal error" msgstr "internt fel" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "internt fel, %hu är inte en känd spÃ¥rtyp" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "port %s dev fd %i, motor %hu kommando %hu data %hu" #: src/track.c msgid "Status byte timeout!" msgstr "Statusbyte-timeout!" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "Försök att öppna serienheten %s" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "Det gÃ¥r inte att öppna serienheten %s" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "Det gÃ¥r inte att initiera seriell enhet %s" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "Öppnade serienheten %s och initiera, fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "Ingen enhet %s startade än, försöker stegcentret ()" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "misslyckades med att initialisera stegapparaten pÃ¥ %s, fd [ %i]." #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "lyckas, enhet startade %s, fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "SENDS port %s dev fd %i, motor %hu kommando %hu data %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "Kommando avkastning %d" #: src/track.c msgid "Problem opening servo!" msgstr "Problem med att öppna servo!" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d, cent-> y %d, reversex %d, reversey %d manuell %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d-värde utanför intervallet! ( %d - %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d-värde utanför intervallet! ( %d - %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "X förskjutning %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "X cent-> x %d, cent-> y %d, reversex %d, reversey %d motorx %d data %d " "kommando%d" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Y förskjutning %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Y cent-> x %d, cent-> y %d, reversex %d, reversey %d motory %d data %d " "kommando%d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "" "X-offset %d, Y-offset %d, x-position %d. y-position %d, reversex %d, reversey" "%d, stegstorlek %d" #: src/track.c msgid "Return byte timeout!" msgstr "Ã…tergÃ¥ byte-timeout!" #: src/track.c msgid "Unable to set camera speed" msgstr "Det gÃ¥r inte att ställa in kamerahastighet" #: src/track.c msgid "succeed" msgstr "lyckas" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "Det gick inte att Ã¥terställa pwc-kameran till startposition! Anledning" #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "misslyckades VIDIOCPWCMPTGRANGE" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "Det gick inte att panorera / luta pwc-kameran! Anledning" #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "Det gick inte att Ã¥terställa UVC-kameran till startposition! Anledning" #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "Ã…terställer UVC-kameran till startposition" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl querycontrol" #: src/track.c msgid "Getting camera range" msgstr "FÃ¥ kameraomrÃ¥de" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "INPUT PARAM ABS pan min %d, pan max %d, tilt min %d, tilt max %d" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "INPUT PARAM ABS X Angel %d, Y Angel %d" #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "För SET ABS flytta X %d, flytta Y %d" #: src/track.c msgid "Failed to move UVC camera!" msgstr "Det gick inte att flytta UVC-kamera!" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "Hittade MINMAX = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "Innan ABS Y Angel: x = %d, Y = %d," #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "Efter ABS Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "För SET REL pan min %d, pan max %d, tilt min %d, tilt max %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "För SET REL spÃ¥rskiva Angel %d, spÃ¥ra tilt Angel %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "För SET REL flytta X %d, flytta Y %d" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, kontroll S = %d, Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr "dev %d, addr = %d, kontroll S = %d, Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "Innan REL Y Angel: x = %d, Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "Efter REL Y Angel: x = %d, Y = %d" #: src/translate.c msgid "Language: English" msgstr "SprÃ¥k: Svenska" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "Det gick inte att tilldela %llu-byte minne!" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "" "Varning! Funktion %s försöker ändra storlek pÃ¥ minnesblock vid %p till 0 " "byte!" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "" "Kunde inte ändra storlek pÃ¥ minnesblock vid förskjutning %p till %llu byte " "(funktion %s)!" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "Problem med att skapa katalog %s" #: src/util.c #, c-format msgid "creating directory %s" msgstr "skapa katalog %s" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "Fel vid öppning av fil %s med läge %s" #: src/util.c msgid "Error closing file" msgstr "Fel vid stängning av fil" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "{dbeventid} stöds inte. Använd eventtid." #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "ogiltigt format specificer sökord %*.*s" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "Det gÃ¥r inte att ställa in trÃ¥dnamn %s" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "FFMPEG-version för gammal. Inaktiverar genomgÃ¥ngsbehandling." #: src/util.c msgid "pass-through enabled." msgstr "pass-through aktiverad." #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "Fel vid inställning av parm>%s <" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "Parsed:>%s <>%s <" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "Parsed:> redacted <> redacted <" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "Fel vid analys av parm -nm -kontroller: %s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "Fel vid analys av parm vl -kontroller: %s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "Fel vid inställning av temp: %s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "Fel vid omarbetning av kontroller: %s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "Analys: %s" #: src/util.c msgid "Parsing: " msgstr "Analys: " #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "Fel vid analys av kontroller: %s" #: src/util.c #, c-format msgid "Error: %s" msgstr "Fel: %s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "Nya nätkameraparametrar: %s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "Nya netcam high params: %s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "Nya videoparametrar: %s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "Nya webbkontrollhuvudparametrar: %s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "Nya webbkontrollhuvudparametrar: " #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "Ny strömningshuvudparametrar: %s" #: src/util.c msgid "New stream_header_params: " msgstr "Nya strömningshuvudparametrar: " #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "Programmeringsfel. Okänt konfigurationsobjekt: %s " #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE Felinställning nyans [ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "till [ %d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE Fel vid nyans" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT Fel vid inställning av mättnad [ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT Fel vid mättnad" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT Felinställningskontrast [ %d]" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT Fel vid kontrast" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "METEORSBRIG ljusstyrka [ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIG fÃ¥r ljusstyrka" #: src/video_bktr.c msgid "Not implemented" msgstr "Ej implementerad" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "Enhetsinmatning %d utanför räckvidden (0-4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d ogiltig -Prova komposit %d" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "" "BT848SFMT, Det gick inte att ställa in inmatningsformatet, försök igen med " "standard" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "" "BT848SFMT, Det gick inte att ställa in ingÃ¥ngsformatet antingen som standard" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "Det gick inte att ställa in geometri" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "till [ %d / %d] Norm %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "Ogiltig frekvens [%ld] för källinmatning [%i]" #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "Frekvens [%ld] Källinmatning [%i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "ställ in ingÃ¥ngen [ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "ställa in format [ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "ställa in geometri [ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "Frekvensuppsättning (ännu inte implementerat" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "Storleksbuffert till 3x" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "Storleksbuffert till 3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap misslyckades" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "METEORCAPTUR använder en enda metod Feltagning" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "Fel vid fÃ¥ngst med en enda metod" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "Det gÃ¥r inte att hitta videoenhet" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "Stänger videoenhet %s" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "Fortfarande %d användare av videoenhet %s, sÃ¥ vi stänger inte den nu" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "config bildbredd ( %d) är inte modulo 8" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "config bildhöjd ( %d) är inte modulo 8" #: src/video_bktr.c msgid "Stopping capture" msgstr "Stoppar fÃ¥ngst" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "" "Ã…teranvända [ %s] ingÃ¥ngar [ %d, %d] Ändra infÃ¥ngningsmetod METEOR CAP SINGLE" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "VIDEO PALETTE YUV420P inställning imgs.size norm och imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "öppen videoenhet %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "öppen tuner enhet %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "Korrupt bild ... fortsätt" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "SOI-position justerad med %d byte." #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "ringer mmalcam-sanering" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "uppringning av netcam" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "uppringning av netcam rtsp" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "Rengöring av V4L2-enhet" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "Rengöring av BKTR-enhet" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "Ingen sanering av kameran (MMAL, Netcam, V4L2, BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "Öppnar MMAL-kam" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "MMAL-kammen kunde inte öppnas" #: src/video_common.c msgid "Opening Netcam" msgstr "Öppnar Netcam" #: src/video_common.c msgid "Netcam failed to open" msgstr "Netcam kunde inte öppnas" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "Öppnar Netcam RTSP" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Netcam RTSP kunde inte öppnas" #: src/video_common.c msgid "Opening V4L2 device" msgstr "Öppnar V4L2-enhet" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "V4L2-enheten kunde inte öppnas" #: src/video_common.c msgid "Opening BKTR device" msgstr "Öppnar BKTR-enhet" #: src/video_common.c msgid "BKTR device failed to open" msgstr "BKTR-enheten kunde inte öppnas" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "Ingen kameraenhet anges (MMAL, Netcam, V4L2, BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "Det gick inte att öppna ' %s'" #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "Fel vid specificering av buffert: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "Öppningsbuffert: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "Läs buffert: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "hittade videoenheten ' %s' %d" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "Öppnade %s som rörutgÃ¥ng" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "Öppning av %s när rörutgÃ¥ngen misslyckades" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "Original rörspecifikationer" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "Föreslagna rörspecifikationer" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "Slutliga rörspecifikationer" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "Inga kontroller hittades för enheten" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "--------- Kontroller ---------" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr "V4L2 ID-namn och intervall" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "Fel vid Ã¥terställning av användarvärde" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "Lämnar kontrollen %s \"%s\" inställd pÃ¥ %d" #: src/video_v4l2.c msgid "Device not ready" msgstr "Enheten är inte klar" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "Ställ kontroll \" %s \" till värde %d" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "inställning av kontroll %s \"%s\" till %d misslyckades." #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "%s kontrollalternativvärde %s är under minimum. Använda minst %d " #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "%s kontrollalternativvärde %s är över max. Använd max %d " #: src/video_v4l2.c msgid "control type not supported yet" msgstr "kontrolltyp stöds inte ännu" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "Det gick inte att frÃ¥ga input %d. VIDIOC ENUMINPUT, om du använder en WEBCAM " "ändra ingÃ¥ngvärde i konf med -1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "Namn = \" %s \", skriv 0x %08X, status %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "Namn = \" %s \", - TUNER" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "Namn = \" %s \" - KAMERA" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "Fel vid val av ingÃ¥ng %d VIDIOC S INPUT" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "Enheten stöder inte att ange PAL / NTSC-norm" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "- videostandard %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "Fel vid val av standardmetod %d VIDIOC S STD" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "Videostandard inställd pÃ¥ NTSC" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "Videostandard inställd pÃ¥ SECAM" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "Videostandard inställd pÃ¥ PAL" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "tuner %d VIDIOC G TUNER" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "Ställ in tuner %d" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "freq %ul VIDIOC S FREQUENCY" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "Ställ in frekvens pÃ¥ %ul" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "Det gÃ¥r inte att använda %c%c%c%c (%dx%d)" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "Testpalett %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "Kontrollerar bildstorlek %dx%d med steg %d" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "Inget stegvärde tillhandahÃ¥lls frÃ¥n enheten." #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "Bredd(%d) mÃ¥ste vara mindre än steg(%d)" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "Bildbredden (%d) är inte multipel av steget (%d)" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "Omöjligt tillstÃ¥nd: Bredd(%d), Steg(%d), Per steg(%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "Bildbredden kommer att fyllas med %d byte" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "Justera upplösningen frÃ¥n %ix %i till %ix %i." #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "Justerad upplösning inte modulo 8." #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "Ange annan palett eller bredd / höjd i konfigurationsfilen." #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "Fel vid inställning av pixelformat." #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "Använda paletten %c %c %c %c ( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "Justera till bredd ( %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "Justering till höjd ( %d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "Konfigurationspalettindex %d ( %s) för %dx %d fungerar inte." #: src/video_v4l2.c msgid "Supported palettes:" msgstr "Paletter som stöds:" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr "%d - %s (komprimerad: %d) ( %# x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "Vald palett %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "Palettval misslyckades för format %s" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "Det gick inte att hitta ett kompatibelt palettformat." #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "Fel vid begäran av buffertar %d för minneskarta. VIDIOC REQBUFS" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "mmapinformation: ramar = %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "Otillräckligt bufferminne %d %s< >%s< >%s<" msgstr "Ogiltig begäran:> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "ModersmÃ¥l: pÃ¥" #: src/webu.c msgid "Native Language : off" msgstr "ModersmÃ¥l: av" #: src/webu.c msgid "Set the value to null/zero" msgstr "Ställ in värdet pÃ¥ null / noll" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "Ignorerar anslutning frÃ¥n: %s" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "Misslyckad autentisering frÃ¥n %s" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "Ingen användare av webbkontroll: pass tillhandahÃ¥lls" #: src/webu.c msgid "No stream user:pass provided" msgstr "Ingen strömanvändare: pass tillhandahÃ¥lls" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "Ogiltigt svar" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "Det gick inte att lägga till webbkontrollhuvudet %s %s" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "Det gick inte att lägga till strömhuvud %s %s" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "Ogiltig begärd metod: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "Anslutning frÃ¥n: %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "skicka sidan misslyckades %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "Streambilden är inte klar än" #: src/webu.c msgid "Stream process requested to finish." msgstr "Streamprocessen begärdes att slutföras." #: src/webu.c msgid "Send page failed." msgstr "Skicka sidan misslyckades." #: src/webu.c msgid "Basic authentication: available" msgstr "Grundläggande autentisering: tillgänglig" #: src/webu.c msgid "Basic authentication: disabled" msgstr "Grundläggande autentisering: inaktiverad" #: src/webu.c msgid "Digest authentication: available" msgstr "Digest-autentisering: tillgänglig" #: src/webu.c msgid "Digest authentication: disabled" msgstr "Digest-autentisering: inaktiverad" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd libary för gammal ipv6 inaktiverad" #: src/webu.c msgid "IPV6: available" msgstr "IPV6: tillgängligt" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6: inaktiverad" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd libary för gammal SSL / TLS inaktiverad" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS: tillgängligt" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS: inaktiverad" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "Fel vid läsning av fil för SSL / TLS-stöd." #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "" "SSL / TLS begärde men ingen certifikatfil tillhandahÃ¥lls. SSL / TLS " "inaktiverat" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "" "SSL / TLS begärde men ingen nyckelfil tillhandahölls. SSL / TLS inaktiverat" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "Starta webbkontroll pÃ¥ port %d" #: src/webu.c msgid "Unable to start MHD" msgstr "Det gick inte att starta MHD" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "Startade webbkontroll pÃ¥ port %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "Startade kamera %d ström pÃ¥ port / kamera-id %d / %d" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "Startade kamera %d ström pÃ¥ port %d" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "Starta alla kameraströmmar pÃ¥ port %d" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "Starta kamera %d ström pÃ¥ port %d" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "Det gÃ¥r inte att starta ström för kamera %d" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "Duplicerad port begärd %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "Ogiltigt webbkontrolllÃ¥s max ips. Inställning lika med 25. " #: src/webu_html.c msgid "Cameras" msgstr "Kameror" #: src/webu_html.c msgid "Camera" msgstr "Kamera" #: src/webu_html.c msgid "All" msgstr "Alla" #: src/webu_html.c msgid "Action" msgstr "Aktion" #: src/webu_html.c msgid "Start Event" msgstr "Start händelse" #: src/webu_html.c msgid "End Event" msgstr "Avsluta händelsen" #: src/webu_html.c msgid "Snapshot" msgstr "Ögonblicksbild" #: src/webu_html.c msgid "Change Configuration" msgstr "Ändra konfiguration" #: src/webu_html.c msgid "Write Configuration" msgstr "spara konfiguration" #: src/webu_html.c msgid "Tracking" msgstr "SpÃ¥rning" #: src/webu_html.c msgid "Pause" msgstr "Paus" #: src/webu_html.c msgid "Start" msgstr "Start" #: src/webu_html.c msgid "Restart" msgstr "Starta om" #: src/webu_html.c msgid "Quit" msgstr "Sluta" #: src/webu_html.c msgid "Help" msgstr "Hjälp" #: src/webu_html.c msgid "No Configuration Options" msgstr "Inga konfigurationsalternativ" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "Reducerade konfigurationsalternativ" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "Avancerade konfigurationsalternativ" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "Begränsade konfigurationsalternativ" #: src/webu_html.c msgid "All Cameras" msgstr "Kameror" #: src/webu_html.c msgid "Not running" msgstr "Inte verkande" #: src/webu_html.c msgid "Lost connection" msgstr "Förlorad förbindelse" #: src/webu_html.c msgid "Paused" msgstr "Pausas" #: src/webu_html.c msgid "Active" msgstr "Verkande" #: src/webu_html.c msgid "Select option" msgstr "Välj alternativ" #: src/webu_html.c msgid "Save" msgstr "Spara" #: src/webu_html.c msgid "Pan/Tilt" msgstr "panorera/luta" #: src/webu_html.c msgid "Absolute Change" msgstr "Absolut ändring" #: src/webu_html.c msgid "Center" msgstr "Centrera" #: src/webu_html.c msgid "Pan" msgstr "Panorera" #: src/webu_html.c msgid "Tilt" msgstr "Luta" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "Ogiltig trÃ¥d specificerad: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "Ogiltig URL för en kameraspecifik port: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "" "URL för trÃ¥d 0 är inte giltig när du använder kameraspecifika filer: %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "DÃ¥lig URL för en kameraspecifik port: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "Det gick inte att fÃ¥ bild att strömma." #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "Alternativet ' %s' skrivs av. Nytt alternativnamn är '%s'" motion-release-4.6.0/po/zh.po000066400000000000000000003103571452402535500160610ustar00rootroot00000000000000# Motion Application # Copyright (2018) # This file is distributed under the same license as the Motion package. # msgid "" msgstr "" "Project-Id-Version: 4.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-10-24 08:29-0600\n" "PO-Revision-Date: 2022-10-24 08:38-0600\n" "Last-Translator: MrDave \n" "Language-Team: MrDave \n" "Language: zh\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" "X-Generator: Poedit 2.4.2\n" #: src/conf.c #, c-format msgid "%s after version %s" msgstr "版本 %s 之åŽçš„ %s" #: src/conf.c #, c-format msgid "Unknown config option \"%s\"" msgstr "未知的é…置选项\" %s \"" #: src/conf.c #, c-format msgid "Writing config file to %s" msgstr "å°†é…置文件写入 %s" #: src/conf.c #, c-format msgid "Configfile %s not found - trying defaults." msgstr "找ä¸åˆ°é…置文件 %s-å°è¯•使用默认值。" #: src/conf.c msgid "Error getcwd" msgstr "错误的getcwd" #: src/conf.c #, c-format msgid "could not open configfile %s" msgstr "无法打开é…置文件 %s" #: src/conf.c #, c-format msgid "Invalid file name %s" msgstr "无效的文件å %s" #: src/conf.c #, c-format msgid "Processing thread 0 - config file %s" msgstr "处ç†çº¿ç¨‹0-é…置文件 %s" #: src/conf.c msgid "No config file to process, using default values" msgstr "没有é…置文件è¦å¤„ç†ï¼Œä½¿ç”¨é»˜è®¤å€¼" #: src/conf.c #, c-format msgid "Writing configuration parameters from all files (%d):" msgstr "从所有文件( %d)写入é…ç½®å‚æ•°ï¼š" #: src/conf.c #, c-format msgid "Thread %d - Config file: %s" msgstr "线程 %d-é…置文件: %s" #: src/conf.c #, c-format msgid "%-25s " msgstr " %-25s <已编辑>" #: src/conf.c #, c-format msgid "Processing config file %s" msgstr "正在处ç†é…置文件 %s" #: src/conf.c #, c-format msgid "Camera directory config %s not found" msgstr "找ä¸åˆ°ç›¸æœºç›®å½•é…ç½® %s" #: src/conf.c #, c-format msgid "Camera config file %s not found" msgstr "找ä¸åˆ°ç›¸æœºé…置文件 %s" #: src/conf.c #, c-format msgid "Processing camera config file %s" msgstr "处ç†ç›¸æœºé…置文件 %s" #: src/conf.c msgid "daemon" msgstr "守护程åº" #: src/conf.c msgid "setup_mode" msgstr "设定模å¼" #: src/conf.c msgid "pid_file" msgstr "pid文件" #: src/conf.c msgid "log_file" msgstr "日志文件" #: src/conf.c msgid "log_level" msgstr "日志级别" #: src/conf.c msgid "log_type" msgstr "日志类型" #: src/conf.c msgid "quiet" msgstr "安é™" #: src/conf.c msgid "watchdog_tmo" msgstr "看门狗" #: src/conf.c msgid "watchdog_kill" msgstr "看门狗æ€" #: src/conf.c msgid "native_language" msgstr "æ¯è¯­" #: src/conf.c msgid "camera_name" msgstr "相机åç§°" #: src/conf.c msgid "camera_id" msgstr "相机编å·" #: src/conf.c msgid "target_dir" msgstr "目标目录" #: src/conf.c msgid "video_device" msgstr "视频设备" #: src/conf.c msgid "video_params" msgstr "è§†é¢‘å‚æ•°" #: src/conf.c msgid "auto_brightness" msgstr "自动亮度" #: src/conf.c msgid "tuner_device" msgstr "è°ƒè°å™¨è£…ç½®" #: src/conf.c msgid "roundrobin_frames" msgstr "轮循框架" #: src/conf.c msgid "roundrobin_skip" msgstr "循环跳过" #: src/conf.c msgid "roundrobin_switchfilter" msgstr "循环开关滤波器" #: src/conf.c msgid "netcam_url" msgstr "网络摄åƒå¤´ç½‘å€" #: src/conf.c msgid "netcam_params" msgstr "网络摄åƒå¤´å‚æ•°" #: src/conf.c msgid "netcam_high_url" msgstr "网络摄åƒå¤´é«˜ç½‘å€" #: src/conf.c msgid "netcam_high_params" msgstr "网络摄åƒå¤´é«˜å‚æ•°" #: src/conf.c msgid "netcam_userpass" msgstr "网络摄åƒå¤´ç”¨æˆ·å¯†ç " #: src/conf.c msgid "mmalcam_name" msgstr "mmalcamåç§°" #: src/conf.c msgid "mmalcam_params" msgstr "mmalcam 傿•°" #: src/conf.c msgid "width" msgstr "宽度" #: src/conf.c msgid "height" msgstr "高度" #: src/conf.c msgid "framerate" msgstr "帧率" #: src/conf.c msgid "minimum_frame_time" msgstr "最短帧时间" #: src/conf.c msgid "rotate" msgstr "旋转" #: src/conf.c msgid "flip_axis" msgstr "翻转轴" #: src/conf.c msgid "locate_motion_mode" msgstr "定ä½è¿åŠ¨æ¨¡å¼" #: src/conf.c msgid "locate_motion_style" msgstr "定ä½è¿åŠ¨é£Žæ ¼" #: src/conf.c msgid "text_left" msgstr "剩余文字" #: src/conf.c msgid "text_right" msgstr "文字正确" #: src/conf.c msgid "text_changes" msgstr "æ–‡å­—å˜æ›´" #: src/conf.c msgid "text_scale" msgstr "文字比例" #: src/conf.c msgid "text_event" msgstr "文字事件" #: src/conf.c msgid "emulate_motion" msgstr "模拟è¿åЍ" #: src/conf.c msgid "pause" msgstr "æš‚åœ" #: src/conf.c msgid "threshold" msgstr "阈" #: src/conf.c msgid "threshold_maximum" msgstr "最大阈值" #: src/conf.c msgid "threshold_tune" msgstr "门槛调" #: src/conf.c msgid "noise_level" msgstr "噪音水平" #: src/conf.c msgid "noise_tune" msgstr "噪音调" #: src/conf.c msgid "despeckle_filter" msgstr "去斑滤波器" #: src/conf.c msgid "area_detect" msgstr "区域检测" #: src/conf.c msgid "mask_file" msgstr "é®ç½©æ–‡ä»¶" #: src/conf.c msgid "mask_privacy" msgstr "掩盖éšç§" #: src/conf.c msgid "smart_mask_speed" msgstr "智能å£ç½©é€Ÿåº¦" #: src/conf.c msgid "lightswitch_percent" msgstr "电ç¯ç™¾åˆ†æ¯”" #: src/conf.c msgid "lightswitch_frames" msgstr "ç¯æž¶" #: src/conf.c msgid "minimum_motion_frames" msgstr "最å°è¿åЍ叧" #: src/conf.c msgid "event_gap" msgstr "事件差è·" #: src/conf.c msgid "pre_capture" msgstr "预先æ•获" #: src/conf.c msgid "post_capture" msgstr "æ•获åŽ" #: src/conf.c msgid "on_event_start" msgstr "活动开始时" #: src/conf.c msgid "on_event_end" msgstr "åœ¨æ´»åŠ¨ç»“æŸæ—¶" #: src/conf.c msgid "on_picture_save" msgstr "图片ä¿å­˜" #: src/conf.c msgid "on_area_detected" msgstr "在检测到的区域上" #: src/conf.c msgid "on_motion_detected" msgstr "检测到è¿åŠ¨æ—¶" #: src/conf.c msgid "on_movie_start" msgstr "电影开始时" #: src/conf.c msgid "on_movie_end" msgstr "ç”µå½±ç»“æŸæ—¶" #: src/conf.c msgid "on_camera_lost" msgstr "失去相机" #: src/conf.c msgid "on_camera_found" msgstr "在相机上找到" #: src/conf.c msgid "picture_output" msgstr "图片输出" #: src/conf.c msgid "picture_output_motion" msgstr "图片输出è¿åЍ" #: src/conf.c msgid "picture_type" msgstr "图片类型" #: src/conf.c msgid "picture_quality" msgstr "图åƒè´¨é‡" #: src/conf.c msgid "picture_exif" msgstr "图片exif" #: src/conf.c msgid "picture_filename" msgstr "图片文件å" #: src/conf.c msgid "snapshot_interval" msgstr "å¿«ç…§é—´éš”" #: src/conf.c msgid "snapshot_filename" msgstr "快照文件å" #: src/conf.c msgid "movie_output" msgstr "电影输出" #: src/conf.c msgid "movie_output_motion" msgstr "电影输出动作" #: src/conf.c msgid "movie_max_time" msgstr "电影最长时间" #: src/conf.c msgid "movie_bps" msgstr "电影基点" #: src/conf.c msgid "movie_quality" msgstr "电影质é‡" #: src/conf.c msgid "movie_codec" msgstr "电影编解ç å™¨" #: src/conf.c msgid "movie_duplicate_frames" msgstr "电影é‡å¤å¸§" #: src/conf.c msgid "movie_passthrough" msgstr "电影直通" #: src/conf.c msgid "movie_filename" msgstr "电影文件å" #: src/conf.c msgid "movie_extpipe_use" msgstr "电影extpipe使用" #: src/conf.c msgid "movie_extpipe" msgstr "电影extpipe" #: src/conf.c msgid "timelapse_interval" msgstr "间隔时间" #: src/conf.c msgid "timelapse_mode" msgstr "游æˆä¸­æ—¶å…‰å€’æµæ¨¡å¼" #: src/conf.c msgid "timelapse_fps" msgstr "é—´éš”æ‹æ‘„fps" #: src/conf.c msgid "timelapse_codec" msgstr "å»¶æ—¶ç¼–è§£ç å™¨" #: src/conf.c msgid "timelapse_filename" msgstr "游æˆä¸­æ—¶å…‰å€’æµæ–‡ä»¶å" #: src/conf.c msgid "video_pipe" msgstr "视频管é“" #: src/conf.c msgid "video_pipe_motion" msgstr "视频管é“è¿åЍ" #: src/conf.c msgid "webcontrol_port" msgstr "Web控制端å£" #: src/conf.c msgid "webcontrol_ipv6" msgstr "网路控制ipv6" #: src/conf.c msgid "webcontrol_localhost" msgstr "webcontrol本地主机" #: src/conf.c msgid "webcontrol_parms" msgstr "webcontrol傿•°" #: src/conf.c msgid "webcontrol_interface" msgstr "Web控制界é¢" #: src/conf.c msgid "webcontrol_auth_method" msgstr "webcontrol auth方法" #: src/conf.c msgid "webcontrol_authentication" msgstr "网站控制认è¯" #: src/conf.c msgid "webcontrol_tls" msgstr "webcontrol tls" #: src/conf.c msgid "webcontrol_cert" msgstr "网站控制è¯ä¹¦" #: src/conf.c msgid "webcontrol_key" msgstr "网页控制键" #: src/conf.c msgid "webcontrol_header_params" msgstr "webcontrol 头傿•°" #: src/conf.c msgid "webcontrol_lock_minutes" msgstr "网络控制é”定分钟" #: src/conf.c msgid "webcontrol_lock_attempts" msgstr "网络控制é”定å°è¯•" #: src/conf.c msgid "webcontrol_lock_max_ips" msgstr "webcontrol锿œ€å¤§ips" #: src/conf.c msgid "stream_port" msgstr "æµç«¯å£" #: src/conf.c msgid "stream_localhost" msgstr "æµæœ¬åœ°ä¸»æœº" #: src/conf.c msgid "stream_auth_method" msgstr "æµè®¤è¯æ–¹æ³•" #: src/conf.c msgid "stream_authentication" msgstr "æµè®¤è¯" #: src/conf.c msgid "stream_tls" msgstr "æµtls" #: src/conf.c msgid "stream_header_params" msgstr "æµå¤´å‚æ•°" #: src/conf.c msgid "stream_preview_scale" msgstr "æµé¢„览比例" #: src/conf.c msgid "stream_preview_newline" msgstr "æµé¢„览æ¢è¡Œç¬¦" #: src/conf.c msgid "stream_preview_method" msgstr "æµé¢„览方法" #: src/conf.c msgid "stream_quality" msgstr "æµè´¨é‡" #: src/conf.c msgid "stream_grey" msgstr "æµç°è‰²" #: src/conf.c msgid "stream_motion" msgstr "溪æµè¿åЍ" #: src/conf.c msgid "stream_maxrate" msgstr "æµæœ€å¤§" #: src/conf.c msgid "stream_limit" msgstr "æµé™åˆ¶" #: src/conf.c msgid "database_type" msgstr "æ•°æ®åº“类型" #: src/conf.c msgid "database_dbname" msgstr "æ•°æ®åº“dbname" #: src/conf.c msgid "database_host" msgstr "æ•°æ®åº“主机" #: src/conf.c msgid "database_port" msgstr "æ•°æ®åº“端å£" #: src/conf.c msgid "database_user" msgstr "æ•°æ®åº“用户" #: src/conf.c msgid "database_password" msgstr "æ•°æ®åº“密ç " #: src/conf.c msgid "database_busy_timeout" msgstr "æ•°æ®åº“ç¹å¿™è¶…æ—¶" #: src/conf.c msgid "sql_log_picture" msgstr "sql日志图片" #: src/conf.c msgid "sql_log_snapshot" msgstr "sql日志快照" #: src/conf.c msgid "sql_log_movie" msgstr "sql日志电影" #: src/conf.c msgid "sql_log_timelapse" msgstr "SQL日志游æˆä¸­æ—¶å…‰å€’æµ" #: src/conf.c msgid "sql_query_start" msgstr "sql查询开始" #: src/conf.c msgid "sql_query_stop" msgstr "sqlæŸ¥è¯¢åœæ­¢" #: src/conf.c msgid "sql_query" msgstr "sql查询" #: src/conf.c msgid "track_type" msgstr "轨é“类型" #: src/conf.c msgid "track_auto" msgstr "自动跟踪" #: src/conf.c msgid "track_port" msgstr "跟踪端å£" #: src/conf.c msgid "track_motorx" msgstr "履带马达" #: src/conf.c msgid "track_motorx_reverse" msgstr "跟踪电机xåå‘" #: src/conf.c msgid "track_motory" msgstr "跟踪è¿åЍ" #: src/conf.c msgid "track_motory_reverse" msgstr "跟踪电动倒车" #: src/conf.c msgid "track_maxx" msgstr "追踪maxx" #: src/conf.c msgid "track_minx" msgstr "追踪Minx" #: src/conf.c msgid "track_maxy" msgstr "跟踪马克西" #: src/conf.c msgid "track_miny" msgstr "跟踪å°å·" #: src/conf.c msgid "track_homex" msgstr "追踪homex" #: src/conf.c msgid "track_homey" msgstr "跟踪家常" #: src/conf.c msgid "track_iomojo_id" msgstr "追踪iomojo ID" #: src/conf.c msgid "track_step_angle_x" msgstr "跟踪步è·è§’x" #: src/conf.c msgid "track_step_angle_y" msgstr "è½¨é“æ­¥è·è§’y" #: src/conf.c msgid "track_move_wait" msgstr "跟踪移动等待" #: src/conf.c msgid "track_speed" msgstr "跟踪速度" #: src/conf.c msgid "track_stepsize" msgstr "跟踪步长" #: src/conf.c msgid "track_generic_move" msgstr "追踪一般动作" #: src/conf.c msgid "camera" msgstr "相机" #: src/conf.c msgid "camera_dir" msgstr "相机目录" #: src/dbse.c msgid "Closing MySQL library" msgstr "关闭 MySQL 库" #: src/dbse.c msgid "Closing MariaDB library" msgstr "关闭 MariaDB 库" #: src/dbse.c msgid "Database closed" msgstr "æ•°æ®åº“关闭" #: src/dbse.c msgid "Initializing database" msgstr "åˆå§‹åŒ–æ•°æ®åº“" #: src/dbse.c #, c-format msgid "Cannot connect to MySQL database %s on host %s with user %s" msgstr "无法使用用户 %s连接到主机 %s上的MySQLæ•°æ®åº“ %s" #: src/dbse.c #, c-format msgid "MySQL error was %s" msgstr "MySQL错误为 %s" #: src/dbse.c #, c-format msgid "Cannot connect to MariaDB database %s on host %s with user %s" msgstr "无法使用用户 %s 连接到主机 %s 上的 MariaDB æ•°æ®åº“ %s" #: src/dbse.c #, c-format msgid "MariaDB error was %s" msgstr "MariaDB 错误为 %s" #: src/dbse.c #, c-format msgid "Opening database %s" msgstr "正在打开数æ®åº“ %s" #: src/dbse.c #, c-format msgid "Can't open SQLite3 database %s. Error %d : %s" msgstr "无法打开 SQLite3 æ•°æ®åº“ %s。错误 %d: %s" #: src/dbse.c #, c-format msgid "Setting busy timeout to %d msec" msgstr "å°†ç¹å¿™è¶…时设置为 %d 毫秒" #: src/dbse.c #, c-format msgid "Setting busy timeout failed. Error %d:%s" msgstr "设置ç¹å¿™è¶…时失败。错误 %d:%s" #: src/dbse.c #, c-format msgid "Connection to PostgreSQL database '%s' failed: %s" msgstr "与PostgreSQLæ•°æ®åº“' %s'的连接失败: %s" #: src/dbse.c #, c-format msgid "Database type %s" msgstr "æ•°æ®åº“类型 %s" #: src/dbse.c msgid "Executing MySQL query" msgstr "执行 MySQL 查询" #: src/dbse.c #, c-format msgid "MySQL query failed %s error code %d" msgstr "MySQL 查询失败 %s é”™è¯¯ä»£ç  %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MySQL database %s on host %s with user %s MySQL error " "was %s" msgstr "无法通过用户 %s MySQLé”™è¯¯é‡æ–°è¿žæŽ¥åˆ°ä¸»æœº %s上的MySQLæ•°æ®åº“ %s是 %s" #: src/dbse.c #, c-format msgid "Re-Connection to MySQL database '%s' Succeed" msgstr "釿–°è¿žæŽ¥åˆ° MySQL æ•°æ®åº“\"%s\"æˆåŠŸ" #: src/dbse.c #, c-format msgid "after re-connection MySQL query failed %s error code %d" msgstr "釿–°è¿žæŽ¥ MySQL æŸ¥è¯¢å¤±è´¥åŽ %s é”™è¯¯ä»£ç  %d" #: src/dbse.c msgid "Executing MariaDB query" msgstr "执行 MariaDB 查询" #: src/dbse.c #, c-format msgid "MariaDB query failed %s error code %d" msgstr "MariaDB 查询失败 %s é”™è¯¯ä»£ç  %d" #: src/dbse.c #, c-format msgid "" "Cannot reconnect to MariaDB database %s on host %s with user %s MariaDB " "error was %s" msgstr "" "无法使用用户 %s MariaDB 釿–°è¿žæŽ¥åˆ°ä¸»æœº %s 上的 MariaDB æ•°æ®åº“ %s错误是 %s" #: src/dbse.c #, c-format msgid "Re-Connection to MariaDB database '%s' Succeed" msgstr "釿–°è¿žæŽ¥åˆ° MariaDB æ•°æ®åº“\"%s\"æˆåŠŸ" #: src/dbse.c #, c-format msgid "after re-connection MariaDB query failed %s error code %d" msgstr "釿–°è¿žæŽ¥ MariaDB æŸ¥è¯¢å¤±è´¥åŽ %s é”™è¯¯ä»£ç  %d" #: src/dbse.c #, c-format msgid "Re-connected to PostgreSQL database '%s'" msgstr "釿–°è¿žæŽ¥åˆ° PostgreSQL æ•°æ®åº“\"%s\"" #: src/dbse.c msgid "Executing PostgreSQL query" msgstr "执行 PostgreSQL 查询" #: src/dbse.c #, c-format msgid "Attempting reconnect to PostgreSQL database '%s': %s" msgstr "正在å°è¯•釿–°è¿žæŽ¥åˆ° PostgreSQL æ•°æ®åº“\"%s\":%s" #: src/dbse.c #, c-format msgid "PGSQL query failed: [%s] %s %s" msgstr "PGSQL查询失败:[%s] %s %s" #: src/dbse.c #, c-format msgid "Executing %s" msgstr "正在执行 %s" #: src/dbse.c #, c-format msgid "SQLite3 error %d : %s" msgstr "SQLite3 错误 %d: %s" #: src/dbse.c msgid "Ignoring empty sql query" msgstr "忽略空 sql 查询" #: src/event.c src/track.c #, c-format msgid "Unable to start external command '%s'" msgstr "无法å¯åŠ¨å¤–éƒ¨å‘½ä»¤' %s'" #: src/event.c src/track.c #, c-format msgid "Executing external command '%s'" msgstr "执行外部命令' %s'" #: src/event.c #, c-format msgid "Writing image to file: %s" msgstr "将图åƒå†™å…¥æ–‡ä»¶ï¼š%s" #: src/event.c #, c-format msgid "Writing movie to file: %s" msgstr "将电影写入文件:%s" #: src/event.c #, c-format msgid "Saved image to file: %s" msgstr "已将图åƒä¿å­˜åˆ°æ–‡ä»¶ï¼š%s" #: src/event.c #, c-format msgid "Saved movie to file: %s" msgstr "已将电影ä¿å­˜åˆ°æ–‡ä»¶ï¼š%s" #: src/event.c msgid "Failed to put image into video pipe" msgstr "æ— æ³•å°†å›¾åƒæ”¾å…¥è§†é¢‘管é“" #: src/event.c #, c-format msgid "Could not create symbolic link [%s]" msgstr "无法创建符å·é“¾æŽ¥[ %s]" #: src/event.c #, c-format msgid "Error creating preview pipe name %d %s" msgstr "创建预览管é“åç§° %d %s时出错" #: src/event.c #, c-format msgid "Error creating file name base %d %s" msgstr "创建文件å基础 %d %s时出错" #: src/event.c #, c-format msgid "Error creating preview name %d %s" msgstr "创建预览åç§° %d %s时出错" #: src/event.c #, c-format msgid "CLOSING: extpipe file desc %d, error state %d" msgstr "正在关闭:extpipe文件æè¿° %d,错误状æ€ä¸º %d" #: src/event.c #, c-format msgid "pclose return: %d" msgstr "pclose返回:%d" #: src/event.c #, c-format msgid "Source FPS %d" msgstr "æ¥æºFPS %d" #: src/event.c #, c-format msgid "moviepath: %s" msgstr "电影路径: %s" #: src/event.c #, c-format msgid "no write access to target directory %s" msgstr "没有对目标目录 %s的写访问æƒ" #: src/event.c #, c-format msgid "path not found, trying to create it %s ..." msgstr "找ä¸åˆ°è·¯å¾„,å°è¯•创建它 %s ..." #: src/event.c #, c-format msgid "error accesing path %s" msgstr "错误访问路径 %s" #: src/event.c #, c-format msgid "Error specifying command line: %s" msgstr "指定命令行时出错: %s" #: src/event.c #, c-format msgid "pipe: %s" msgstr "管é“: %s" #: src/event.c #, c-format msgid "cnt->moviefps: %d" msgstr "cnt-> moviefps:%d" #: src/event.c msgid "popen failed" msgstr "弹出失败" #: src/event.c msgid "Using extpipe" msgstr "使用extpipe" #: src/event.c #, c-format msgid "Error writing in pipe , state error %d" msgstr "在管é“中写入错误,状æ€é”™è¯¯ %d" #: src/event.c #, c-format msgid "pipe %s not created or closed already " msgstr "ç®¡é“ %s尚未创建或关闭" #: src/event.c msgid "The ogg container is no longer supported. Changing to mpeg4" msgstr "ä¸å†æ”¯æŒogg容器。更改为mpeg4" #: src/event.c msgid "Running test of the various output formats." msgstr "å„ç§è¾“出格å¼çš„è¿è¡Œæµ‹è¯•。" #: src/event.c msgid "Error opening context for movie output." msgstr "打开电影输出的上下文时出错。" #: src/event.c #, c-format msgid "ffopen_open error creating (motion) file [%s]" msgstr "ffopen打开错误创建(è¿åŠ¨ï¼‰æ–‡ä»¶[ %s]" #: src/event.c msgid "" "The swf container for timelapse no longer supported. Using mpg container." msgstr "ä¸å†æ”¯æŒç”¨äºŽå»¶æ—¶æ‹æ‘„çš„swf容器。使用mpg容器。" #: src/event.c msgid "Timelapse using mpg codec." msgstr "游æˆä¸­æ—¶å…‰å€’æµä½¿ç”¨mpgç¼–è§£ç å™¨ã€‚" #: src/event.c msgid "Events will be appended to file" msgstr "事件将被附加到文件中" #: src/event.c msgid "Timelapse using mpeg4 codec." msgstr "使用mpeg4ç¼–è§£ç å™¨çš„æ¸¸æˆä¸­æ—¶å…‰å€’æµã€‚" #: src/event.c msgid "Events will be trigger new files" msgstr "äº‹ä»¶å°†è§¦å‘æ–°æ–‡ä»¶" #: src/event.c #, c-format msgid "ffopen_open error creating (timelapse) file [%s]" msgstr "ffopen打开错误创建(间隔)文件[ %s]" #: src/event.c msgid "Error encoding image" msgstr "图片编ç é”™è¯¯" #: src/ffmpeg.c msgid "Failed to allocate memory for codec name" msgstr "无法为编解ç å™¨å称分é…内存" #: src/ffmpeg.c msgid "" "The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate." msgstr "" "对于指定的ffmpeg电影类型,指定的帧率太高。选择其他ffmpeg容器或较低的帧速率。" #: src/ffmpeg.c msgid "Error setting base file name" msgstr "è®¾ç½®åŸºæœ¬æ–‡ä»¶åæ—¶å‡ºé”™" #: src/ffmpeg.c #, c-format msgid "Error setting timelapse append for codec %s" msgstr "ç¼–è§£ç å™¨ %s的设置超时设置错误" #: src/ffmpeg.c msgid "Error setting file name" msgstr "è®¾ç½®æ–‡ä»¶åæ—¶å‡ºé”™" #: src/ffmpeg.c #, c-format msgid "codec option value %s is not supported" msgstr "䏿”¯æŒç¼–è§£ç å™¨é€‰é¡¹å€¼ %s" #: src/ffmpeg.c msgid "Could not get the codec" msgstr "无法获å–ç¼–è§£ç å™¨" #: src/ffmpeg.c #, c-format msgid "Error sending frame for encoding:%s" msgstr "å‘é€ç¼–ç å¸§æ—¶å‡ºé”™ï¼š %s" #: src/ffmpeg.c #, c-format msgid "Receive packet threw EAGAIN returning -2 code :%s" msgstr "接收到的数æ®åŒ…被抛出EAGAIN返回-2代ç ï¼š %s" #: src/ffmpeg.c #, c-format msgid "Error receiving encoded packet video:%s" msgstr "接收编ç çš„æ•°æ®åŒ…视频时出错: %s" #: src/ffmpeg.c #, c-format msgid "Error encoding video:%s" msgstr "ç¼–ç è§†é¢‘时出错: %s" #: src/ffmpeg.c msgid "Error encoding video" msgstr "视频编ç é”™è¯¯" #: src/ffmpeg.c #, c-format msgid "PTS % Base PTS % ms interval % timebase %d-%d" msgstr "PTS %基本PTS % msé—´éš” %时基 %d- %d" #: src/ffmpeg.c msgid "BAD TIMING!! Frame skipped." msgstr "糟糕的时机ï¼ï¼è·³å¸§ã€‚" #: src/ffmpeg.c #, c-format msgid "" "PTS % Base PTS % ms interval % timebase %d-%d Change " "%d" msgstr "PTS %基本PTS % msé—´éš” %时基 %d- %d更改 %d" #: src/ffmpeg.c #, c-format msgid "%s codec vbr/crf/bit_rate: %d" msgstr " %sç¼–è§£ç å™¨vbr / crf /ä½é€ŸçŽ‡ï¼š %d" #: src/ffmpeg.c #, c-format msgid "Preferred codec %s has been blacklisted: %s" msgstr "首选编解ç å™¨ %s已列入黑åå•: %s" #: src/ffmpeg.c #, c-format msgid "Codec %s not found" msgstr "找ä¸åˆ°ç¼–è§£ç å™¨ %s" #: src/ffmpeg.c #, c-format msgid "Using codec %s" msgstr "使用编解ç å™¨ %s" #: src/ffmpeg.c msgid "Could not alloc stream" msgstr "æ— æ³•åˆ†é…æµ" #: src/ffmpeg.c msgid "Failed to allocate codec!" msgstr "分é…ç¼–è§£ç å™¨å¤±è´¥ï¼" #: src/ffmpeg.c #, c-format msgid "Low fps. Encoding %d frames into a %d frames container." msgstr "低fps。将%d个帧编ç åˆ°%d个帧容器中。" #: src/ffmpeg.c msgid "Unable to set quality" msgstr "无法设定å“è´¨" #: src/ffmpeg.c #, c-format msgid "Reported FPS Supported %d/%d" msgstr "报告的FPSæ”¯æŒ %d / %d" #: src/ffmpeg.c #, c-format msgid "Could not open codec %s" msgstr "无法打开编解ç å™¨ %s" #: src/ffmpeg.c #, c-format msgid "Failed to copy decoder parameters!: %s" msgstr "无法å¤åˆ¶è§£ç å™¨å‚æ•°ï¼ï¼š %s" #: src/ffmpeg.c msgid "could not alloc frame" msgstr "æ— æ³•åˆ†é…æ¡†æž¶" #: src/ffmpeg.c #, c-format msgid "could not alloc buffers %s" msgstr "无法分é…缓冲区 %s" #: src/ffmpeg.c #, c-format msgid "error opening file %s" msgstr "打开文件 %s时出错" #: src/ffmpeg.c #, c-format msgid "Permission denied. %s" msgstr "没有æƒé™ã€‚ %s" #: src/ffmpeg.c #, c-format msgid "Error opening file %s" msgstr "打开文件 %s时出错" #: src/ffmpeg.c #, c-format msgid "Could not write ffmpeg header %s" msgstr "无法写入ffmpeg标头 %s" #: src/ffmpeg.c #, c-format msgid "Error entering draining mode:%s" msgstr "è¿›å…¥æŽ’æ°´æ¨¡å¼æ—¶å‡ºé”™ï¼š %s" #: src/ffmpeg.c #, c-format msgid "Error draining codec:%s" msgstr "清空编解ç å™¨æ—¶å‡ºé”™ï¼š %s" #: src/ffmpeg.c msgid "Error writing draining video frame" msgstr "写入耗尽视频帧时出错" #: src/ffmpeg.c msgid "Error while encoding picture" msgstr "ç¼–ç å›¾ç‰‡æ—¶å‡ºé”™" #: src/ffmpeg.c msgid "Error while writing video frame" msgstr "编写视频帧时出错" #: src/ffmpeg.c #, c-format msgid "av_copy_packet: %s" msgstr "av_copy_packet:%s" #: src/ffmpeg.c #, c-format msgid "Error while writing video frame: %s" msgstr "编写视频帧时出错: %s" #: src/ffmpeg.c msgid "RTSP context not available." msgstr "RTSP上下文ä¸å¯ç”¨ã€‚" #: src/ffmpeg.c msgid "rtsp camera not ready for pass-through." msgstr "rtsp相机尚未准备好通过。" #: src/ffmpeg.c msgid "pass-through mode enabled. Changing to MP4 container." msgstr "å¯ç”¨ç›´é€šæ¨¡å¼ã€‚更改为MP4容器。" #: src/ffmpeg.c msgid "Could not get codec!" msgstr "无法获得编解ç å™¨ï¼" #: src/ffmpeg.c src/netcam_rtsp.c msgid "Unable to copy codec parameters" msgstr "无法å¤åˆ¶ç¼–è§£ç å™¨å‚æ•°" #: src/ffmpeg.c msgid "Pass-through disabled. ffmpeg too old" msgstr "传递功能已ç¦ç”¨ã€‚ffmpeg太旧了" #: src/ffmpeg.c msgid "Pass-through stream opened" msgstr "直通æµå·²æ‰“å¼€" #: src/ffmpeg.c #, c-format msgid "ffmpeg libavcodec version %d.%d.%d libavformat version %d.%d.%d" msgstr "ffmpeg libavcodec版本 %d。 %d。 %d libavformat版本 %d。 %d。 %d" #: src/ffmpeg.c #, c-format msgid "av_lockmgr_register failed (%d)" msgstr "av lockmgr寄存器失败( %d)" #: src/ffmpeg.c msgid "No ffmpeg functionality included" msgstr "ä¸åŒ…å«ffmpeg功能" #: src/ffmpeg.c msgid "av_lockmgr_register reset failed on cleanup" msgstr "清除时av lockmgr寄存器é‡ç½®å¤±è´¥" #: src/ffmpeg.c msgid "Could not allocate output context" msgstr "无法分é…输出上下文" #: src/ffmpeg.c msgid "Could not setup passthru!" msgstr "无法设置直通ï¼" #: src/ffmpeg.c msgid "Could not set the stream" msgstr "无法设置æµ" #: src/ffmpeg.c msgid "Error flushing codec" msgstr "错误刷新编解ç å™¨" #: src/ffmpeg.c msgid "Excessive attempts to clear buffered packet" msgstr "å°è¯•清除缓冲数æ®åŒ…的次数过多" #: src/ffmpeg.c msgid "Buffered packet" msgstr "缓冲包" #: src/jpegutils.c #, c-format msgid "%s: Given jpeg buffer was too small" msgstr " %s:鉴于jpeg缓冲区太å°" #: src/jpegutils.c msgid "Invalid JPEG image dimensions" msgstr "无效的JPEG图åƒå°ºå¯¸" #: src/jpegutils.c src/netcam_jpeg.c #, c-format msgid "JPEG image size %dx%d, JPEG was %dx%d" msgstr "JPEG图åƒå¤§å° %dx %d,JPEG为 %dx %d" #: src/mmalcam.c #, c-format msgid "Received unexpected camera control callback event, 0x%08x" msgstr "收到æ„å¤–çš„æ‘„åƒæœºæŽ§åˆ¶å›žè°ƒäº‹ä»¶ï¼Œ0x %08x" #: src/mmalcam.c msgid "A high frame rate can cause problems with exposure of images" msgstr "é«˜å¸§é¢‘ä¼šå¯¼è‡´å›¾åƒæ›å…‰é—®é¢˜" #: src/mmalcam.c msgid "If autoexposure is not working, try a lower frame rate." msgstr "如果自动æ›å…‰ä¸èµ·ä½œç”¨ï¼Œè¯·å°è¯•é™ä½Žå¸§é€ŸçŽ‡ã€‚" #: src/mmalcam.c #, c-format msgid "Failed to create MMAL camera component %s" msgstr "无法创建MMAL相机组件 %s" #: src/mmalcam.c #, c-format msgid "MMAL camera %s doesn't have output ports" msgstr "MMAL相机 %s没有输出端å£" #: src/mmalcam.c #, c-format msgid "Unable to enable control port : error %d" msgstr "无法å¯ç”¨æŽ§åˆ¶ç«¯å£ï¼šé”™è¯¯ %d" #: src/mmalcam.c msgid "MMAL no-padding setup failed" msgstr "MMAL无填充设置失败" #: src/mmalcam.c msgid "camera video format couldn't be set" msgstr "无法设置相机视频格å¼" #: src/mmalcam.c msgid "camera component couldn't be enabled" msgstr "相机组件无法å¯ç”¨" #: src/mmalcam.c msgid "MMAL camera component created" msgstr "创建了MMAL相机组件" #: src/mmalcam.c msgid "MMAL camera buffer pool creation failed" msgstr "MMAL相机缓冲池创建失败" #: src/mmalcam.c msgid "MMAL camera buffer queue creation failed" msgstr "MMAL相机缓冲区队列创建失败" #: src/mmalcam.c #, c-format msgid "Unable to get a required buffer %d from pool queue" msgstr "æ— æ³•ä»Žæ± é˜Ÿåˆ—ä¸­èŽ·å–æ‰€éœ€çš„缓冲区 %d" #: src/mmalcam.c #, c-format msgid "Unable to send a buffer to port (%d)" msgstr "无法将缓冲区å‘é€åˆ°ç«¯å£ï¼ˆ %d)" #: src/mmalcam.c #, c-format msgid "MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps" msgstr "MMAL相机线程å¯åŠ¨ã€‚ 对于相机(%s)。 大å°%d x%d。 æ¯ç§’帧数%d" #: src/mmalcam.c msgid "camera params couldn't be allocated" msgstr "无法分é…ç›¸æœºå‚æ•°" #: src/mmalcam.c msgid "MMAL camera capture port enabling failed" msgstr "MMAL相机æ•获端å£å¯ç”¨å¤±è´¥" #: src/mmalcam.c msgid "MMAL camera capture start failed" msgstr "MMALæ‘„åƒæœºæ•获å¯åŠ¨å¤±è´¥" #: src/mmalcam.c msgid "MMAL Camera cleanup" msgstr "MMAL相机清ç†" #: src/mmalcam.c #, c-format msgid "cmd %d flags %08x size %d/%d at %08x, img_size=%d" msgstr "cmd%d。 标志%08x。 大å°%d /%d。 在%08x。 图片尺寸=%d" #: src/mmalcam.c msgid "Unable to return a buffer to the camera video port" msgstr "æ— æ³•å°†ç¼“å†²åŒºè¿”å›žåˆ°æ‘„åƒæœºè§†é¢‘端å£" #: src/motion.c #, c-format msgid "Resizing pre_capture buffer to %d items" msgstr "将预æ•获缓冲区的大å°è°ƒæ•´ä¸º %d个项目" #: src/motion.c msgid "Removed process id file (pid file)." msgstr "删除了进程ID文件(PID文件)。" #: src/motion.c msgid "Error removing pid file" msgstr "删除pid文件时出错" #: src/motion.c #, c-format msgid "Closing logfile (%s)." msgstr "正在关闭日志文件( %s)。" #: src/motion.c #, c-format msgid "Motion detected - starting event %d." msgstr "检测到è¿åЍ - 开始事件 %d。" #: src/motion.c #, c-format msgid "Added %d fillerframes into movie" msgstr "在电影中添加了 %d个填充框" #: src/motion.c msgid "Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)" msgstr "æ— æ³•ç¡®å®šæ‘„åƒæœºç±»åž‹ï¼ˆMMAL,Netcam,V4L2,BKTR)" #: src/motion.c msgid "Opening privacy mask file" msgstr "打开éšç§é®ç½©æ–‡ä»¶" #: src/motion.c msgid "Opening high resolution privacy mask file" msgstr "打开高分辨率éšç§é®ç½©æ–‡ä»¶" #: src/motion.c #, c-format msgid "Error opening mask file %s" msgstr "打开é®ç½©æ–‡ä»¶ %s时出错" #: src/motion.c msgid "Failed to read mask privacy image. Mask privacy feature disabled." msgstr "无法读å–é®ç½©éšç§å›¾åƒã€‚é®ç½©éšç§åŠŸèƒ½å·²ç¦ç”¨ã€‚" #: src/motion.c #, c-format msgid "Mask privacy file \"%s\" loaded." msgstr "å±è”½éšç§æ–‡ä»¶\" %s\"已加载。" #: src/motion.c #, c-format msgid "Invalid text scale. Adjusted to %d" msgstr "无效的文字比例。调整为 %d" #: src/motion.c #, c-format msgid "Camera %d started: motion detection %s" msgstr "相机 %då·²å¯åŠ¨ï¼šè¿åŠ¨æ£€æµ‹ %s" #: src/motion.c msgid "Disabled" msgstr "残障人士" #: src/motion.c msgid "Enabled" msgstr "å·²å¯ç”¨" #: src/motion.c msgid "Pass-through processing disabled." msgstr "传递处ç†å·²ç¦ç”¨ã€‚" #: src/motion.c #, c-format msgid "Invalid configuration dimensions %dx%d" msgstr "无效的é…置尺寸 %dx %d" #: src/motion.c #, c-format msgid "Using default dimensions %dx%d" msgstr "使用默认尺寸 %dx %d" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image width (%d) requested is not modulo 8." msgstr "请求的图åƒå®½åº¦ï¼ˆ %dï¼‰ä¸æ˜¯æ¨¡8。" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting width to next higher multiple of 8 (%d)." msgstr "将宽度调整为8çš„ä¸‹ä¸€ä¸ªè¾ƒé«˜å€æ•°ï¼ˆ %d)。" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Image height (%d) requested is not modulo 8." msgstr "请求的图åƒé«˜åº¦ï¼ˆ %dï¼‰ä¸æ˜¯æ¨¡8。" #: src/motion.c src/netcam_rtsp.c #, c-format msgid "Adjusting height to next higher multiple of 8 (%d)." msgstr "将高度调整为8çš„ä¸‹ä¸€ä¸ªè¾ƒé«˜å€æ•°ï¼ˆ %d)。" #: src/motion.c msgid "Could not fetch initial image from camera " msgstr "无法从相机获å–åˆå§‹å›¾åƒ" #: src/motion.c msgid "Motion continues using width and height from config file(s)" msgstr "è¿åŠ¨ç»§ç»­ä½¿ç”¨é…置文件中的宽度和高度" #: src/motion.c msgid "Motion only supports width and height modulo 8" msgstr "è¿åŠ¨ä»…æ”¯æŒå®½åº¦å’Œé«˜åº¦æ¨¡8" #: src/motion.c #, c-format msgid "Image width (%d) or height(%d) requested is not modulo 8." msgstr "请求的图åƒå®½åº¦ï¼ˆ %d)或高度( %dï¼‰ä¸æ˜¯æ¨¡8。" #: src/motion.c #, c-format msgid "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "è¿åŠ¨ä»…æ”¯æŒå®½åº¦å’Œé«˜åº¦å¤§äºŽæˆ–等于64 %dx %d的宽度" #: src/motion.c msgid "Substream not available. Image sizes not modulo 16." msgstr "å­æµä¸å¯ç”¨ã€‚图åƒå°ºå¯¸ä¸å–模16" #: src/motion.c msgid "webp image format is not available, failing back to jpeg" msgstr "webp图片格å¼ä¸å¯ç”¨ï¼Œæ— æ³•æ¢å¤ä¸ºjpeg" #: src/motion.c msgid "Error capturing first image" msgstr "æ•èŽ·ç¬¬ä¸€å¼ å›¾åƒæ—¶å‡ºé”™" #: src/motion.c msgid "Opening video loopback device for normal pictures" msgstr "打开用于正常图片的视频环回设备" #: src/motion.c msgid "Failed to open video loopback for normal pictures" msgstr "无法为正常图片打开视频环回" #: src/motion.c msgid "Opening video loopback device for motion pictures" msgstr "打开电影的视频环回设备" #: src/motion.c msgid "Failed to open video loopback for motion pictures" msgstr "无法打开电影的视频环回" #: src/motion.c msgid "Failed to read mask image. Mask feature disabled." msgstr "无法读å–é®ç½©å›¾åƒã€‚é®ç½©åŠŸèƒ½å·²ç¦ç”¨ã€‚" #: src/motion.c #, c-format msgid "Maskfile \"%s\" loaded." msgstr "Maskfile \" %s \"已加载。" #: src/motion.c msgid "Emulating motion" msgstr "模拟è¿åЍ" #: src/motion.c #, c-format msgid "Motion in area %d detected." msgstr "检测到 %d区域中的è¿åŠ¨ã€‚" #: src/motion.c msgid "Retrying until successful connection with camera" msgstr "é‡è¯•直到æˆåŠŸè¿žæŽ¥ç›¸æœº" #: src/motion.c msgid "Camera has become available." msgstr "相机已å¯ç”¨ã€‚" #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8." msgstr "" "釿–°å¯åЍè¿åŠ¨ã€‚\n" "请求的图åƒå®½åº¦ (%d) 或高度 (%d) 䏿˜¯æ¨¡ 8。" #: src/motion.c #, c-format msgid "" "Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d" msgstr "" "釿–°å¯åЍè¿åŠ¨ã€‚\n" "Motion 仅支æŒå®½åº¦å’Œé«˜åº¦å¤§äºŽç­‰äºŽ 64 %dx%d" #: src/motion.c msgid "" "Restarting Motion.\n" "Height or width has changed on camera." msgstr "" "釿–°å¯åЍè¿åŠ¨ã€‚\n" "相机的高度或宽度å‘生了å˜åŒ–。" #: src/motion.c msgid "" "Restarting Motion.\n" "High resolution has changed on camera." msgstr "" "釿–°å¯åЍè¿åŠ¨ã€‚\n" "相机上的高分辨率已更改。" #: src/motion.c msgid "Video signal re-acquired" msgstr "釿–°èŽ·å–视频信å·" #: src/motion.c msgid "Video device fatal error - Closing video device" msgstr "视频设备致命错误-关闭视频设备" #: src/motion.c msgid "Restarting Motion thread to reinitialize all image buffers" msgstr "釿–°å¯åЍMotionçº¿ç¨‹ä»¥é‡æ–°åˆå§‹åŒ–所有图åƒç¼“冲区" #: src/motion.c msgid "Video signal lost - Adding grey image" msgstr "视频信å·ä¸¢å¤±-添加ç°è‰²å›¾åƒ" #: src/motion.c msgid "Video signal still lost - Trying to close video device" msgstr "视频信å·ä»ç„¶ä¸¢å¤±-å°è¯•关闭视频设备" #: src/motion.c msgid "Lightswitch detected" msgstr "检测到电ç¯å¼€å…³" #: src/motion.c msgid "Switchfilter detected" msgstr "检测到Switchfilter" #: src/motion.c msgid "micro-lightswitch!" msgstr "微型电ç¯å¼€å…³ï¼" #: src/motion.c #, c-format msgid "End of event %d" msgstr "事件 %d结æŸ" #: src/motion.c #, c-format msgid "Raw changes: %5d - changes after '%s': %5d" msgstr "原始更改: %5d-' %s'之åŽçš„æ›´æ”¹ï¼š %5d" #: src/motion.c #, c-format msgid " - labels: %3d" msgstr "-标签: %3d" #: src/motion.c #, c-format msgid "Changes: %5d" msgstr "å˜æ›´ï¼š %5d" #: src/motion.c #, c-format msgid " - noise level: %2d" msgstr "-噪音等级: %2d" #: src/motion.c #, c-format msgid " - threshold: %d" msgstr "-阈值: %d" #: src/motion.c #, c-format msgid "Invalid timelapse_mode argument '%s'" msgstr "æ— æ•ˆçš„é—´éš”æ‹æ‘„模å¼å‚æ•°' %s'" #: src/motion.c msgid "%:s Defaulting to manual timelapse mode" msgstr " %:sé»˜è®¤ä¸ºæ‰‹åŠ¨é—´éš”æ‹æ‘„模å¼" #: src/motion.c msgid "Thread exiting" msgstr "线程退出" #: src/motion.c msgid "Motion going to daemon mode" msgstr "è¿åŠ¨è¿›å…¥å®ˆæŠ¤ç¨‹åºæ¨¡å¼" #: src/motion.c #, c-format msgid "Exit motion, cannot create process id file (pid file) %s" msgstr "退出è¿åŠ¨ï¼Œæ— æ³•åˆ›å»ºè¿›ç¨‹ID文件(PID文件) %s" #: src/motion.c msgid "Could not change directory" msgstr "无法更改目录" #: src/motion.c #, c-format msgid "Created process id file %s. Process ID is %d" msgstr "已创建进程ID文件 %s。进程ID为 %d" #: src/motion.c msgid "" "Camara IDs are not unique or have values over 32,000. Falling back to " "thread numbers" msgstr "Camara ID䏿˜¯å”¯ä¸€çš„,或值超过32,000。退回线程å·" #: src/motion.c msgid "v4l2 : available" msgstr "v4l2:å¯ç”¨" #: src/motion.c msgid "v4l2 : not available" msgstr "v4l2:ä¸å¯ç”¨" #: src/motion.c msgid "bktr : available" msgstr "bktr:å¯ç”¨" #: src/motion.c msgid "bktr : not available" msgstr "bktr:ä¸å¯ç”¨" #: src/motion.c msgid "webp : available" msgstr "webp:å¯ç”¨" #: src/motion.c msgid "webp : not available" msgstr "webp:ä¸å¯ç”¨" #: src/motion.c msgid "mmal : available" msgstr "mmal:å¯ç”¨" #: src/motion.c msgid "mmal : not available" msgstr "mmal:ä¸å¯ç”¨" #: src/motion.c msgid "ffmpeg : available" msgstr "ffmpeg:å¯ç”¨" #: src/motion.c msgid "ffmpeg : not available" msgstr "ffmpeg:ä¸å¯ç”¨" #: src/motion.c msgid "mysql : available" msgstr "mysql:å¯ç”¨" #: src/motion.c msgid "mysql : not available" msgstr "mysql:ä¸å¯ç”¨" #: src/motion.c msgid "MariaDB: available" msgstr "MariaDB:å¯ç”¨" #: src/motion.c msgid "MariaDB: not available" msgstr "MariaDB:ä¸å¯ç”¨" #: src/motion.c msgid "sqlite3: available" msgstr "sqlite3:å¯ç”¨" #: src/motion.c msgid "sqlite3: not available" msgstr "sqlite3:ä¸å¯ç”¨" #: src/motion.c msgid "pgsql : available" msgstr "pgsql:å¯ç”¨" #: src/motion.c msgid "pgsql : not available" msgstr "pgsql:ä¸å¯ç”¨" #: src/motion.c msgid "nls : available" msgstr "nls:å¯ç”¨" #: src/motion.c msgid "nls : not available" msgstr "nls:ä¸å¯ç”¨" #: src/motion.c #, c-format msgid "Using default log level (%s) (%d)" msgstr "使用默认日志级别( %s)( %d)" #: src/motion.c #, c-format msgid "Logging to file (%s)" msgstr "记录到文件( %s)" #: src/motion.c #, c-format msgid "Exit motion, cannot create log file %s" msgstr "退出è¿åŠ¨ï¼Œæ— æ³•åˆ›å»ºæ—¥å¿—æ–‡ä»¶ %s" #: src/motion.c msgid "Logging to syslog" msgstr "记录到系统日志" #: src/motion.c #, c-format msgid "Motion %s Started" msgstr "è¿åЍ %s 已开始" #: src/motion.c #, c-format msgid "Using default log type (%s)" msgstr "使用默认日志类型( %s)" #: src/motion.c #, c-format msgid "Using log type (%s) log level (%s)" msgstr "使用日志类型( %s)日志级别( %s)" #: src/motion.c msgid "Motion running as daemon process" msgstr "è¿åŠ¨ä½œä¸ºå®ˆæŠ¤è¿›ç¨‹è¿è¡Œ" #: src/motion.c msgid "Motion running in setup mode." msgstr "è¿åŠ¨åœ¨è®¾ç½®æ¨¡å¼ä¸‹è¿è¡Œã€‚" #: src/motion.c #, c-format msgid "Camera ID: %d is from %s" msgstr "相机ID: %dæ¥è‡ª %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Service: %s" msgstr "相机ID: %d相机å称: %sæœåŠ¡ï¼š %s" #: src/motion.c #, c-format msgid "Camera ID: %d Camera Name: %s Device: %s" msgstr "相机ID: %d相机å称: %s设备: %s" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with the control port" msgstr "线程 %dçš„æµç«¯å£å· %d与控制端å£å†²çª" #: src/motion.c #, c-format msgid "Stream feature for thread %d is disabled." msgstr "线程 %dçš„æµåŠŸèƒ½å·²ç¦ç”¨ã€‚" #: src/motion.c #, c-format msgid "Stream port number %d for thread %d conflicts with thread %d" msgstr "线程 %dçš„æµç«¯å£å· %d与线程 %d冲çª" #: src/motion.c msgid "Restarting motion." msgstr "釿–°å¼€å§‹è¿åŠ¨ã€‚" #: src/motion.c msgid "Motion restarted" msgstr "è¿åЍ釿–°å¼€å§‹" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout. Trying to do a graceful restart" msgstr "线程 %d-看门狗超时。å°è¯•正常é‡å¯" #: src/motion.c #, c-format msgid "Thread %d - Watchdog timeout did NOT restart, killing it!" msgstr "线程 %d-çœ‹é—¨ç‹—è¶…æ—¶æœªé‡æ–°å¯åŠ¨ï¼Œå°†å…¶æ€æ­»ï¼" #: src/motion.c #, c-format msgid "Thread %d - Cleaning thread." msgstr "线程 %d-清æ´çº¿ç¨‹ã€‚" #: src/motion.c #, c-format msgid "DEBUG-1 threads_running %d motion_threads_running %d , finish %d" msgstr "è¿è¡Œ %dçš„DEBUG-1线程è¿è¡Œ %dçš„è¿åŠ¨çº¿ç¨‹ï¼Œå®Œæˆ %d" #: src/motion.c #, c-format msgid "Waiting for threads to finish, pid: %d" msgstr "等待线程完æˆï¼Œpid: %d" #: src/motion.c #, c-format msgid "Motion thread %d restart" msgstr "è¿åŠ¨çº¿ç¨‹ %d釿–°å¯åЍ" #: src/motion.c msgid "Threads finished" msgstr "线程完æˆ" #: src/motion.c src/webu.c msgid "Motion terminating" msgstr "è¿åŠ¨ç»ˆæ­¢" #: src/netcam.c msgid "Invalid URL. Can not parse values." msgstr "无效的网å€ã€‚无法解æžå€¼ã€‚" #: src/netcam.c #, c-format msgid "Camera handler thread [%d] started" msgstr "相机处ç†ç¨‹åºçº¿ç¨‹[ %d]å·²å¯åЍ" #: src/netcam.c msgid "" "Closing netcam socket as Keep-Alive time is up (camera sent Close field). A " "reconnect should happen." msgstr "" "当\"ä¿æŒæ´»åЍ\"时间到时,关闭netcamå¥—æŽ¥å­—ï¼ˆæ‘„åƒæœºå‘é€\"关闭\"字段)。一ç§é‡æ–°" "连接应该å‘生。" #: src/netcam.c msgid "re-opening camera (non-streaming)" msgstr "釿–°æ‰“å¼€ç›¸æœºï¼ˆéžæµåª’体)" #: src/netcam.c msgid "camera re-connected" msgstr "ç›¸æœºé‡æ–°è¿žæŽ¥" #: src/netcam.c #, c-format msgid "Unrecognized image header (%d)" msgstr "无法识别的图片标题( %d)" #: src/netcam.c #, c-format msgid "Error in header (%d)" msgstr "标头中的错误( %d)" #: src/netcam.c msgid "re-opening camera (streaming)" msgstr "釿–°æ‰“开相机(æµåª’体)" #: src/netcam.c msgid "Error getting jpeg image" msgstr "获å–jpegå›¾åƒæ—¶å‡ºé”™" #: src/netcam.c msgid "Trying to re-connect" msgstr "å°è¯•釿–°è¿žæŽ¥" #: src/netcam.c src/netcam_rtsp.c msgid "netcam camera handler: finish set, exiting" msgstr "netcam相机处ç†ç¨‹åºï¼šå®Œæˆè®¾ç½®ï¼Œé€€å‡º" #: src/netcam.c msgid "No response from camera handler - it must have already died" msgstr "相机处ç†ç¨‹åºæ— å“应-å®ƒå¿…é¡»å·²ç»æ­»äº†" #: src/netcam.c msgid "called with no data in buffer" msgstr "在缓冲区中没有数æ®çš„æƒ…况下调用" #: src/netcam.c #, c-format msgid "Network Camera starting for camera (%s)" msgstr "网路摄影机开始使用的摄影机( %s)" #: src/netcam.c #, c-format msgid "Invalid netcam_proxy (%s)" msgstr "无效的网络摄åƒå¤´ä»£ç†ï¼ˆ %s)" #: src/netcam.c msgid "Username/password not allowed on a proxy URL" msgstr "代ç†URL上ä¸å…许使用用户å/密ç " #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' " msgstr "无效的网络摄åƒå¤´æœåŠ¡' %s'" #: src/netcam.c #, c-format msgid "Invalid netcam_url for camera (%s)" msgstr "æ‘„åƒå¤´ï¼ˆ %s)的无效摄åƒå¤´URL" #: src/netcam.c #, c-format msgid "" "Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-" "Alive %s." msgstr "" "Netcam http傿•°' %s'转æ¢ä¸ºæ ‡å¿—:HTTP / 1.0: %s HTTP / 1.1: %s Keep-有效 " "%s。" #: src/netcam.c msgid "now calling netcam_setup_html()" msgstr "现在调用netcam setup html()" #: src/netcam.c msgid "now calling netcam_setup_ftp" msgstr "现在调用netcam setup ftp" #: src/netcam.c msgid "now calling netcam_setup_file()" msgstr "现在调用netcam设置文件()" #: src/netcam.c src/netcam_http.c msgid "now calling netcam_setup_mjpg()" msgstr "现在调用netcam setup mjpg()" #: src/netcam.c #, c-format msgid "Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg." msgstr "无效的网络摄åƒå¤´æœåŠ¡\"%s\" - 必须是 mjpegã€ftpã€mjpg 或 jpeg。" #: src/netcam.c src/netcam_rtsp.c #, c-format msgid "Failed trying to read first image - retval:%d" msgstr "å°è¯•读å–第一张图åƒå¤±è´¥-retval: %d" #: src/netcam.c msgid "libjpeg decompression failure on first frame - giving up!" msgstr "第一帧libjpeg解压缩失败-放弃ï¼" #: src/netcam.c #, c-format msgid "Width/height(%dx%d) must be multiples of 8" msgstr "宽度/高度( %dx %d)必须为8çš„å€æ•°" #: src/netcam.c #, c-format msgid "Error starting camera handler thread [%d]" msgstr "å¯åŠ¨ç›¸æœºå¤„ç†ç¨‹åºçº¿ç¨‹[ %d]时出错" #: src/netcam_ftp.c msgid "recv failed in ftp_get_more" msgstr "ftp中的recv失败获得更多" #: src/netcam_ftp.c #, c-format msgid "Server Response: %s" msgstr "æœåС噍å“应: %s" #: src/netcam_ftp.c msgid "send failed in ftp_send_user" msgstr "在ftp中å‘é€å¤±è´¥å‘é€ç”¨æˆ·" #: src/netcam_ftp.c msgid "send failed in ftp_send_passwd" msgstr "在ftp中å‘é€å¤±è´¥å‘é€passwd" #: src/netcam_ftp.c msgid "send failed in ftp_quit" msgstr "ftp退出å‘é€å¤±è´¥" #: src/netcam_ftp.c msgid "gethostbyname failed in ftp_connect" msgstr "ftp连接中的gethostbyname失败" #: src/netcam_ftp.c msgid "gethostbyname address mismatch in ftp_connect" msgstr "ftp连接中的gethostbyname地å€ä¸åŒ¹é…" #: src/netcam_ftp.c msgid "socket failed" msgstr "套接字失败" #: src/netcam_ftp.c msgid "Failed to create a connection" msgstr "创建连接失败" #: src/netcam_ftp.c msgid "FTP server asking for ACCT on anonymous" msgstr "FTPæœåŠ¡å™¨è¦æ±‚对匿å用户进行ACCT" #: src/netcam_ftp.c msgid "setting socket option SO_REUSEADDR" msgstr "设置套接字选项SO REUSEADDR" #: src/netcam_ftp.c msgid "send failed in ftp_get_connection" msgstr "在ftp中å‘é€å¤±è´¥èŽ·å¾—è¿žæŽ¥" #: src/netcam_ftp.c msgid "Invalid answer to PASV" msgstr "对PASV的答案无效" #: src/netcam_ftp.c msgid "Failed to create a data connection" msgstr "创建数æ®è¿žæŽ¥å¤±è´¥" #: src/netcam_ftp.c msgid "bind failed" msgstr "绑定失败" #: src/netcam_ftp.c msgid "listen failed" msgstr "å¬å¤±è´¥" #: src/netcam_ftp.c msgid "send failed in ftp_get_socket" msgstr "在ftp中å‘é€å¤±è´¥èŽ·å–套接字" #: src/netcam_ftp.c msgid "accept in ftp_get_socket" msgstr "在ftp中接å—获å–套接字" #: src/netcam_ftp.c msgid "recv failed in ftp_read" msgstr "接收失败,无法读å–ftp" #: src/netcam_ftp.c msgid "ftp_get_socket failed" msgstr "ftp获å–套接字失败" #: src/netcam_ftp.c msgid "Error sending TYPE I to ftp server" msgstr "å°†TYPE Iå‘é€åˆ°ftpæœåŠ¡å™¨æ—¶å‡ºé”™" #: src/netcam_http.c #, c-format msgid "malformed token Content-Length but value %ld" msgstr "ä»¤ç‰Œçš„å†…å®¹é•¿åº¦ä¸æ­£ç¡®ï¼Œä½†å€¼ %ld" #: src/netcam_http.c #, c-format msgid "Content-Length %ld" msgstr "内容长度 %ld" #: src/netcam_http.c #, c-format msgid "Content-type %s" msgstr "内容类型 %s" #: src/netcam_http.c msgid "Error reading image header, streaming mode (1). Null header." msgstr "åœ¨æµæ¨¡å¼ï¼ˆ1)下读å–å›¾åƒæ ‡é¢˜æ—¶å‡ºé”™ã€‚空头。" #: src/netcam_http.c #, c-format msgid "Error reading image header, streaming mode (1). Unknown header '%s'" msgstr "åœ¨æµæ¨¡å¼ï¼ˆ1)下读å–å›¾åƒæ ‡é¢˜æ—¶å‡ºé”™ã€‚未知头' %s'" #: src/netcam_http.c msgid "Error reading image header (2)" msgstr "读å–图片标题时出错(2个)" #: src/netcam_http.c msgid "Header not JPEG" msgstr "æ ‡å¤´ä¸æ˜¯JPEG" #: src/netcam_http.c msgid "Content-Length 0" msgstr "内容长度0" #: src/netcam_http.c msgid "Found image header record" msgstr "æ‰¾åˆ°å›¾åƒæ ‡é¢˜è®°å½•" #: src/netcam_http.c msgid "Error sending 'connect' request" msgstr "å‘é€\"连接\"请求时出错" #: src/netcam_http.c #, c-format msgid "Received first header ('%s')" msgstr "收到第一个标头(' %s')" #: src/netcam_http.c #, c-format msgid "Error reading first header (%s)" msgstr "读å–第一个标头( %s)时出错" #: src/netcam_http.c #, c-format msgid "HTTP Result code %d" msgstr "HTTPç»“æžœä»£ç  %d" #: src/netcam_http.c msgid "Removed netcam Keep-Alive flag due to apparent closed HTTP connection." msgstr "由于明显关闭的HTTP连接,删除了netcam Keep-Alive标志。" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive set)" msgstr "éžæµåª’ä½“ç›¸æœºï¼ˆä¿æŒæ´»åŠ¨çŠ¶æ€ï¼‰" #: src/netcam_http.c msgid "Non-streaming camera (keep-alive not set)" msgstr "éžæµåª’ä½“ç›¸æœºï¼ˆæœªè®¾ç½®ä¿æŒæ´»åŠ¨ï¼‰" #: src/netcam_http.c msgid "Streaming camera" msgstr "ä¸²æµæ‘„影机" #: src/netcam_http.c #, c-format msgid "Boundary string [%s]" msgstr "边界字符串[ %s]" #: src/netcam_http.c msgid "Boundary string not found in header" msgstr "在标头中找ä¸åˆ°è¾¹ç•Œå­—符串" #: src/netcam_http.c msgid "" "Streaming camera probably using MJPG-blocks, consider using mjpg:// " "netcam_url." msgstr "æµç›¸æœºå¯èƒ½ä½¿ç”¨MJPGå—,请考虑使用mjpg://网络摄åƒå¤´ç½‘å€ã€‚" #: src/netcam_http.c msgid "Unrecognized content type" msgstr "无法识别的内容类型" #: src/netcam_http.c msgid "Content-length present" msgstr "存在内容长度" #: src/netcam_http.c msgid "Content-length 0" msgstr "内容长度0" #: src/netcam_http.c #, c-format msgid "Found Conn: close header ('%s')" msgstr "找到Conn:关闭标头(' %s')" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion removes keepalive." msgstr "收到\"è¿žæŽ¥ï¼šä¿æŒæ´»åЍ\"å’Œ\"连接:关闭\"标头。è¿åŠ¨ä¼šåˆ é™¤keepalive。" #: src/netcam_http.c msgid "" "Both 'Connection: Keep-Alive' and 'Connection: close' header received. " "Motion continues unchanged." msgstr "收到\"è¿žæŽ¥ï¼šä¿æŒæ´»åЍ\"å’Œ\"连接:关闭\"标头。è¿åŠ¨ç»§ç»­ä¿æŒä¸å˜ã€‚" #: src/netcam_http.c msgid "Received a Keep-Alive field in this set of headers." msgstr "在这组标题中收到一个Keep-Alive字段。" #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion removes keepalive." msgstr "" "没有收到\"è¿žæŽ¥ï¼šä¿æŒæ´»åЍ\"或\"连接:关闭\"标头。\n" "è¿åŠ¨ä¼šåˆ é™¤keepalive。" #: src/netcam_http.c msgid "" "No 'Connection: Keep-Alive' nor 'Connection: close' header received.\n" " Motion continues unchanged." msgstr "" "没有收到\"è¿žæŽ¥ï¼šä¿æŒæ´»åЍ\"或\"连接:关闭\"标头。\n" "è¿åŠ¨ç»§ç»­ä¿æŒä¸å˜ã€‚" #: src/netcam_http.c msgid "" "Removed netcam Keep-Alive flag because 'Connection: close' header received.\n" " Netcam does not support Keep-Alive. Motion continues in non-Keep-Alive." msgstr "" "删除了网络摄åƒå¤´çš„\"ä¿æŒæ´»åЍ\"标记,因为收到了\"连接:关闭\"标头。\n" "Netcam䏿”¯æŒKeep-Alive。è¿åŠ¨åœ¨éžä¿æŒæ´»åŠ¨çŠ¶æ€ä¸‹ç»§ç»­ã€‚" #: src/netcam_http.c msgid "" "Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket." msgstr "" "Keep-Alive已到有效期结æŸã€‚\n" "Motion将关闭网络摄åƒå¤´ï¼Œç„¶åŽä½¿ç”¨æ–°çš„套接字æ¢å¤Keep-Alive。" #: src/netcam_http.c msgid "disconnect" msgstr "æ–­å¼€" #: src/netcam_http.c #, c-format msgid "getaddrinfo() failed (%s): %s" msgstr "getaddrinfo()失败( %s): %s" #: src/netcam_http.c msgid "disconnecting netcam (1)" msgstr "断开网络摄åƒå¤´ï¼ˆ1)" #: src/netcam_http.c msgid "disconnecting netcam since keep-alive not set." msgstr "ç”±äºŽæœªè®¾ç½®ä¿æŒæ´»åŠ¨çŠ¶æ€ï¼Œå› æ­¤æ–­å¼€äº†ç½‘络摄åƒå¤´çš„连接。" #: src/netcam_http.c msgid "with no keepalive, attempt to create socket failed." msgstr "没有keepalive,å°è¯•创建套接字失败。" #: src/netcam_http.c #, c-format msgid "with no keepalive, new socket created fd %d" msgstr "没有keepalive,创建了新的套接字fd %d" #: src/netcam_http.c msgid "" "with keepalive set, invalid socket.This could be the first time. Creating a " "new one failed." msgstr "设置了keepalive,无效的套接字。这å¯èƒ½æ˜¯ç¬¬ä¸€æ¬¡ã€‚创建一个新的失败了。" #: src/netcam_http.c #, c-format msgid "" "with keepalive set, invalid socket.This could be first time, created a new " "one with fd %d" msgstr "设置了keepalive,套接字无效。这å¯èƒ½æ˜¯ç¬¬ä¸€æ¬¡ï¼Œåˆ›å»ºäº†ä¸€ä¸ªæ–°çš„一个与fd %d" #: src/netcam_http.c #, c-format msgid "SO_KEEPALIVE is %s" msgstr "所以KEEPALIVE是 %s" #: src/netcam_http.c msgid "ON" msgstr "上" #: src/netcam_http.c msgid "OFF" msgstr "å…³" #: src/netcam_http.c msgid "SO_KEEPALIVE set on socket." msgstr "SO KEEPALIVE设置在æ’座上。" #: src/netcam_http.c msgid "fcntl(1) on socket" msgstr "套接字上的fcntl(1)" #: src/netcam_http.c msgid "fcntl(2) on socket" msgstr "套接字上的fcntl(2)" #: src/netcam_http.c #, c-format msgid "connect() failed (%d)" msgstr "connect()失败( %d)" #: src/netcam_http.c msgid "disconnecting netcam (4)" msgstr "断开网络摄åƒå¤´ï¼ˆ4)" #: src/netcam_http.c msgid "timeout on connect()" msgstr "connect()超时" #: src/netcam_http.c msgid "disconnecting netcam (2)" msgstr "断开网络摄åƒå¤´ï¼ˆ2)" #: src/netcam_http.c msgid "getsockopt after connect" msgstr "连接åŽgetsockopt" #: src/netcam_http.c msgid "connect returned error" msgstr "连接返回错误" #: src/netcam_http.c msgid "disconnecting netcam (3)" msgstr "断开网络摄åƒå¤´ï¼ˆ3)" #: src/netcam_http.c #, c-format msgid "expanding buffer from [%d/%d] to [%d/%d] bytes." msgstr "将缓冲区从[ %d / %d]字节扩展到[ %d / %d]个字节。" #: src/netcam_http.c #, c-format msgid "Potential split boundary - %d chars flushed, %d re-positioned" msgstr "潜在的分割边界-已清除 %dä¸ªå­—ç¬¦ï¼Œé‡æ–°å®šä½äº† %d个ä½ç½®" #: src/netcam_http.c msgid "recv() fail after boundary string" msgstr "recv()在边界字符串åŽå¤±è´¥" #: src/netcam_http.c msgid "leaving netcam connected." msgstr "ä¿æŒç½‘ç»œæ‘„åƒæœºè¿žæŽ¥ã€‚" #: src/netcam_http.c #, c-format msgid "about to try to connect, time #%d" msgstr "å³å°†å°è¯•连接,时间# %d" #: src/netcam_http.c msgid "Failed to open camera - check your config and that netcamera is online" msgstr "无法打开相机-检查您的é…置并且netcamera在线" #: src/netcam_http.c msgid "Error reading first header - re-trying" msgstr "读å–第一个标头时出错-é‡è¯•" #: src/netcam_http.c msgid "Failed to read first camera header - giving up for now" msgstr "无法读å–第一个相机标头-暂时放弃" #: src/netcam_http.c #, c-format msgid "Netcam has flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s." msgstr "Netcam具有标志:HTTP / 1.0: %s HTTP / 1.1: %sä¿æŒæ´»åЍ %s。" #: src/netcam_http.c msgid "" "Removed netcam_keepalive flag due to proxy set.Proxy is incompatible with " "Keep-Alive." msgstr "由于代ç†è®¾ç½®è€Œåˆ é™¤äº†netcam keepalive标志。代ç†ä¸Žæ´»ç€ã€‚" #: src/netcam_http.c msgid "Failed to read first stream header - giving up for now" msgstr "无法读å–第一个æµå¤´-暂时放弃" #: src/netcam_http.c msgid "connected, going on to read image." msgstr "连接,继续读å–图åƒã€‚" #: src/netcam_http.c msgid "Read error, trying to reconnect.." msgstr "读å–错误,å°è¯•釿–°è¿žæŽ¥ã€‚" #: src/netcam_http.c msgid "lost the cam." msgstr "丢了凸轮。" #: src/netcam_http.c #, c-format msgid "Refilled buffer with [%d] bytes from the network." msgstr "æ¥è‡ªç½‘络的[ %d]ä¸ªå­—èŠ‚é‡æ–°å¡«å……了缓冲区。" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] header bytes." msgstr "读å–[ %d / %d]标头字节。" #: src/netcam_http.c msgid "Invalid header received, reconnecting" msgstr "æ”¶åˆ°æ— æ•ˆçš„æ ‡é¢˜ï¼Œæ­£åœ¨é‡æ–°è¿žæŽ¥" #: src/netcam_http.c #, c-format msgid "Read [%d/%d] chunk bytes, [%d/%d] total" msgstr "读å–[ %d / %d]个å—字节,总计[ %d / %d]个" #: src/netcam_http.c #, c-format msgid "Chunk complete, buffer used [%d] bytes." msgstr "å—已完æˆï¼Œç¼“冲区使用了[ %d]个字节。" #: src/netcam_http.c #, c-format msgid "Image complete, buffer used [%d] bytes." msgstr "图片已完æˆï¼Œç¼“冲区使用了[ %d]个字节。" #: src/netcam_http.c msgid "connected, going on to read and decode MJPG chunks." msgstr "连接,然åŽç»§ç»­è¯»å–和解ç MJPGå—。" #: src/netcam_http.c msgid "Begin" msgstr "开始" #: src/netcam_http.c #, c-format msgid "stat(%s) error" msgstr "stat( %s)错误" #: src/netcam_http.c #, c-format msgid "statbuf.st_mtime[%d] != last_st_mtime[%d]" msgstr "statbuf.st mtime [ %d]ï¼=最åŽä¸€ä¸ªst mtime [ %d]" #: src/netcam_http.c msgid "waiting new file image timeout" msgstr "等待新文件图åƒè¶…æ—¶" #: src/netcam_http.c msgid "delay waiting new file image " msgstr "延迟等待新文件图åƒ" #: src/netcam_http.c #, c-format msgid "processing new file image - st_mtime %d" msgstr "å¤„ç†æ–°æ–‡ä»¶å›¾åƒ-st mtime %d" #: src/netcam_http.c #, c-format msgid "open(%s) error: %d" msgstr "打开( %s)错误: %d" #: src/netcam_http.c #, c-format msgid "read(%s) error: %d" msgstr "读å–( %s)错误: %d" #: src/netcam_http.c msgid "End" msgstr "结æŸ" #: src/netcam_http.c #, c-format msgid "netcam->file->path %s" msgstr "网络摄åƒå¤´->文件->路径 %s" #: src/netcam_jpeg.c msgid "Not enough data from netcam." msgstr "æ¥è‡ªç½‘络摄åƒå¤´çš„æ•°æ®ä¸è¶³ã€‚" #: src/netcam_jpeg.c #, c-format msgid "netcam->jpeg_error %d" msgstr "网络摄åƒå¤´-> JPEG错误 %d" #: src/netcam_jpeg.c msgid "***new pic delay successful***" msgstr "***新图片延迟æˆåŠŸ***" #: src/netcam_jpeg.c #, c-format msgid "jpeg_error %d" msgstr "jpeg错误 %d" #: src/netcam_jpeg.c #, c-format msgid "processing jpeg image - content length %d" msgstr "处ç†jpeg图åƒ-内容长度 %d" #: src/netcam_jpeg.c #, c-format msgid "" "Camera width/height mismatch with JPEG image - expected %dx%d, JPEG %dx%d " "retval %d" msgstr "相机宽度/高度与JPEG图åƒä¸åŒ¹é…-预期 %dx %d,JPEG %dx %dretval %d" #: src/netcam_jpeg.c #, c-format msgid "ret %d retval %d" msgstr "ret %d retval %d" #: src/netcam_rtsp.c #, c-format msgid "%s: Resized packet array to %d" msgstr " %s:将数æ®åŒ…数组的大å°è°ƒæ•´ä¸º %d" #: src/netcam_rtsp.c #, c-format msgid "%s: av_copy_packet: %s ,Interrupt: %s" msgstr " %s:影音å¤åˆ¶æ•°æ®åŒ…: %s,中断: %s" #: src/netcam_rtsp.c msgid "True" msgstr "真正" #: src/netcam_rtsp.c msgid "False" msgstr "å‡" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring packet with invalid data" msgstr "%s: å¿½ç•¥åŒ…å«æ— æ•ˆæ•°æ®çš„æ•°æ®åŒ…" #: src/netcam_rtsp.c #, c-format msgid "%s: Rec frame error: %s" msgstr "%s: 记录帧错误: %s" #: src/netcam_rtsp.c msgid "Ignoring packet with invalid data" msgstr "忽略无效数æ®åŒ…" #: src/netcam_rtsp.c #, c-format msgid "Error decoding packet: %s" msgstr "è§£ç æ•°æ®åŒ…时出错: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Error transferring HW decoded to system memory" msgstr "%s: 将解ç çš„硬件传输到系统内存时出错" #: src/netcam_rtsp.c #, c-format msgid "Error sending packet to codec: %s" msgstr "将数æ®åŒ…å‘é€åˆ°ç¼–è§£ç å™¨æ—¶å‡ºé”™ï¼š %s" #: src/netcam_rtsp.c msgid "Error decoding video packet: Copying to buffer" msgstr "è§£ç è§†é¢‘æ•°æ®åŒ…时出错:å¤åˆ¶åˆ°ç¼“冲区" #: src/netcam_rtsp.c #, c-format msgid "%s: HW Devices: " msgstr "%s: 硬件设备:" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (available)" msgstr "%s: %s(å¯ç”¨ï¼‰" #: src/netcam_rtsp.c #, c-format msgid "%s: %s (not implemented)" msgstr "%s: %s(未实现)" #: src/netcam_rtsp.c #, c-format msgid "%s: netcam_decoder %s disabled." msgstr "%s:网络摄åƒå¤´è§£ç å™¨ %s å·²ç¦ç”¨ã€‚" #: src/netcam_rtsp.c msgid "Failed to get vaapi pix format" msgstr "èŽ·å– vaapi pix æ ¼å¼å¤±è´¥" #: src/netcam_rtsp.c msgid "Failed to get cuda pix format" msgstr "èŽ·å– cuda pix æ ¼å¼å¤±è´¥" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted." msgstr "%s:打断了。" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: %s" msgstr "%s: %s: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: %s: Failed" msgstr "%s: %s: 失败" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder %s did not work." msgstr "%s:解ç å™¨ %s ä¸å·¥ä½œã€‚" #: src/netcam_rtsp.c #, c-format msgid "%s: Ignoring and removing the user requested decoder %s" msgstr "%s:忽略并删除用户请求的解ç å™¨ %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing vaapi decoder" msgstr "%s:åˆå§‹åŒ– vaapi è§£ç å™¨" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find vaapi hw device" msgstr "%s: 无法找到 vaapi 硬件设备" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing cuda decoder" msgstr "%s:åˆå§‹åŒ– cuda è§£ç å™¨" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find cuda hw device" msgstr "%s: 无法找到 cuda 硬件设备" #: src/netcam_rtsp.c #, c-format msgid "%s: Initializing decoder" msgstr "%s:åˆå§‹åŒ–è§£ç å™¨" #: src/netcam_rtsp.c #, c-format msgid "%s: Using decoder %s" msgstr " %s:使用解ç å™¨ %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoder opened" msgstr "%s: è§£ç å™¨æ‰“å¼€" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera reading (%s) timed out" msgstr " %s:相机读å–( %s)超时" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) timed out" msgstr " %s:相机( %s)超时" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_in." msgstr "无法分é…swsframe。" #: src/netcam_rtsp.c msgid "Unable to allocate swsframe_out." msgstr "无法将swsframe分é…出去。" #: src/netcam_rtsp.c msgid "Unable to allocate scaling context." msgstr "无法分é…缩放上下文。" #: src/netcam_rtsp.c msgid "Error determining size of frame out" msgstr "确定外框尺寸时出错" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture in: %s" msgstr "在 %s中分é…图片时出错" #: src/netcam_rtsp.c #, c-format msgid "Error allocating picture out: %s" msgstr "分é…图片时出错: %s" #: src/netcam_rtsp.c #, c-format msgid "Error resizing/reformatting: %s" msgstr "调整大å°/æ ¼å¼é”™è¯¯ï¼š %s" #: src/netcam_rtsp.c #, c-format msgid "Error putting frame into output buffer: %s" msgstr "将帧放入输出缓冲区时出错: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Interrupted" msgstr "%s:打断了" #: src/netcam_rtsp.c #, c-format msgid "%s: av_read_frame: %s" msgstr "%s: av 读帧: %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Excessive tries to get data from camera %d" msgstr "%s: 过度å°è¯•从相机 %d èŽ·å–æ•°æ®" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using %d" msgstr "%s:未在 netcam 傿•°ä¸­æŒ‡å®šæ•获率。使用 %d" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate not specified in netcam_params. Using framerate %d" msgstr "%s:未在 netcam 傿•°ä¸­æŒ‡å®šæ•获率。使用帧率 %d" #: src/netcam_rtsp.c msgid "The network camera is sending pictures in a different" msgstr "ç½‘ç»œæ‘„åƒæœºæ­£åœ¨ä»¥å…¶ä»–æ–¹å¼å‘é€å›¾ç‰‡" #: src/netcam_rtsp.c msgid "size than specified in the config and also a " msgstr "比é…置中指定的大å°å¤§" #: src/netcam_rtsp.c msgid "different picture format. The picture is being" msgstr "ä¸åŒçš„图片格å¼ã€‚图片正在" #: src/netcam_rtsp.c msgid "transcoded to YUV420P and into the size requested" msgstr "转ç ä¸ºYUV420P并转æ¢ä¸ºæ‰€éœ€çš„大å°" #: src/netcam_rtsp.c msgid "in the config file. If possible change netcam to" msgstr "在é…置文件中。如果å¯èƒ½ï¼Œå°†netcam更改为" #: src/netcam_rtsp.c msgid "be in YUV420P format and the size requested in the" msgstr "采用YUV420Pæ ¼å¼ï¼Œå¹¶ä¸”在" #: src/netcam_rtsp.c msgid "config to possibly lower CPU usage." msgstr "é…置以é™ä½ŽCPU使用率。" #: src/netcam_rtsp.c msgid "size than specified in the configuration file." msgstr "大å°è¶…过é…置文件中指定的大å°ã€‚" #: src/netcam_rtsp.c msgid "The picture is being transcoded into the size " msgstr "图片正在被转ç ä¸ºå°ºå¯¸" #: src/netcam_rtsp.c msgid "requested in the configuration. If possible change" msgstr "在é…置中请求。如果å¯èƒ½çš„è¯" #: src/netcam_rtsp.c msgid "netcam or configuration to indicate the same size" msgstr "ç½‘ç»œæ‘„åƒæœºæˆ–é…置以指示相åŒçš„大å°" #: src/netcam_rtsp.c msgid "to possibly lower CPU usage." msgstr "å¯èƒ½ä¼šé™ä½ŽCPU使用率。" #: src/netcam_rtsp.c #, c-format msgid "Netcam: %d x %d => Config: %d x %d" msgstr "网络摄åƒå¤´ï¼š %dx %d =>é…置: %dx %d" #: src/netcam_rtsp.c msgid "The image sent is being " msgstr "å‘é€çš„å›¾åƒæ­£åœ¨" #: src/netcam_rtsp.c msgid "trancoded to YUV420P. If possible change netcam " msgstr "转ç ä¸ºYUV420P。如果å¯èƒ½ï¼Œè¯·æ›´æ”¹ç½‘络摄åƒå¤´" #: src/netcam_rtsp.c msgid "picture format to YUV420P to possibly lower CPU usage." msgstr "图片格å¼è½¬æ¢ä¸ºYUV420På¯èƒ½ä¼šé™ä½ŽCPU使用率。" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting rtsp/rtmp" msgstr "%s: 设置 rtsp/rtmp" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format mjpeg" msgstr "%s: è®¾ç½®è¾“å…¥æ ¼å¼ mjpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting input_format video4linux2" msgstr "%s: è®¾ç½®è¾“å…¥æ ¼å¼ video4linux2" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up movie file" msgstr "%s: 设置电影文件" #: src/netcam_rtsp.c #, c-format msgid "%s: Setting up %s" msgstr "%s:设置 %s" #: src/netcam_rtsp.c #, c-format msgid "%s: option: %s = %s" msgstr "%s: 选项: %s = %s" #: src/netcam_rtsp.c msgid "Setting up v4l2 via netcam" msgstr "通过网络摄åƒå¤´è®¾ç½® v4l2" #: src/netcam_rtsp.c msgid "Setting up file via netcam" msgstr "通过网络摄åƒå¤´è®¾ç½®æ–‡ä»¶" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s via netcam" msgstr "通过网络摄åƒå¤´è®¾ç½® %s" #: src/netcam_rtsp.c msgid "highres" msgstr "高分辨率" #: src/netcam_rtsp.c msgid "norm" msgstr "规范" #: src/netcam_rtsp.c #, c-format msgid "Setting up %s stream." msgstr "设置 %sæµã€‚" #: src/netcam_rtsp.c msgid "Unknown" msgstr "未知" #: src/netcam_rtsp.c msgid "Stream copied for pass-through" msgstr "å¤åˆ¶æµä»¥ä¼ é€’" #: src/netcam_rtsp.c msgid "Null path passed to connect" msgstr "空路径传递给连接" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open camera(%s): %s" msgstr " %s:无法打开相机( %s): %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Opened camera(%s)" msgstr " %s:打开的相机( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to find stream info: %s" msgstr " %s:找ä¸åˆ°æµä¿¡æ¯ï¼š %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to open codec context: %s" msgstr " %s:无法打开编解ç å™¨ä¸Šä¸‹æ–‡ï¼š %s" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera image size is invalid" msgstr " %s:相机图åƒå°ºå¯¸æ— æ•ˆ" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to allocate frame." msgstr " %s:无法分é…帧。" #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to copy stream for pass-through." msgstr " %s:无法å¤åˆ¶æµä»¥è¿›è¡Œä¼ é€’。" #: src/netcam_rtsp.c #, c-format msgid "%s: Failed to read first image" msgstr " %s:无法读å–第一张图åƒ" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera (%s) connected" msgstr " %s:已连接相机( %s)" #: src/netcam_rtsp.c #, c-format msgid "%s: Netcam capture_rate is %d." msgstr "%s:Netcam æ•获率为 %d。" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera source is %d FPS" msgstr "%sï¼šæ‘„åƒæœºæºä¸º %d FPS" #: src/netcam_rtsp.c #, c-format msgid "%s: Unable to determine the camera source FPS." msgstr "%sï¼šæ— æ³•ç¡®å®šæ‘„åƒæœºæº FPS。" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate is less than camera FPS." msgstr "%s:æ•获率低于相机 FPS。" #: src/netcam_rtsp.c #, c-format msgid "%s: Decoding errors will occur." msgstr "%s:会å‘生解ç é”™è¯¯ã€‚" #: src/netcam_rtsp.c #, c-format msgid "%s: capture_rate slightly larger than camera FPS is recommended." msgstr "%s:建议使用略大于相机 FPS çš„æ•获率。" #: src/netcam_rtsp.c #, c-format msgid "%s: Reconnecting with camera...." msgstr " %sï¼šé‡æ–°è¿žæŽ¥ç›¸æœºã€‚" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera did not reconnect." msgstr " %sï¼šç›¸æœºæœªé‡æ–°è¿žæŽ¥ã€‚" #: src/netcam_rtsp.c #, c-format msgid "%s: Checking for camera every 10 seconds." msgstr " %s:æ¯10秒检查一次相机。" #: src/netcam_rtsp.c #, c-format msgid "%s: Camera handler thread [%d] started" msgstr " %s:相机处ç†ç¨‹åºçº¿ç¨‹[ %d]å·²å¯åЍ" #: src/netcam_rtsp.c #, c-format msgid "%s: Handler loop finished." msgstr " %s:处ç†ç¨‹åºå¾ªçŽ¯å®Œæˆã€‚" #: src/netcam_rtsp.c #, c-format msgid "%s: Error starting handler thread" msgstr " %s:å¯åЍ处ç†ç¨‹åºçº¿ç¨‹æ—¶å‡ºé”™" #: src/netcam_rtsp.c #, c-format msgid "%s: Waiting for first image from the handler." msgstr " %s:等待处ç†ç¨‹åºä¸­çš„第一张图åƒã€‚" #: src/netcam_rtsp.c msgid "unable to create rtsp context" msgstr "无法创建rtsp上下文" #: src/netcam_rtsp.c msgid "unable to create rtsp high context" msgstr "无法创建rtsp高上下文" #: src/netcam_rtsp.c msgid "No FFmpeg support" msgstr "䏿”¯æŒ FFmpeg" #: src/netcam_rtsp.c #, c-format msgid "%s: Shutting down network camera." msgstr " %sï¼šå…³é—­ç½‘ç»œæ‘„åƒæœºã€‚" #: src/netcam_rtsp.c #, c-format msgid "%s: No response from handler thread." msgstr " %s:处ç†ç¨‹åºçº¿ç¨‹æ— å“应。" #: src/netcam_rtsp.c msgid "Normal resolution: Shut down complete." msgstr "正常分辨率:关闭完æˆã€‚" #: src/netcam_rtsp.c msgid "High resolution: Shut down complete." msgstr "高分辨率:完全关闭。" #: src/picture.c msgid "Unable to set set EXIF to webp chunk" msgstr "无法将设置EXIF设置为WebPå—" #: src/picture.c msgid "libwebp version error" msgstr "libwebp版本错误" #: src/picture.c msgid "libwebp image buffer allocation error" msgstr "libwebp图åƒç¼“冲区分é…错误" #: src/picture.c msgid "libwebp image compression error" msgstr "libwebp图åƒåŽ‹ç¼©é”™è¯¯" #: src/picture.c msgid "unable to assemble webp image" msgstr "无法组装webp图åƒ" #: src/picture.c msgid "unable to save webp image to file" msgstr "无法将WebP图åƒä¿å­˜åˆ°æ–‡ä»¶" #: src/picture.c #, c-format msgid "" "Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error" msgstr "" "无法将图片写入文件 %s-检查对目标目录的访问æƒé™\n" "由于出现此致命错误,线程å³å°†ç»“æŸ" #: src/picture.c #, c-format msgid "Can't write picture to file %s" msgstr "无法将图片写入文件 %s" #: src/picture.c msgid "Error getting PGM vars." msgstr "èŽ·å– PGM å˜é‡æ—¶å‡ºé”™ã€‚" #: src/picture.c #, c-format msgid "This is not a pgm file, starts with '%s'" msgstr "è¿™ä¸æ˜¯ä¸€ä¸ªpgm文件,以' %s'开头" #: src/picture.c #, c-format msgid "Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)" msgstr "魔法 %s: 宽度 %s(%d): 高度 %s(%d): MaxVal: %s(%d)" #: src/picture.c msgid "Failed reading image data from pgm file" msgstr "无法从pgm文件读å–å›¾åƒæ•°æ®" #: src/picture.c msgid "The mask file specified is not the same size as image from camera." msgstr "指定的é®ç½©æ–‡ä»¶ä¸Žæ¥è‡ªç›¸æœºçš„图åƒå¤§å°ä¸åŒã€‚" #: src/picture.c #, c-format msgid "Attempting to resize mask image from %dx%d to %dx%d" msgstr "å°è¯•å°†é®ç½©å›¾åƒçš„大å°ä»Ž %dx %d调整为 %dx %d" #: src/picture.c #, c-format msgid "can't write mask file %s - check access rights to target directory" msgstr "æ— æ³•å†™å…¥æŽ©ç æ–‡ä»¶ %s-检查对目标目录的访问æƒé™" #: src/picture.c #, c-format msgid "can't write mask file %s" msgstr "无法写入é®ç½©æ–‡ä»¶ %s" #: src/picture.c msgid "Failed writing default mask as pgm file" msgstr "无法将默认掩ç å†™å…¥pgm文件" #: src/picture.c #, c-format msgid "" "Creating empty mask %s\n" "Please edit this file and re-run motion to enable mask feature" msgstr "" "创建空é®ç½© %s \n" "请编辑此文件,然åŽé‡æ–°è¿è¡ŒåŠ¨ç”»ä»¥å¯ç”¨è’™ç‰ˆåŠŸèƒ½" #: src/rotate.c #, c-format msgid "Config option \"rotate\" not a multiple of 90: %d" msgstr "é…置选项\"旋转\"䏿˜¯90çš„å€æ•°ï¼š %d" #: src/track.c msgid "internal error" msgstr "内部错误" #: src/track.c #, c-format msgid "internal error, %hu is not a known track-type" msgstr "内部错误, %hu䏿˜¯å·²çŸ¥çš„跟踪类型" #: src/track.c #, c-format msgid "port %s dev fd %i, motor %hu command %hu data %hu" msgstr "ç«¯å£ %s dev fd %i,电机 %hu命令 %huæ•°æ® %hu" #: src/track.c msgid "Status byte timeout!" msgstr "状æ€å­—节超时ï¼" #: src/track.c #, c-format msgid "Try to open serial device %s" msgstr "å°è¯•打开串行设备 %s" #: src/track.c #, c-format msgid "Unable to open serial device %s" msgstr "无法打开串行设备 %s" #: src/track.c #, c-format msgid "Unable to initialize serial device %s" msgstr "无法åˆå§‹åŒ–串行设备 %s" #: src/track.c #, c-format msgid "Opened serial device %s and initialize, fd %i" msgstr "打开串行设备 %så¹¶åˆå§‹åŒ–fd %i" #: src/track.c #, c-format msgid "No device %s started yet , trying stepper_center()" msgstr "尚未å¯åŠ¨è®¾å¤‡ %s,请å°è¯•使用stepper center()" #: src/track.c #, c-format msgid "failed to initialize stepper device on %s , fd [%i]." msgstr "无法在 %s,fd [ %i]上åˆå§‹åŒ–步进设备。" #: src/track.c #, c-format msgid "succeed , device started %s , fd [%i]" msgstr "æˆåŠŸï¼Œè®¾å¤‡å·²å¯åЍ %s,fd [ %i]" #: src/track.c #, c-format msgid "SENDS port %s dev fd %i, motor %hu command %hu data %hu" msgstr "å‘é€ç«¯å£ %s dev fd %i,电机 %hu命令 %huæ•°æ® %hu" #: src/track.c #, c-format msgid "Command return %d" msgstr "命令返回 %d" #: src/track.c msgid "Problem opening servo!" msgstr "打开伺æœå™¨æ—¶å‡ºçŽ°é—®é¢˜ï¼" #: src/track.c #, c-format msgid "cent->x %d, cent->y %d, reversex %d, reversey %d manual %d" msgstr "cent-> x %d,cent-> y %d,reversex %d,reversey %d手动 %d" #: src/track.c #, c-format msgid "x %d value out of range! (%d - %d)" msgstr "x %d值超出范围ï¼ï¼ˆ %d- %d)" #: src/track.c #, c-format msgid "y %d value out of range! (%d - %d)" msgstr "y %d值超出范围ï¼ï¼ˆ %d- %d)" #: src/track.c #, c-format msgid "X offset %d" msgstr "Xåç§» %d" #: src/track.c #, c-format msgid "" "X cent->x %d, cent->y %d, reversex %d,reversey %d motorx %d data %d command " "%d" msgstr "" "X cent-> x %d,cent-> y %d,reversex %d,reversey %d motorx %d data %d命令 %d" #: src/track.c #, c-format msgid "Y offset %d" msgstr "Yåç§» %d" #: src/track.c #, c-format msgid "" "Y cent->x %d, cent->y %d, reversex %d,reversey %d motory %d data %d command " "%d" msgstr "" "Y cent-> x %d,cent-> y %d,reversex %d,reversey %d电机 %dæ•°æ® %d命令 %d" #: src/track.c #, c-format msgid "" "X-offset %d, Y-offset %d, x-position %d. y-position %d,reversex %d, reversey " "%d , stepsize %d" msgstr "Xåç§» %d,Yåç§» %d,xä½ç½® %d。yä½ç½® %d,åå‘x %d,åå‘ %dï¼Œé€æ­¥è°ƒæ•´ %d" #: src/track.c msgid "Return byte timeout!" msgstr "返回字节超时ï¼" #: src/track.c msgid "Unable to set camera speed" msgstr "无法设定相机速度" #: src/track.c msgid "succeed" msgstr "æˆåŠŸ" #: src/track.c msgid "Failed to reset pwc camera to starting position! Reason" msgstr "无法将pwcæ‘„åƒæœºé‡ç½®åˆ°èµ·å§‹ä½ç½®ï¼åŽŸå› " #: src/track.c msgid "failed VIDIOCPWCMPTGRANGE" msgstr "失败的VIDIOCPWCMPTGRANGE" #: src/track.c msgid "ioctl VIDIOCPWCMPTGANGLE" msgstr "ioctl VIDIOCPWCMPTGANGLE" #: src/track.c msgid "Failed to pan/tilt pwc camera! Reason" msgstr "无法平移/倾斜pwc相机ï¼åŽŸå› " #: src/track.c msgid "Failed to reset UVC camera to starting position! Reason" msgstr "无法将UVCæ‘„åƒæœºé‡ç½®åˆ°èµ·å§‹ä½ç½®ï¼åŽŸå› " #: src/track.c msgid "Reseting UVC camera to starting position" msgstr "å°†UVC相机é‡ç½®åˆ°èµ·å§‹ä½ç½®" #: src/track.c msgid "ioctl querycontrol" msgstr "ioctl查询控件" #: src/track.c msgid "Getting camera range" msgstr "获å–相机范围" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d " msgstr "è¾“å…¥å‚æ•°ABSå¹³ç§»æœ€å° %d,平移最大 %dï¼Œå€¾æ–œæœ€å° %d,倾斜最大 %d" #: src/track.c #, c-format msgid "INPUT_PARAM_ABS X_Angel %d, Y_Angel %d " msgstr "è¾“å…¥å‚æ•°ABS X天使 %d,Y天使 %d" #: src/track.c #, c-format msgid "For_SET_ABS move_X %d,move_Y %d" msgstr "对于SET ABS,移动X %d,移动Y %d" #: src/track.c msgid "Failed to move UVC camera!" msgstr "无法移动UVC相机ï¼" #: src/track.c #, c-format msgid "Found MINMAX = %d" msgstr "找到的MINMAX = %d" #: src/track.c #, c-format msgid "Before_ABS_Y_Angel : x= %d , Y= %d, " msgstr "在ABS Y天使之å‰ï¼šx = %d,Y = %d," #: src/track.c #, c-format msgid "After_ABS_Y_Angel : x= %d , Y= %d" msgstr "在ABS Y天使之åŽï¼šx = %d,Y = %d" #: src/track.c #, c-format msgid "For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d" msgstr "对于SET RELå¹³ç§»æœ€å° %d,平移最大 %dï¼Œå€¾æ–œæœ€å° %d,倾斜最大 %d" #: src/track.c #, c-format msgid "For_SET_REL track_pan_Angel %d, track_tilt_Angel %d" msgstr "对于SET REL跟踪平移天使 %d,跟踪倾斜天使 %d" #: src/track.c #, c-format msgid "For_SET_REL move_X %d,move_Y %d" msgstr "对于SET REL,移动X %d,移动Y %d" #: src/track.c #, c-format msgid " dev %d, addr= %d, control_S= %d, Wert= %d" msgstr "dev %d,addr = %d,控件S = %d,Wert = %d" #: src/track.c #, c-format msgid " dev %d,addr= %d, control_S= %d, Wert= %d" msgstr "dev %d,addr = %d,控件S = %d,Wert = %d" #: src/track.c #, c-format msgid "Before_REL_Y_Angel : x= %d , Y= %d" msgstr "在REL Y天使之å‰ï¼šx = %d,Y = %d" #: src/track.c #, c-format msgid "After_REL_Y_Angel : x= %d , Y= %d" msgstr "在REL Y天使之åŽï¼šx = %d,Y = %d" #: src/translate.c msgid "Language: English" msgstr "英语语言" #: src/util.c #, c-format msgid "Could not allocate %llu bytes of memory!" msgstr "æ— æ³•åˆ†é… %llu个字节的内存ï¼" #: src/util.c #, c-format msgid "Warning! Function %s tries to resize memoryblock at %p to 0 bytes!" msgstr "警告ï¼åŠŸèƒ½ %så°è¯•å°† %p处的内存å—调整为0个字节ï¼" #: src/util.c #, c-format msgid "Could not resize memory-block at offset %p to %llu bytes (function %s)!" msgstr "无法将åç§»é‡ %p处的内存å—的大å°è°ƒæ•´ä¸º %llu个字节(函数 %s)ï¼" #: src/util.c #, c-format msgid "Problem creating directory %s" msgstr "创建目录 %s时出现问题" #: src/util.c #, c-format msgid "creating directory %s" msgstr "创建目录 %s" #: src/util.c #, c-format msgid "Error opening file %s with mode %s" msgstr "ä½¿ç”¨æ¨¡å¼ %s打开文件 %s时出错" #: src/util.c msgid "Error closing file" msgstr "关闭文件时出错" #: src/util.c msgid "{dbeventid} is not supported. Use eventid." msgstr "䏿”¯æŒ {dbeventid}。使用事件标识。" #: src/util.c #, c-format msgid "invalid format specifier keyword %*.*s" msgstr "æ ¼å¼è¯´æ˜Žç¬¦å…³é”®å­— %*.*s 无效" #: src/util.c #, c-format msgid "Unable to set thread name %s" msgstr "无法设置线程åç§° %s" #: src/util.c msgid "FFMPEG version too old. Disabling pass-through processing." msgstr "FFMPEG版本太旧。ç¦ç”¨ä¼ é€’处ç†ã€‚" #: src/util.c msgid "pass-through enabled." msgstr "å·²å¯ç”¨ç›´é€šã€‚" #: src/util.c #, c-format msgid "Error setting parm >%s<" msgstr "è®¾ç½®å‚æ•°æ—¶å‡ºé”™ >%s<" #: src/util.c #, c-format msgid "Parsed: >%s< >%s<" msgstr "è§£æžï¼š>%s< >%s<" #: src/util.c msgid "Parsed: >redacted< >redacted<" msgstr "è§£æžï¼š>已编辑< >已编辑<" #: src/util.c #, c-format msgid "Error parsing parm_nm controls: %s" msgstr "è§£æžå‚æ•° nm 控件时出错:%s" #: src/util.c #, c-format msgid "Error parsing parm_vl controls: %s" msgstr "è§£æž parm vl 控件时出错:%s" #: src/util.c #, c-format msgid "Error setting temp: %s" msgstr "设置温度时出错:%s" #: src/util.c #, c-format msgid "Error reparsing controls: %s" msgstr "釿–°è§£æžæŽ§ä»¶æ—¶å‡ºé”™ï¼š%s" #: src/util.c #, c-format msgid "Parsing: %s" msgstr "è§£æžï¼š%s" #: src/util.c msgid "Parsing: " msgstr "è§£æžï¼š<已编辑>" #: src/util.c #, c-format msgid "Error parsing controls: %s" msgstr "è§£æžæŽ§ä»¶æ—¶å‡ºé”™ï¼š%s" #: src/util.c #, c-format msgid "Error: %s" msgstr "错误:%s" #: src/util.c #, c-format msgid "New netcam_params: %s" msgstr "新的网络摄åƒå¤´å‚数:%s" #: src/util.c #, c-format msgid "New netcam_high_params: %s" msgstr "新的网络摄åƒå¤´é«˜å‚数:%s" #: src/util.c #, c-format msgid "New video_params: %s" msgstr "æ–°çš„è§†é¢‘å‚æ•°ï¼š%s" #: src/util.c #, c-format msgid "New webcontrol_header_params: %s" msgstr "æ–°çš„ webcontrol æ ‡å¤´å‚æ•°ï¼š%s" #: src/util.c msgid "New webcontrol_header_params: " msgstr "æ–°çš„ webcontrol æ ‡å¤´å‚æ•°ï¼š" #: src/util.c #, c-format msgid "New stream_header_params: %s" msgstr "æ–°çš„æµæ ‡å¤´å‚数:%s" #: src/util.c msgid "New stream_header_params: " msgstr "æ–°çš„æµæ ‡å¤´å‚数:" #: src/util.c #, c-format msgid "Programming error. Unknown configuration item: %s" msgstr "编程错误。未知é…置项:%s " #: src/video_bktr.c #, c-format msgid "METEORSHUE Error setting hue [%d]" msgstr "METEORSHUE错误设置色相[ %d]" #: src/video_bktr.c #, c-format msgid "to [%d]" msgstr "到[ %d]" #: src/video_bktr.c msgid "METEORGHUE Error getting hue" msgstr "METEORGHUE获å–色相时出错" #: src/video_bktr.c #, c-format msgid "METEORSCSAT Error setting saturation [%d]" msgstr "METEORSCSAT错误设置饱和度[ %d]" #: src/video_bktr.c msgid "METEORGCSAT Error getting saturation" msgstr "METEORGCSAT饱和时出错" #: src/video_bktr.c #, c-format msgid "METEORSCONT Error setting contrast [%d]" msgstr "METEORSCONT设置对比度[ %d]时出错" #: src/video_bktr.c msgid "METEORGCONT Error getting contrast" msgstr "METEORGCONT获å–对比时出错" #: src/video_bktr.c #, c-format msgid "METEORSBRIG brightness [%d]" msgstr "METEORSBRIG亮度[ %d]" #: src/video_bktr.c msgid "METEORGBRIG getting brightness" msgstr "METEORGBRIG获得亮度" #: src/video_bktr.c msgid "Not implemented" msgstr "未实现" #: src/video_bktr.c #, c-format msgid "Device Input %d out of range (0-4)" msgstr "设备输入 %d超出范围(0-4)" #: src/video_bktr.c #, c-format msgid "METEORSINPUT %d invalid -Trying composite %d" msgstr "METEORSINPUT %d无效-å°è¯•åˆæˆ %d" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format, try again with default" msgstr "BT848SFMT,无法设置输入格å¼ï¼Œè¯·ä½¿ç”¨é»˜è®¤å€¼é‡è¯•" #: src/video_bktr.c msgid "BT848SFMT, Couldn't set the input format either default" msgstr "BT848SFMT,无法将输入格å¼è®¾ç½®ä¸ºé»˜è®¤å€¼" #: src/video_bktr.c msgid "Couldn't set the geometry" msgstr "无法设置几何" #: src/video_bktr.c #, c-format msgid "to [%d/%d] Norm %d" msgstr "到[ %d / %d]规范 %d" #: src/video_bktr.c #, c-format msgid "Not valid Frequency [%ld] for Source input [%i]" msgstr "无效频率 [%ld] 对于æºè¾“å…¥ [%i] " #: src/video_bktr.c #, c-format msgid "Frequency [%ld] Source input [%i]" msgstr "频率 [%ld] æºè¾“å…¥ [%i]" #: src/video_bktr.c #, c-format msgid "set input [%d]" msgstr "设置输入[ %d]" #: src/video_bktr.c #, c-format msgid "set input format [%d]" msgstr "设置输入格å¼[ %d]" #: src/video_bktr.c #, c-format msgid "set geometry [%d]x[%d]" msgstr "设置几何[ %d] x [ %d]" #: src/video_bktr.c msgid "Frequency set (no implemented yet" msgstr "频率设定(尚未实施" #: src/video_bktr.c msgid "Sizing buffer to 3x" msgstr "大å°è°ƒæ•´ç¼“冲区为3å€" #: src/video_bktr.c msgid "Sizing buffer to 3/2x" msgstr "大å°è°ƒæ•´ä¸º3 / 2x" #: src/video_bktr.c msgid "mmap failed" msgstr "mmap失败" #: src/video_bktr.c msgid "METEORCAPTUR using single method Error capturing" msgstr "使用å•一方法的METEORCAPTUR错误æ•获" #: src/video_bktr.c msgid "Error capturing using single method" msgstr "使用å•一方法æ•获错误" #: src/video_bktr.c src/video_v4l2.c msgid "Unable to find video device" msgstr "找ä¸åˆ°è§†é¢‘设备" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Closing video device %s" msgstr "正在关闭视频设备 %s" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "Still %d users of video device %s, so we don't close it now" msgstr "仿˜¯ %d个视频设备 %s的用户,因此我们现在ä¸å…³é—­å®ƒ" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image width (%d) is not modulo 8" msgstr "é…置图åƒå®½åº¦ï¼ˆ %dï¼‰ä¸æ˜¯æ¨¡8" #: src/video_bktr.c src/video_v4l2.c #, c-format msgid "config image height (%d) is not modulo 8" msgstr "é…置图åƒé«˜åº¦ï¼ˆ %dï¼‰ä¸æ˜¯æ¨¡8" #: src/video_bktr.c msgid "Stopping capture" msgstr "åœæ­¢æ•获" #: src/video_bktr.c #, c-format msgid "Reusing [%s] inputs [%d,%d] Change capture method METEOR_CAP_SINGLE" msgstr "é‡å¤ä½¿ç”¨[ %s]输入[ %d, %d]更改æ•èŽ·æ–¹æ³•æµæ˜Ÿå¸½å•个" #: src/video_bktr.c msgid "VIDEO_PALETTE_YUV420P setting imgs.size_norm and imgs.motionsize" msgstr "VIDEO PALETTE YUV420P设置imgs.size规范和imgs.motionsize" #: src/video_bktr.c #, c-format msgid "open video device %s" msgstr "打开视频设备 %s" #: src/video_bktr.c #, c-format msgid "open tuner device %s" msgstr "打开调è°å™¨è®¾å¤‡ %s" #: src/video_common.c msgid "Corrupt image ... continue" msgstr "图片æŸå...ç»§ç»­" #: src/video_common.c #, c-format msgid "SOI position adjusted by %d bytes." msgstr "SOIä½ç½®ç”± %d个字节调整。" #: src/video_common.c msgid "calling mmalcam_cleanup" msgstr "调用mmalcam清ç†" #: src/video_common.c msgid "calling netcam_cleanup" msgstr "调用网络摄åƒå¤´æ¸…ç†" #: src/video_common.c msgid "calling netcam_rtsp_cleanup" msgstr "调用netcam rtsp清ç†" #: src/video_common.c msgid "Cleaning up V4L2 device" msgstr "清ç†V4L2设备" #: src/video_common.c msgid "Cleaning up BKTR device" msgstr "清ç†BKTR设备" #: src/video_common.c msgid "No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)" msgstr "䏿¸…除相机设备(MMAL,Netcam,V4L2,BKTR)" #: src/video_common.c msgid "Opening MMAL cam" msgstr "打开MMAL凸轮" #: src/video_common.c msgid "MMAL cam failed to open" msgstr "MMAL凸轮无法打开" #: src/video_common.c msgid "Opening Netcam" msgstr "打开网络摄åƒå¤´" #: src/video_common.c msgid "Netcam failed to open" msgstr "网络摄åƒå¤´æ— æ³•打开" #: src/video_common.c msgid "Opening Netcam RTSP" msgstr "打开Netcam RTSP" #: src/video_common.c msgid "Netcam RTSP failed to open" msgstr "Netcam RTSP无法打开" #: src/video_common.c msgid "Opening V4L2 device" msgstr "打开V4L2设备" #: src/video_common.c msgid "V4L2 device failed to open" msgstr "V4L2设备无法打开" #: src/video_common.c msgid "Opening BKTR device" msgstr "打开BKTR设备" #: src/video_common.c msgid "BKTR device failed to open" msgstr "BKTR设备无法打开" #: src/video_common.c msgid "No Camera device specified (MMAL, Netcam, V4L2, BKTR)" msgstr "未指定摄åƒå¤´è®¾å¤‡ï¼ˆMMAL,Netcam,V4L2,BKTR)" #: src/video_loopback.c #, c-format msgid "Failed to open '%s'" msgstr "无法打开 '%s' " #: src/video_loopback.c #, c-format msgid "Error specifying buffer: %s" msgstr "指定缓冲区时出错: %s" #: src/video_loopback.c #, c-format msgid "Opening buffer: %s" msgstr "打开缓冲区: %s" #: src/video_loopback.c #, c-format msgid "Read buffer: %s" msgstr "读å–缓冲区: %s" #: src/video_loopback.c #, c-format msgid "found video device '%s' %d" msgstr "找到视频设备' %s' %d" #: src/video_loopback.c #, c-format msgid "Opened %s as pipe output" msgstr "已打开 %s作为管é“输出" #: src/video_loopback.c #, c-format msgid "Opening %s as pipe output failed" msgstr "由于管é“输出失败而打开 %s" #: src/video_loopback.c msgid "Original pipe specifications" msgstr "原始管é“è§„æ ¼" #: src/video_loopback.c msgid "Proposed pipe specifications" msgstr "建议的管é“è§„æ ¼" #: src/video_loopback.c msgid "Final pipe specifications" msgstr "最终管é“è§„æ ¼" #: src/video_v4l2.c msgid "No Controls found for device" msgstr "找ä¸åˆ°è®¾å¤‡çš„æŽ§ä»¶" #: src/video_v4l2.c msgid "---------Controls---------" msgstr "---------控件---------" #: src/video_v4l2.c msgid " V4L2 ID Name and Range" msgstr "V4L2 IDå称和范围" #: src/video_v4l2.c msgid "Error resetting user value" msgstr "é‡ç½®ç”¨æˆ·å€¼æ—¶å‡ºé”™" #: src/video_v4l2.c #, c-format msgid "Leaving control %s \"%s\" set to %d" msgstr "将控制 %s\"%s\" 设置为 %d" #: src/video_v4l2.c msgid "Device not ready" msgstr "设备未准备好" #: src/video_v4l2.c #, c-format msgid "Set control \"%s\" to value %d" msgstr "将控件\" %s \"设置为值 %d" #: src/video_v4l2.c #, c-format msgid "setting control %s \"%s\" to %d failed. " msgstr "将控件 %s \"%s\" 设置为 %d 失败。" #: src/video_v4l2.c #, c-format msgid "%s control option value %s is below minimum. Using minimum %d" msgstr "%s 控制选项值 %s 低于最å°å€¼ã€‚ä½¿ç”¨æœ€å° %d " #: src/video_v4l2.c #, c-format msgid "%s control option value %s is above maximum. Using maximum %d" msgstr "%s 控制选项值 %s 高于最大值。使用最大 %d " #: src/video_v4l2.c msgid "control type not supported yet" msgstr "æŽ§ä»¶ç±»åž‹å°šä¸æ”¯æŒ" #: src/video_v4l2.c #, c-format msgid "" "Unable to query input %d. VIDIOC_ENUMINPUT, if you use a WEBCAM change input " "value in conf by -1" msgstr "" "无法查询输入 %d。VIDIOC ENUMINPUT,如果您使用WEBCAM更改输入conf中的值是-1" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\", type 0x%08X, status %08x" msgstr "åç§°= \" %s \",键入0x %08X,状æ€ä¸º %08x" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\",- TUNER" msgstr "åç§°= \" %s \",-è°ƒè°å™¨" #: src/video_v4l2.c #, c-format msgid "Name = \"%s\"- CAMERA" msgstr "åç§°= \" %s \"-相机" #: src/video_v4l2.c #, c-format msgid "Error selecting input %d VIDIOC_S_INPUT" msgstr "选择输入 %d VIDIOC S INPUT时出错" #: src/video_v4l2.c msgid "Device does not support specifying PAL/NTSC norm" msgstr "è®¾å¤‡ä¸æ”¯æŒæŒ‡å®šPAL / NTSC规范" #: src/video_v4l2.c #, c-format msgid "- video standard %s" msgstr "-视频标准 %s" #: src/video_v4l2.c #, c-format msgid "Error selecting standard method %d VIDIOC_S_STD" msgstr "选择标准方法 %d VIDIOC S STD时出错" #: src/video_v4l2.c msgid "Video standard set to NTSC" msgstr "视频标准设置为NTSC" #: src/video_v4l2.c msgid "Video standard set to SECAM" msgstr "视频标准设置为SECAM" #: src/video_v4l2.c msgid "Video standard set to PAL" msgstr "影片标准设为PAL" #: src/video_v4l2.c #, c-format msgid "tuner %d VIDIOC_G_TUNER" msgstr "è°ƒè°å™¨ %d VIDIOC Gè°ƒè°å™¨" #: src/video_v4l2.c #, c-format msgid "Set tuner %d" msgstr "设置调è°å™¨ %d" #: src/video_v4l2.c #, c-format msgid "freq %ul VIDIOC_S_FREQUENCY" msgstr "频率 %ul VIDIOC S频率" #: src/video_v4l2.c #, c-format msgid "Set Frequency to %ul" msgstr "将频率设置为 %ul" #: src/video_v4l2.c #, c-format msgid "Unable to use %c%c%c%c (%dx%d)" msgstr "无法使用 %c%c%c%c (%dx%d)" #: src/video_v4l2.c #, c-format msgid "Testing palette %c%c%c%c (%dx%d)" msgstr "æµ‹è¯•è°ƒè‰²æ¿ %c %c %c %c( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Checking image size %dx%d with stride %d" msgstr "正在检查图åƒå¤§å° %dx%d,步幅为 %d" #: src/video_v4l2.c msgid "No stride value provided from device." msgstr "è®¾å¤‡ä¸æä¾›æ­¥å¹…å€¼ã€‚" #: src/video_v4l2.c #, c-format msgid "Width(%d) must be less than stride(%d)" msgstr "宽度(%d) å¿…é¡»å°äºŽæ­¥å¹…(%d)" #: src/video_v4l2.c #, c-format msgid "The image width(%d) is not multiple of the stride(%d)" msgstr "图åƒå®½åº¦ï¼ˆ%dï¼‰ä¸æ˜¯æ­¥å¹…(%dï¼‰çš„å€æ•°" #: src/video_v4l2.c #, c-format msgid "Impossible condition: Width(%d), Stride(%d), Per stride(%d)" msgstr "ä¸å¯èƒ½çš„æ¡ä»¶ï¼šå®½åº¦ï¼ˆ%d),步幅(%dï¼‰ï¼Œæ¯æ­¥å¹…(%d)" #: src/video_v4l2.c #, c-format msgid "Image width will be padded %d bytes" msgstr "图åƒå®½åº¦å°†è¢«å¡«å…… %d 个字节" #: src/video_v4l2.c #, c-format msgid "Adjusting resolution from %ix%i to %ix%i." msgstr "将分辨率从 %ix %i调整为 %ix %i。" #: src/video_v4l2.c msgid "Adjusted resolution not modulo 8." msgstr "调整åŽçš„分辨率ä¸å–模8。" #: src/video_v4l2.c msgid "Specify different palette or width/height in config file." msgstr "在é…ç½®æ–‡ä»¶ä¸­æŒ‡å®šå…¶ä»–è°ƒè‰²æ¿æˆ–宽度/高度。" #: src/video_v4l2.c msgid "Error setting pixel format." msgstr "设置åƒç´ æ ¼å¼æ—¶å‡ºé”™ã€‚" #: src/video_v4l2.c #, c-format msgid "Using palette %c%c%c%c (%dx%d)" msgstr "ä½¿ç”¨è°ƒè‰²æ¿ %c %c %c %c( %dx %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to width (%d)" msgstr "调整宽度( %d)" #: src/video_v4l2.c #, c-format msgid "Adjusting to height (%d)" msgstr "调整至高度( %d)" #: src/video_v4l2.c #, c-format msgid "Configuration palette index %d (%s) for %dx%d doesn't work." msgstr "é…置选项æ¿ç´¢å¼•%d。 (%s)大å°%dx%dä¸èµ·ä½œç”¨ã€‚" #: src/video_v4l2.c msgid "Supported palettes:" msgstr "支æŒçš„调色æ¿ï¼š" #: src/video_v4l2.c #, c-format msgid "%d - %s (compressed : %d) (%#x)" msgstr " %d- %s(压缩: %d)( %#x)" #: src/video_v4l2.c #, c-format msgid "Selected palette %s" msgstr "é€‰å®šçš„è°ƒè‰²æ¿ %s" #: src/video_v4l2.c #, c-format msgid "Palette selection failed for format %s" msgstr "æ ¼å¼ %s的调色æ¿é€‰æ‹©å¤±è´¥" #: src/video_v4l2.c msgid "Unable to find a compatible palette format." msgstr "找ä¸åˆ°å…¼å®¹çš„è°ƒè‰²æ¿æ ¼å¼ã€‚" #: src/video_v4l2.c #, c-format msgid "Error requesting buffers %d for memory map. VIDIOC_REQBUFS" msgstr "请求内存映射的缓冲区 %d时出错。VIDIOC REQBUFS" #: src/video_v4l2.c #, c-format msgid "mmap information: frames=%d" msgstr "mmapä¿¡æ¯ï¼šå¸§= %d" #: src/video_v4l2.c #, c-format msgid "Insufficient buffer memory %d < MIN_MMAP_BUFFERS." msgstr "缓冲存储器 %d <最å°MMAP缓冲区。" #: src/video_v4l2.c msgid "Out of memory." msgstr "è®°ä¸æ¸…。" #: src/video_v4l2.c #, c-format msgid "Error querying buffer %i" msgstr "查询缓冲区 %i 时出错" #: src/video_v4l2.c #, c-format msgid "Error mapping buffer %i mmap" msgstr "错误映射缓冲区 %i mmap" #: src/video_v4l2.c #, c-format msgid "%i length=%d Address (%x) offset %d" msgstr "%i 长度=%d åœ°å€ (%x) åç§»é‡ %d" #: src/video_v4l2.c msgid "Error starting stream. VIDIOC_STREAMON" msgstr "å¯åŠ¨æµæ—¶å‡ºé”™ã€‚VIDIOC STREAMON" #: src/video_v4l2.c msgid "Errors occurred during device select" msgstr "选择设备时å‘生错误" #: src/video_v4l2.c #, c-format msgid "Using videodevice %s and input %d" msgstr "使用视频设备 %s并输入 %d" #: src/video_v4l2.c #, c-format msgid "Failed to open video device %s" msgstr "无法打开视频设备 %s" #: src/video_v4l2.c msgid "Not a V4L2 device?" msgstr "䏿˜¯V4L2设备?" #: src/video_v4l2.c msgid "Device does not support capturing." msgstr "è®¾å¤‡ä¸æ”¯æŒæ•获。" #: src/video_v4l2.c #, c-format msgid "Trying to set fps to %d" msgstr "å°è¯•å°†fps设置为 %d" #: src/video_v4l2.c #, c-format msgid "Error setting fps. Return code %d" msgstr "设置fpsæ—¶å‡ºé”™ã€‚è¿”å›žç  %d" #: src/video_v4l2.c #, c-format msgid "Device set fps to %d" msgstr "设备将fps设置为 %d" #: src/video_v4l2.c msgid "V4L2 is not enabled" msgstr "V4L2未å¯ç”¨" #: src/video_v4l2.c msgid "V4L2 is not enabled." msgstr "V4L2未å¯ç”¨ã€‚" #: src/video_v4l2.c #, c-format msgid "Testing palette %s (%c%c%c%c)" msgstr "æµ‹è¯•è°ƒè‰²æ¿ %s( %c %c %c %c)" #: src/video_v4l2.c #, c-format msgid " Width: %d, Height %d" msgstr "宽度: %d,高度 %d" #: src/video_v4l2.c #, c-format msgid " Framerate %d/%d" msgstr "帧率 %d / %d" #: src/webu.c #, c-format msgid "Sent url: %s" msgstr "å‘é€çš„网å€ï¼š %s" #: src/webu.c #, c-format msgid "Decoded url: %s" msgstr "è§£ç çš„网å€ï¼š %s" #: src/webu.c msgid "Restarting all threads" msgstr "釿–°å¯åŠ¨æ‰€æœ‰çº¿ç¨‹" #: src/webu.c #, c-format msgid "Restarting thread %d" msgstr "釿–°å¯åŠ¨çº¿ç¨‹ %d" #: src/webu.c #, c-format msgid "Quitting thread %d" msgstr "退出线程 %d" #: src/webu.c src/webu_html.c src/webu_text.c #, c-format msgid "Invalid action requested: >%s< >%s< >%s<" msgstr "请求的无效æ“作:> %s <> %s <> %s <" #: src/webu.c msgid "Native Language : on" msgstr "æ¯è¯­ï¼š" #: src/webu.c msgid "Native Language : off" msgstr "æ¯è¯­ï¼šå…³é—­" #: src/webu.c msgid "Set the value to null/zero" msgstr "将值设置为null / zero" #: src/webu.c #, c-format msgid "Ignoring connection from: %s" msgstr "忽略æ¥è‡ª: %s 的连接" #: src/webu.c #, c-format msgid "Failed authentication from %s" msgstr "æ¥è‡ª %s的身份验è¯å¤±è´¥" #: src/webu.c msgid "No webcontrol user:pass provided" msgstr "没有网络控制用户:通过" #: src/webu.c msgid "No stream user:pass provided" msgstr "没有æµç”¨æˆ·ï¼šé€šè¿‡" #: src/webu.c src/webu_stream.c msgid "Invalid response" msgstr "无效的回应" #: src/webu.c #, c-format msgid "Error adding webcontrol header %s %s" msgstr "添加 webcontrol 标头 %s %s 时出错" #: src/webu.c src/webu_stream.c #, c-format msgid "Error adding stream header %s %s" msgstr "æ·»åŠ æµæ ‡å¤´ %s %s 时出错" #: src/webu.c #, c-format msgid "Invalid Method requested: %s" msgstr "请求的方法无效: %s" #: src/webu.c #, c-format msgid "Connection from: %s" msgstr "è¿žæŽ¥æ¥æºï¼š %s" #: src/webu.c #, c-format msgid "send page failed %d" msgstr "å‘é€é¡µé¢å¤±è´¥ %d" #: src/webu.c msgid "Stream picture is not ready yet" msgstr "æµå›¾ç‰‡å°šæœªå‡†å¤‡å¥½" #: src/webu.c msgid "Stream process requested to finish." msgstr "请求完æˆçš„æµå¤„ç†ã€‚" #: src/webu.c msgid "Send page failed." msgstr "å‘é€é¡µé¢å¤±è´¥ã€‚" #: src/webu.c msgid "Basic authentication: available" msgstr "基本身份验è¯ï¼šå¯ç”¨" #: src/webu.c msgid "Basic authentication: disabled" msgstr "基本身份验è¯ï¼šå·²ç¦ç”¨" #: src/webu.c msgid "Digest authentication: available" msgstr "摘è¦å¼èº«ä»½éªŒè¯ï¼šå¯ç”¨" #: src/webu.c msgid "Digest authentication: disabled" msgstr "摘è¦å¼èº«ä»½éªŒè¯ï¼šå·²ç¦ç”¨" #: src/webu.c msgid "libmicrohttpd libary too old ipv6 disabled" msgstr "libmicrohttpd libary ipv6太è€äº†" #: src/webu.c msgid "IPV6: available" msgstr "IPV6:å¯ç”¨" #: src/webu.c msgid "IPV6: disabled" msgstr "IPV6:已ç¦ç”¨" #: src/webu.c msgid "libmicrohttpd libary too old SSL/TLS disabled" msgstr "libmicrohttpd libary太旧ç¦ç”¨SSL / TLS" #: src/webu.c msgid "SSL/TLS: available" msgstr "SSL / TLS:å¯ç”¨" #: src/webu.c msgid "SSL/TLS: disabled" msgstr "SSL / TLS:已ç¦ç”¨" #: src/webu.c msgid "Error reading file for SSL/TLS support." msgstr "è¯»å–æ–‡ä»¶ä»¥èŽ·å–SSL / TLSæ”¯æŒæ—¶å‡ºé”™ã€‚" #: src/webu.c msgid "SSL/TLS requested but no cert file provided. SSL/TLS disabled" msgstr "请求了SSL / TLS,但未æä¾›è¯ä¹¦æ–‡ä»¶ã€‚ç¦ç”¨SSL / TLS" #: src/webu.c msgid "SSL/TLS requested but no key file provided. SSL/TLS disabled" msgstr "请求了SSL / TLS,但未æä¾›å¯†é’¥æ–‡ä»¶ã€‚ç¦ç”¨SSL / TLS" #: src/webu.c #, c-format msgid "Starting webcontrol on port %d" msgstr "åœ¨ç«¯å£ %d上å¯åЍWebControl" #: src/webu.c msgid "Unable to start MHD" msgstr "无法å¯åЍMHD" #: src/webu.c #, c-format msgid "Started webcontrol on port %d" msgstr "åœ¨ç«¯å£ %d上å¯åŠ¨äº†webcontrol" #: src/webu.c #, c-format msgid "Started camera %d stream on port/camera_id %d/%d" msgstr "已在端å£/æ‘„åƒæœºID %d / %d上å¯åŠ¨æ‘„åƒæœº %dæµ" #: src/webu.c #, c-format msgid "Started camera %d stream on port %d" msgstr "å·²åœ¨ç«¯å£ %d上å¯åŠ¨æ‘„åƒæœº %dæµ" #: src/webu.c #, c-format msgid "Starting all camera streams on port %d" msgstr "åœ¨ç«¯å£ %d上å¯åŠ¨æ‰€æœ‰æ‘„åƒæœºæµ" #: src/webu.c #, c-format msgid "Starting camera %d stream on port %d" msgstr "åœ¨ç«¯å£ %d上å¯åŠ¨ç›¸æœº %dæµ" #: src/webu.c #, c-format msgid "Unable to start stream for camera %d" msgstr "无法å¯åŠ¨ç›¸æœº %d的视频æµ" #: src/webu.c #, c-format msgid "Duplicate port requested %d" msgstr "请求的端å£é‡å¤ %d" #: src/webu.c msgid "Invalid webcontrol_lock_max_ips. Setting equal to 25." msgstr "无效的 webcontrol é”定最大 ips。设置等于 25。 " #: src/webu_html.c msgid "Cameras" msgstr "相机" #: src/webu_html.c msgid "Camera" msgstr "相机" #: src/webu_html.c msgid "All" msgstr "凡是" #: src/webu_html.c msgid "Action" msgstr "行动" #: src/webu_html.c msgid "Start Event" msgstr "开始活动" #: src/webu_html.c msgid "End Event" msgstr "结æŸäº‹ä»¶" #: src/webu_html.c msgid "Snapshot" msgstr "å¿«ç…§" #: src/webu_html.c msgid "Change Configuration" msgstr "改å˜é…ç½®" #: src/webu_html.c msgid "Write Configuration" msgstr "写é…ç½®" #: src/webu_html.c msgid "Tracking" msgstr "追踪" #: src/webu_html.c msgid "Pause" msgstr "æš‚åœ" #: src/webu_html.c msgid "Start" msgstr "开始" #: src/webu_html.c msgid "Restart" msgstr "釿–°å¼€å§‹" #: src/webu_html.c msgid "Quit" msgstr "放弃" #: src/webu_html.c msgid "Help" msgstr "救命" #: src/webu_html.c msgid "No Configuration Options" msgstr "æ²¡æœ‰å‚æ•°" #: src/webu_html.c msgid "Limited Configuration Options" msgstr "有é™çš„傿•°" #: src/webu_html.c msgid "Advanced Configuration Options" msgstr "é«˜çº§å‚æ•°" #: src/webu_html.c msgid "Restricted Configuration Options" msgstr "ä¿å¯†å‚æ•°" #: src/webu_html.c msgid "All Cameras" msgstr "所有相机" #: src/webu_html.c msgid "Not running" msgstr "没跑" #: src/webu_html.c msgid "Lost connection" msgstr "失去了连接" #: src/webu_html.c msgid "Paused" msgstr "æš‚åœ" #: src/webu_html.c msgid "Active" msgstr "活性" #: src/webu_html.c msgid "Select option" msgstr "选择选项" #: src/webu_html.c msgid "Save" msgstr "ä¿å­˜" #: src/webu_html.c msgid "Pan/Tilt" msgstr "旋转/倾" #: src/webu_html.c msgid "Absolute Change" msgstr "ç»å¯¹å˜" #: src/webu_html.c msgid "Center" msgstr "中央" #: src/webu_html.c msgid "Pan" msgstr "æ—‹" #: src/webu_html.c msgid "Tilt" msgstr "倾斜" #: src/webu_stream.c #, c-format msgid "Invalid thread specified: %s" msgstr "指定的无效线程: %s" #: src/webu_stream.c #, c-format msgid "Invalid URL for a camera specific port: %s" msgstr "相机特定端å£çš„URL无效: %s" #: src/webu_stream.c #, c-format msgid "URL for thread 0 is not valid when using camera specific files.: %s" msgstr "使用相机专用文件时,线程0çš„URL无效。 %s" #: src/webu_stream.c #, c-format msgid "Bad URL for a camera specific port: %s" msgstr "相机特定端å£çš„URL错误: %s" #: src/webu_stream.c msgid "Could not get image to stream." msgstr "无法获å–å›¾åƒæµã€‚" #: src/webu_text.c #, c-format msgid "'%s' option is depreciated. New option name is '%s'" msgstr "' %s'选项已弃用。新选项å称为 '%s'" motion-release-4.6.0/scripts/000077500000000000000000000000001452402535500161405ustar00rootroot00000000000000motion-release-4.6.0/scripts/version.sh000077500000000000000000000006751452402535500201740ustar00rootroot00000000000000#!/bin/sh BASE_VERSION="4.6.0" if [ -d .git ]; then if test "`git diff --name-only`" = "" ; then GIT_COMMIT="git" else GIT_COMMIT="dirty" fi GIT_COMMIT=$GIT_COMMIT`git show -s --date=format:'%Y%m%d' --format=%cd-%h` 2>/dev/null if [ $? -ne 0 ]; then GIT_COMMIT=$GIT_COMMIT`git show -s --format=%h` fi else GIT_COMMIT="gitUNKNOWN" fi printf "$BASE_VERSION" #printf "$BASE_VERSION+$GIT_COMMIT" motion-release-4.6.0/src/000077500000000000000000000000001452402535500152405ustar00rootroot00000000000000motion-release-4.6.0/src/Makefile.am000066400000000000000000000020221452402535500172700ustar00rootroot00000000000000AM_CPPFLAGS= -Dsysconfdir=\"$(sysconfdir)/motion\" -DLOCALEDIR=\"$(localedir)\" LDADD = $(LIBINTL) bin_PROGRAMS = motion motion_SOURCES = \ alg.h alg.c \ conf.h conf.c \ dbse.h dbse.c \ draw.h draw.c \ event.h event.c \ ffmpeg.h ffmpeg.c \ jpegutils.h jpegutils.c \ logger.h logger.c \ mmalcam.h mmalcam.c \ motion.h motion.c \ netcam.h netcam.c \ netcam_ftp.h netcam_ftp.c \ netcam_http.h netcam_http.c \ netcam_jpeg.h netcam_jpeg.c \ netcam_rtsp.h netcam_rtsp.c \ netcam_wget.h netcam_wget.c \ picture.h picture.c \ rotate.h rotate.c \ track.h track.c \ translate.h translate.c \ util.h util.c \ video_bktr.h video_bktr.c \ video_common.h video_common.c \ video_loopback.h video_loopback.c \ video_v4l2.h video_v4l2.c \ webu.h webu.c \ webu_html.h webu_html.c \ webu_status.h webu_status.c \ webu_stream.h webu_stream.c \ webu_text.h webu_text.c \ mmx.h pwc-ioctl.h if INC_MMAL_SRC motion_SOURCES += \ raspicam/RaspiCamControl.h raspicam/RaspiCamControl.c \ raspicam/RaspiCLI.h raspicam/RaspiCLI.c endif motion-release-4.6.0/src/alg.c000066400000000000000000001312361452402535500161550ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* alg.c * * Detect changes in a video stream. * Copyright 2001 by Jeroen Vreeken (pe1rxq@amsat.org) * */ #include "motion.h" #include "util.h" #include "draw.h" #include "alg.h" #ifdef __MMX__ #define HAVE_MMX #include "mmx.h" #endif #define MAX2(x, y) ((x) > (y) ? (x) : (y)) #define MAX3(x, y, z) ((x) > (y) ? ((x) > (z) ? (x) : (z)) : ((y) > (z) ? (y) : (z))) /** * alg_locate_center_size * Locates the center and size of the movement. */ void alg_locate_center_size(struct images *imgs, int width, int height, struct coord *cent) { unsigned char *out = imgs->img_motion.image_norm; int *labels = imgs->labels; int x, y, centc = 0, xdist = 0, ydist = 0; cent->x = 0; cent->y = 0; cent->maxx = 0; cent->maxy = 0; cent->minx = width; cent->miny = height; /* If Labeling enabled - locate center of largest labelgroup. */ if (imgs->labelsize_max) { /* Locate largest labelgroup */ for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { if (*(labels++) & 32768) { cent->x += x; cent->y += y; centc++; } } } } else { /* Locate movement */ for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { if (*(out++)) { cent->x += x; cent->y += y; centc++; } } } } if (centc) { cent->x = cent->x / centc; cent->y = cent->y / centc; } /* Now we find the size of the Motion. */ /* First reset pointers back to initial value. */ centc = 0; labels = imgs->labels; out = imgs->img_motion.image_norm; /* If Labeling then we find the area around largest labelgroup instead. */ if (imgs->labelsize_max) { for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { if (*(labels++) & 32768) { if (x > cent->x) { xdist += x - cent->x; } else if (x < cent->x) { xdist += cent->x - x; } if (y > cent->y) { ydist += y - cent->y; } else if (y < cent->y) { ydist += cent->y - y; } centc++; } } } } else { for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { if (*(out++)) { if (x > cent->x) { xdist += x - cent->x; } else if (x < cent->x) { xdist += cent->x - x; } if (y > cent->y) { ydist += y - cent->y; } else if (y < cent->y) { ydist += cent->y - y; } centc++; } } } } if (centc) { cent->minx = cent->x - xdist / centc * 2; cent->maxx = cent->x + xdist / centc * 2; /* * Make the box a little bigger in y direction to make sure the * heads fit in so we multiply by 3 instead of 2 which seems to * to work well in practical. */ cent->miny = cent->y - ydist / centc * 3; cent->maxy = cent->y + ydist / centc * 2; } if (cent->maxx > width - 1) { cent->maxx = width - 1; } else if (cent->maxx < 0) { cent->maxx = 0; } if (cent->maxy > height - 1) { cent->maxy = height - 1; } else if (cent->maxy < 0) { cent->maxy = 0; } if (cent->minx > width - 1) { cent->minx = width - 1; } else if (cent->minx < 0) { cent->minx = 0; } if (cent->miny > height - 1) { cent->miny = height - 1; } else if (cent->miny < 0) { cent->miny = 0; } /* Align for better locate box handling */ cent->minx += cent->minx % 2; cent->miny += cent->miny % 2; cent->maxx -= cent->maxx % 2; cent->maxy -= cent->maxy % 2; cent->width = cent->maxx - cent->minx; cent->height = cent->maxy - cent->miny; /* * We want to center Y coordinate to be the center of the action. * The head of a person is important so we correct the cent.y coordinate * to match the correction to include a persons head that we just did above. */ cent->y = (cent->miny + cent->maxy) / 2; } /** * alg_draw_location * Draws a box around the movement. */ void alg_draw_location(struct coord *cent, struct images *imgs, int width, unsigned char *new, int style, int mode, int process_thisframe) { unsigned char *out = imgs->img_motion.image_norm; int x, y; out = imgs->img_motion.image_norm; /* Debug image always gets a 'normal' box. */ if ((mode == LOCATE_BOTH) && process_thisframe) { int width_miny = width * cent->miny; int width_maxy = width * cent->maxy; for (x = cent->minx; x <= cent->maxx; x++) { int width_miny_x = x + width_miny; int width_maxy_x = x + width_maxy; out[width_miny_x] =~out[width_miny_x]; out[width_maxy_x] =~out[width_maxy_x]; } for (y = cent->miny; y <= cent->maxy; y++) { int width_minx_y = cent->minx + y * width; int width_maxx_y = cent->maxx + y * width; out[width_minx_y] =~out[width_minx_y]; out[width_maxx_y] =~out[width_maxx_y]; } } if (style == LOCATE_BOX) { /* Draw a box on normal images. */ int width_miny = width * cent->miny; int width_maxy = width * cent->maxy; for (x = cent->minx; x <= cent->maxx; x++) { int width_miny_x = x + width_miny; int width_maxy_x = x + width_maxy; new[width_miny_x] =~new[width_miny_x]; new[width_maxy_x] =~new[width_maxy_x]; } for (y = cent->miny; y <= cent->maxy; y++) { int width_minx_y = cent->minx + y * width; int width_maxx_y = cent->maxx + y * width; new[width_minx_y] =~new[width_minx_y]; new[width_maxx_y] =~new[width_maxx_y]; } } else if (style == LOCATE_CROSS) { /* Draw a cross on normal images. */ int centy = cent->y * width; for (x = cent->x - 10; x <= cent->x + 10; x++) { new[centy + x] =~new[centy + x]; out[centy + x] =~out[centy + x]; } for (y = cent->y - 10; y <= cent->y + 10; y++) { new[cent->x + y * width] =~new[cent->x + y * width]; out[cent->x + y * width] =~out[cent->x + y * width]; } } } /** * alg_draw_red_location * Draws a RED box around the movement. */ void alg_draw_red_location(struct coord *cent, struct images *imgs, int width, unsigned char *new, int style, int mode, int process_thisframe) { unsigned char *out = imgs->img_motion.image_norm; unsigned char *new_u, *new_v; int x, y, v, cwidth, cblock; cwidth = width / 2; cblock = imgs->motionsize / 4; x = imgs->motionsize; v = x + cblock; out = imgs->img_motion.image_norm; new_u = new + x; new_v = new + v; /* Debug image always gets a 'normal' box. */ if ((mode == LOCATE_BOTH) && process_thisframe) { int width_miny = width * cent->miny; int width_maxy = width * cent->maxy; for (x = cent->minx; x <= cent->maxx; x++) { int width_miny_x = x + width_miny; int width_maxy_x = x + width_maxy; out[width_miny_x] =~out[width_miny_x]; out[width_maxy_x] =~out[width_maxy_x]; } for (y = cent->miny; y <= cent->maxy; y++) { int width_minx_y = cent->minx + y * width; int width_maxx_y = cent->maxx + y * width; out[width_minx_y] =~out[width_minx_y]; out[width_maxx_y] =~out[width_maxx_y]; } } if (style == LOCATE_REDBOX) { /* Draw a red box on normal images. */ int width_miny = width * cent->miny; int width_maxy = width * cent->maxy; int cwidth_miny = cwidth * (cent->miny / 2); int cwidth_maxy = cwidth * (cent->maxy / 2); for (x = cent->minx + 2; x <= cent->maxx - 2; x += 2) { int width_miny_x = x + width_miny; int width_maxy_x = x + width_maxy; int cwidth_miny_x = x / 2 + cwidth_miny; int cwidth_maxy_x = x / 2 + cwidth_maxy; new_u[cwidth_miny_x] = 128; new_u[cwidth_maxy_x] = 128; new_v[cwidth_miny_x] = 255; new_v[cwidth_maxy_x] = 255; new[width_miny_x] = 128; new[width_maxy_x] = 128; new[width_miny_x + 1] = 128; new[width_maxy_x + 1] = 128; new[width_miny_x + width] = 128; new[width_maxy_x + width] = 128; new[width_miny_x + 1 + width] = 128; new[width_maxy_x + 1 + width] = 128; } for (y = cent->miny; y <= cent->maxy; y += 2) { int width_minx_y = cent->minx + y * width; int width_maxx_y = cent->maxx + y * width; int cwidth_minx_y = (cent->minx / 2) + (y / 2) * cwidth; int cwidth_maxx_y = (cent->maxx / 2) + (y / 2) * cwidth; new_u[cwidth_minx_y] = 128; new_u[cwidth_maxx_y] = 128; new_v[cwidth_minx_y] = 255; new_v[cwidth_maxx_y] = 255; new[width_minx_y] = 128; new[width_maxx_y] = 128; new[width_minx_y + width] = 128; new[width_maxx_y + width] = 128; new[width_minx_y + 1] = 128; new[width_maxx_y + 1] = 128; new[width_minx_y + width + 1] = 128; new[width_maxx_y + width + 1] = 128; } } else if (style == LOCATE_REDCROSS) { /* Draw a red cross on normal images. */ int cwidth_maxy = cwidth * (cent->y / 2); for (x = cent->x - 10; x <= cent->x + 10; x += 2) { int cwidth_maxy_x = x / 2 + cwidth_maxy; new_u[cwidth_maxy_x] = 128; new_v[cwidth_maxy_x] = 255; } for (y = cent->y - 10; y <= cent->y + 10; y += 2) { int cwidth_minx_y = (cent->x / 2) + (y / 2) * cwidth; new_u[cwidth_minx_y] = 128; new_v[cwidth_minx_y] = 255; } } } #define NORM 100 #define ABS(x) ((x) < 0 ? -(x) : (x)) #define DIFF(x, y) (ABS((x)-(y))) #define NDIFF(x, y) (ABS(x) * NORM / (ABS(x) + 2 * DIFF(x, y))) /** * alg_noise_tune * */ void alg_noise_tune(struct context *cnt, unsigned char *new) { struct images *imgs = &cnt->imgs; int i; unsigned char *ref = imgs->ref; int diff, sum = 0, count = 0; unsigned char *mask = imgs->mask; unsigned char *smartmask = imgs->smartmask_final; i = imgs->motionsize; for (; i > 0; i--) { diff = ABS(*ref - *new); if (mask) { diff = ((diff * *mask++) / 255); } if (*smartmask) { sum += diff + 1; count++; } ref++; new++; smartmask++; } if (count > 3) { /* Avoid divide by zero. */ sum /= count / 3; } /* 5: safe, 4: regular, 3: more sensitive */ cnt->noise = 4 + (cnt->conf.noise_level / 2) + (cnt->noise + sum) / 2; } /** * alg_threshold_tune * */ void alg_threshold_tune(struct context *cnt, int diffs, int motion) { int i; int sum = 0, top = diffs; if (!diffs) { return; } if (motion) { diffs = cnt->threshold / 4; } for (i = 0; i < THRESHOLD_TUNE_LENGTH - 1; i++) { sum += cnt->diffs_last[i]; if (cnt->diffs_last[i + 1] && !motion) { cnt->diffs_last[i] = cnt->diffs_last[i + 1]; } else { cnt->diffs_last[i] = cnt->threshold / 4; } if (cnt->diffs_last[i] > top) { top = cnt->diffs_last[i]; } } sum += cnt->diffs_last[i]; cnt->diffs_last[i] = diffs; sum /= THRESHOLD_TUNE_LENGTH / 4; if (sum < top * 2) { sum = top * 2; } if (sum < cnt->conf.threshold) { cnt->threshold = (cnt->threshold + sum) / 2; } } /* * Labeling by Joerg Weber. Based on an idea from Hubert Mara. * Floodfill enhanced by Ian McConnel based on code from * http://www.acm.org/pubs/tog/GraphicsGems/ * http://www.codeproject.com/gdi/QuickFill.asp * Filled horizontal segment of scanline y for xl <= x <= xr. * Parent segment was on line y - dy. dy = 1 or -1 */ #define MAXS 10000 /* max depth of stack */ #define PUSH(Y, XL, XR, DY) /* push new segment on stack */ \ if (sp= 0 && Y+(DY) < height) \ {sp->y = Y; sp->xl = XL; sp->xr = XR; sp->dy = DY; sp++;} #define POP(Y, XL, XR, DY) /* pop segment off stack */ \ {sp--; Y = sp->y+(DY = sp->dy); XL = sp->xl; XR = sp->xr;} typedef struct { short y, xl, xr, dy; } Segment; /** * iflood * */ static int iflood(int x, int y, int width, int height, unsigned char *out, int *labels, int newvalue, int oldvalue) { int l, x1, x2, dy; Segment stack[MAXS], *sp = stack; /* Stack of filled segments. */ int count = 0; if (x < 0 || x >= width || y < 0 || y >= height) { return 0; } PUSH(y, x, x, 1); /* Needed in some cases. */ PUSH(y+1, x, x, -1); /* Seed segment (popped 1st). */ while (sp > stack) { /* Pop segment off stack and fill a neighboring scan line. */ POP(y, x1, x2, dy); /* * Segment of scan line y-dy for x1<=x<=x2 was previously filled, * now explore adjacent pixels in scan line y */ for (x = x1; x >= 0 && out[y * width + x] != 0 && labels[y * width + x] == oldvalue; x--) { labels[y * width + x] = newvalue; count++; } if (x >= x1) { goto skip; } l = x + 1; if (l < x1) { PUSH(y, l, x1 - 1, -dy); /* Leak on left? */ } x = x1 + 1; do { for (; x < width && out[y * width + x] != 0 && labels[y * width + x] == oldvalue; x++) { labels[y * width + x] = newvalue; count++; } PUSH(y, l, x - 1, dy); if (x > x2 + 1) { PUSH(y, x2 + 1, x - 1, -dy); /* Leak on right? */ } skip: for (x++; x <= x2 && !(out[y * width + x] != 0 && labels[y * width + x] == oldvalue); x++) {} l = x; } while (x <= x2); } return count; } /** * alg_labeling * */ static int alg_labeling(struct context *cnt) { struct images *imgs = &cnt->imgs; unsigned char *out = imgs->img_motion.image_norm; int *labels = imgs->labels; int ix, iy, pixelpos; int width = imgs->width; int height = imgs->height; int labelsize = 0; int current_label = 2; /* Keep track of the area just under the threshold. */ int max_under = 0; cnt->current_image->total_labels = 0; imgs->labelsize_max = 0; /* ALL labels above threshold are counted as labelgroup. */ imgs->labelgroup_max = 0; imgs->labels_above = 0; /* Init: 0 means no label set / not checked. */ memset(labels, 0, width * height * sizeof(*labels)); pixelpos = 0; for (iy = 0; iy < height - 1; iy++) { for (ix = 0; ix < width - 1; ix++, pixelpos++) { /* No motion - no label */ if (out[pixelpos] == 0) { labels[pixelpos] = 1; continue; } /* Already visited by iflood */ if (labels[pixelpos] > 0) { continue; } labelsize = iflood(ix, iy, width, height, out, labels, current_label, 0); if (labelsize > 0) { //MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, "Label: %i (%i) Size: %i (%i,%i)", // current_label, cnt->current_image->total_labels, // labelsize, ix, iy); /* Label above threshold? Mark it again (add 32768 to labelnumber). */ if (labelsize > cnt->threshold) { labelsize = iflood(ix, iy, width, height, out, labels, current_label + 32768, current_label); imgs->labelgroup_max += labelsize; imgs->labels_above++; } else if(max_under < labelsize) { max_under = labelsize; } if (imgs->labelsize_max < labelsize) { imgs->labelsize_max = labelsize; imgs->largest_label = current_label; } cnt->current_image->total_labels++; current_label++; } } pixelpos++; /* Compensate for ix < width - 1 */ } //MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, "%i Labels found. Largest connected Area: %i Pixel(s). " // "Largest Label: %i", imgs->largest_label, imgs->labelsize_max, // cnt->current_image->total_labels); /* Return group of significant labels or if that's none, the next largest * group (which is under the threshold, but especially for setup gives an * idea how close it was). */ return imgs->labelgroup_max ? imgs->labelgroup_max : max_under; } /** * dilate9 * Dilates a 3x3 box. */ static int dilate9(unsigned char *img, int width, int height, void *buffer) { /* * - row1, row2 and row3 represent lines in the temporary buffer. * - Window is a sliding window containing max values of the columns * in the 3x3 matrix. * - width is an index into the sliding window (this is faster than * doing modulo 3 on i). * - blob keeps the current max value. */ int y, i, sum = 0, widx; unsigned char *row1, *row2, *row3, *rowTemp,*yp; unsigned char window[3], blob, latest; /* Set up row pointers in the temporary buffer. */ row1 = buffer; row2 = row1 + width; row3 = row2 + width; /* Init rows 2 and 3. */ memset(row2, 0, width); memcpy(row3, img, width); /* Pointer to the current row in img. */ yp = img; for (y = 0; y < height; y++) { /* Move down one step; row 1 becomes the previous row 2 and so on. */ rowTemp = row1; row1 = row2; row2 = row3; row3 = rowTemp; /* If we're at the last row, fill with zeros, otherwise copy from img. */ if (y == height - 1) { memset(row3, 0, width); } else { memcpy(row3, yp+width, width); } /* Init slots 0 and 1 in the moving window. */ window[0] = MAX3(row1[0], row2[0], row3[0]); window[1] = MAX3(row1[1], row2[1], row3[1]); /* Init blob to the current max, and set window index. */ blob = MAX2(window[0], window[1]); widx = 2; /* * Iterate over the current row; index i is off by one to eliminate * a lot of +1es in the loop. */ for (i = 2; i <= width - 1; i++) { /* Get the max value of the next column in the 3x3 matrix. */ latest = window[widx] = MAX3(row1[i], row2[i], row3[i]); /* * If the value is larger than the current max, use it. Otherwise, * calculate a new max (because the new value may not be the max. */ if (latest >= blob) { blob = latest; } else { blob = MAX3(window[0], window[1], window[2]); } /* Write the max value (blob) to the image. */ if (blob != 0) { *(yp + i - 1) = blob; sum++; } /* Wrap around the window index if necessary. */ if (++widx == 3) { widx = 0; } } /* Store zeros in the vertical sides. */ *yp = *(yp + width - 1) = 0; yp += width; } return sum; } /** * dilate5 * Dilates a + shape. */ static int dilate5(unsigned char *img, int width, int height, void *buffer) { /* * - row1, row2 and row3 represent lines in the temporary buffer. * - mem holds the max value of the overlapping part of two + shapes. */ int y, i, sum = 0; unsigned char *row1, *row2, *row3, *rowTemp, *yp; unsigned char blob, mem, latest; /* Set up row pointers in the temporary buffer. */ row1 = buffer; row2 = row1 + width; row3 = row2 + width; /* Init rows 2 and 3. */ memset(row2, 0, width); memcpy(row3, img, width); /* Pointer to the current row in img. */ yp = img; for (y = 0; y < height; y++) { /* Move down one step; row 1 becomes the previous row 2 and so on. */ rowTemp = row1; row1 = row2; row2 = row3; row3 = rowTemp; /* If we're at the last row, fill with zeros, otherwise copy from img. */ if (y == height - 1) { memset(row3, 0, width); } else { memcpy(row3, yp + width, width); } /* Init mem and set blob to force an evaluation of the entire + shape. */ mem = MAX2(row2[0], row2[1]); blob = 1; /* dummy value, must be > 0 */ for (i = 1; i < width - 1; i++) { /* Get the max value of the "right edge" of the + shape. */ latest = MAX3(row1[i], row2[i + 1], row3[i]); if (blob == 0) { /* In case the last blob is zero, only latest matters. */ blob = latest; mem = row2[i + 1]; } else { /* Otherwise, we have to check both latest and mem. */ blob = MAX2(mem, latest); mem = MAX2(row2[i], row2[i + 1]); } /* Write the max value (blob) to the image. */ if (blob != 0) { *(yp + i) = blob; sum++; } } /* Store zeros in the vertical sides. */ *yp = *(yp + width - 1) = 0; yp += width; } return sum; } /** * erode9 * Erodes a 3x3 box. */ static int erode9(unsigned char *img, int width, int height, void *buffer, unsigned char flag) { int y, i, sum = 0; char *Row1,*Row2,*Row3; Row1 = buffer; Row2 = Row1 + width; Row3 = Row1 + 2 * width; memset(Row2, flag, width); memcpy(Row3, img, width); for (y = 0; y < height; y++) { memcpy(Row1, Row2, width); memcpy(Row2, Row3, width); if (y == height-1) { memset(Row3, flag, width); } else { memcpy(Row3, img + (y+1) * width, width); } for (i = width - 2; i >= 1; i--) { if (Row1[i - 1] == 0 || Row1[i] == 0 || Row1[i + 1] == 0 || Row2[i - 1] == 0 || Row2[i] == 0 || Row2[i + 1] == 0 || Row3[i - 1] == 0 || Row3[i] == 0 || Row3[i + 1] == 0) { img[y * width + i] = 0; } else { sum++; } } img[y * width] = img[y * width + width - 1] = flag; } return sum; } /** * erode5 * Erodes in a + shape. */ static int erode5(unsigned char *img, int width, int height, void *buffer, unsigned char flag) { int y, i, sum = 0; char *Row1,*Row2,*Row3; Row1 = buffer; Row2 = Row1 + width; Row3 = Row1 + 2 * width; memset(Row2, flag, width); memcpy(Row3, img, width); for (y = 0; y < height; y++) { memcpy(Row1, Row2, width); memcpy(Row2, Row3, width); if (y == height-1) { memset(Row3, flag, width); } else { memcpy(Row3, img + (y + 1) * width, width); } for (i = width - 2; i >= 1; i--) { if (Row1[i] == 0 || Row2[i - 1] == 0 || Row2[i] == 0 || Row2[i + 1] == 0 || Row3[i] == 0) { img[y * width + i] = 0; } else { sum++; } } img[y * width] = img[y * width + width - 1] = flag; } return sum; } /** * alg_despeckle * Despeckling routine to remove noisy detections. */ int alg_despeckle(struct context *cnt, int olddiffs) { int diffs = 0; unsigned char *out = cnt->imgs.img_motion.image_norm; int width = cnt->imgs.width; int height = cnt->imgs.height; int done = 0, i, len = strlen(cnt->conf.despeckle_filter); unsigned char *common_buffer = cnt->imgs.common_buffer; for (i = 0; i < len; i++) { switch (cnt->conf.despeckle_filter[i]) { case 'E': if ((diffs = erode9(out, width, height, common_buffer, 0)) == 0) { i = len; } done = 1; break; case 'e': if ((diffs = erode5(out, width, height, common_buffer, 0)) == 0) { i = len; } done = 1; break; case 'D': diffs = dilate9(out, width, height, common_buffer); done = 1; break; case 'd': diffs = dilate5(out, width, height, common_buffer); done = 1; break; /* No further despeckle after labeling! */ case 'l': diffs = alg_labeling(cnt); i = len; done = 2; break; } } /* If conf.despeckle_filter contains any valid action EeDdl */ if (done) { if (done != 2) { cnt->imgs.labelsize_max = 0; // Disable Labeling } return diffs; } else { cnt->imgs.labelsize_max = 0; // Disable Labeling } return olddiffs; } /** * alg_tune_smartmask * Generates actual smartmask. Calculate sensitivity based on motion. */ void alg_tune_smartmask(struct context *cnt) { int i, diff; int motionsize = cnt->imgs.motionsize; unsigned char *smartmask = cnt->imgs.smartmask; unsigned char *smartmask_final = cnt->imgs.smartmask_final; int *smartmask_buffer = cnt->imgs.smartmask_buffer; int sensitivity = cnt->lastrate * (11 - cnt->smartmask_speed); for (i = 0; i < motionsize; i++) { /* Decrease smart_mask sensitivity every 5*speed seconds only. */ if (smartmask[i] > 0) { smartmask[i]--; } /* Increase smart_mask sensitivity based on the buffered values. */ diff = smartmask_buffer[i]/sensitivity; if (diff) { if (smartmask[i] <= diff + 80) { smartmask[i] += diff; } else { smartmask[i] = 80; } smartmask_buffer[i] %= sensitivity; } /* Transfer raw mask to the final stage when above trigger value. */ if (smartmask[i] > 20) { smartmask_final[i] = 0; } else { smartmask_final[i] = 255; } } /* Further expansion (here:erode due to inverted logic!) of the mask. */ diff = erode9(smartmask_final, cnt->imgs.width, cnt->imgs.height, cnt->imgs.common_buffer, 255); diff = erode5(smartmask_final, cnt->imgs.width, cnt->imgs.height, cnt->imgs.common_buffer, 255); } /* Increment for *smartmask_buffer in alg_diff_standard. */ #define SMARTMASK_SENSITIVITY_INCR 5 /** * alg_diff_standard * */ int alg_diff_standard(struct context *cnt, unsigned char *new) { struct images *imgs = &cnt->imgs; int i, diffs = 0; int noise = cnt->noise; int smartmask_speed = cnt->smartmask_speed; unsigned char *ref = imgs->ref; unsigned char *out = imgs->img_motion.image_norm; unsigned char *mask = imgs->mask; unsigned char *smartmask_final = imgs->smartmask_final; int *smartmask_buffer = imgs->smartmask_buffer; #ifdef HAVE_MMX mmx_t mmtemp; /* Used for transferring to/from memory. */ int unload; /* Counter for unloading diff counts. */ #endif i = imgs->motionsize; memset(out + i, 128, i / 2); /* Motion pictures are now b/w i.o. green */ /* * Keeping this memset in the MMX case when zeroes are necessarily * written anyway seems to be beneficial in terms of speed. Perhaps a * cache thing? */ memset(out, 0, i); #ifdef HAVE_MMX /* * NOTE: The Pentium has two instruction pipes: U and V. I have grouped MMX * instructions in pairs according to how I think they will be scheduled in * the U and V pipes. Due to pairing constraints, the V pipe will sometimes * be empty (for example, memory access always goes into the U pipe). * * The following MMX registers are kept throughout the loop: * mm5 - 8 separate diff counters (unloaded periodically) * mm6 - mask: 00ff 00ff 00ff 00ff * mm7 - noise level as 8 packed bytes * * -- Per Jonsson */ /* * To avoid a div, we work with differences multiplied by 255 in the * default case and *mask otherwise. Thus, the limit to compare with is * 255 * (noise + 1) - 1). */ mmtemp.uw[0] = mmtemp.uw[1] = mmtemp.uw[2] = mmtemp.uw[3] = (unsigned short)(noise * 255 + 254); /* * Reset mm5 to zero, set the mm6 mask, and store the multiplied noise * level as four words in mm7. */ movq_m2r(mmtemp, mm7); /* U */ pcmpeqb_r2r(mm6, mm6); /* V */ pxor_r2r(mm5, mm5); /* U */ psrlw_i2r(8, mm6); /* V */ /* * We must unload mm5 every 255th round, because the diffs accumulate * in each packed byte, which can hold at most 255 diffs before it * gets saturated. */ unload = 255; for (; i > 7; i -= 8) { /* Calculate abs(*ref-*new) for 8 pixels in parallel. */ movq_m2r(*ref, mm0); /* U: mm0 = r7 r6 r5 r4 r3 r2 r1 r0 */ pxor_r2r(mm4, mm4); /* V: mm4 = 0 */ movq_m2r(*new, mm1); /* U: mm1 = n7 n6 n5 n4 n3 n2 n1 n0 */ movq_r2r(mm0, mm2); /* V: mm2 = r7 r6 r5 r4 r3 r2 r1 r0 */ /* These subtractions are saturated, i.e. won't go below 0. */ psubusb_r2r(mm1, mm0); /* U: mm0 = (r7-n7) ... (r0-n0) */ psubusb_r2r(mm2, mm1); /* V: mm1 = (n7-r7) ... (n0-r0) */ /* Each byte dX in mm0 is abs(nX-rX). */ por_r2r(mm1, mm0); /* U: mm0 = d7 d6 d5 d4 d3 d2 d1 d0 */ /* Expand the absolute differences to words in mm0 and mm1. */ movq_r2r(mm0, mm1); /* U: mm1 = d7 d6 d5 d4 d3 d2 d1 d0 */ punpcklbw_r2r(mm4, mm0); /* V: mm0 = d3 d2 d1 d0 */ punpckhbw_r2r(mm4, mm1); /* U: mm1 = d7 d6 d5 d4 */ if (mask) { /* * Load and expand 8 mask bytes to words in mm2 and mm3. Then * multiply by mm0 and mm1, respectively. */ movq_m2r(*mask, mm2); /* U: mm2 = m7 m6 m5 m4 m3 m2 m1 m0 */ movq_r2r(mm2, mm3); /* U: mm3 = m7 m6 m5 m4 m3 m2 m1 m0 */ punpcklbw_r2r(mm4, mm2); /* v: mm2 = m3 m2 m1 m0 */ punpckhbw_r2r(mm4, mm3); /* U: mm3 = m7 m6 m5 m4 */ pmullw_r2r(mm2, mm0); /* V: mm0 = (d3*m3) ... (d0*m0) */ pmullw_r2r(mm3, mm1); /* U: mm1 = (d7*m7) ... (d4*m4) */ mask += 8; } else { /* * Not using mask - multiply the absolute differences by 255. We * do this by left-shifting 8 places and then subtracting dX. */ movq_r2r(mm0, mm2); /* U: mm2 = d3 d2 d1 d0 */ psllw_i2r(8, mm0); /* V: mm2 = (256*d3) ... (256*d0) */ movq_r2r(mm1, mm3); /* U: mm3 = d7 d6 d5 d4 */ psllw_i2r(8, mm1); /* V: mm3 = (256*d7) ... (256*d4) */ psubusw_r2r(mm2, mm0); /* U */ psubusw_r2r(mm3, mm1); /* V */ } /* * Next, compare the multiplied absolute differences with the multiplied * noise level (repeated as 4 words in mm7), resulting in a "motion flag" * for each pixel. * * Since pcmpgtw performs signed comparisons, we have to subtract noise, * test for equality to 0 and then invert the result. * * Note that it is safe to generate the "motion flags" before the * smartmask code, as all that can happen is that individual flags get * reset to 0 because of the smartmask. */ psubusw_r2r(mm7, mm0); /* U: subtract by (multiplied) noise */ psubusw_r2r(mm7, mm1); /* V */ pcmpeqw_r2r(mm4, mm0); /* U: test for equality with 0 */ pcmpeqw_r2r(mm4, mm1); /* V */ pand_r2r(mm6, mm0); /* U: convert 0xffff -> 0x00ff */ pand_r2r(mm6, mm1); /* V */ pxor_r2r(mm6, mm0); /* U: invert the result */ pxor_r2r(mm6, mm1); /* V */ /* Each fX is the "motion flag" = 0 for no motion, 0xff for motion. */ packuswb_r2r(mm1, mm0); /* U: mm0 = f7 f6 f5 f4 f3 f2 f1 f0 */ if (smartmask_speed) { /* * Apply the smartmask. Basically, if *smartmask_final is 0, the * corresponding "motion flag" in mm0 will be reset. */ movq_m2r(*smartmask_final, mm3); /* U: mm3 = s7 s6 s5 s4 s3 s2 s1 s0 */ /* * ...but move the "motion flags" to memory before, in order to * increment *smartmask_buffer properly below. */ movq_r2m(mm0, mmtemp); /* U */ pcmpeqb_r2r(mm4, mm3); /* V: mm3 = 0xff where sX==0 */ /* AND negates the target before anding. */ pandn_r2r(mm0, mm3); /* U: mm3 = 0xff where dX>noise && sX>0 */ movq_r2r(mm3, mm0); /* U */ /* Add to *smartmask_buffer. This is probably the fastest way to do it. */ /* TODO: Revise this to use a loop */ if (cnt->event_nr != cnt->prev_event) { if (mmtemp.ub[0]) { smartmask_buffer[0] += SMARTMASK_SENSITIVITY_INCR; } if (mmtemp.ub[1]) { smartmask_buffer[1] += SMARTMASK_SENSITIVITY_INCR; } if (mmtemp.ub[2]) { smartmask_buffer[2] += SMARTMASK_SENSITIVITY_INCR; } if (mmtemp.ub[3]) { smartmask_buffer[3] += SMARTMASK_SENSITIVITY_INCR; } if (mmtemp.ub[4]) { smartmask_buffer[4] += SMARTMASK_SENSITIVITY_INCR; } if (mmtemp.ub[5]) { smartmask_buffer[5] += SMARTMASK_SENSITIVITY_INCR; } if (mmtemp.ub[6]) { smartmask_buffer[6] += SMARTMASK_SENSITIVITY_INCR; } if (mmtemp.ub[7]) { smartmask_buffer[7] += SMARTMASK_SENSITIVITY_INCR; } } smartmask_buffer += 8; smartmask_final += 8; } movq_m2r(*new, mm2); /* U: mm1 = n7 n6 n5 n4 n3 n2 n1 n0 */ /* * Cancel out pixels in *new according to the "motion flags" in mm0. * Each NX is either 0 or nX as from *new. */ pand_r2r(mm0, mm2); /* U: mm1 = N7 N6 N5 N4 N3 N2 N1 N0 */ psubb_r2r(mm0, mm4); /* V: mm4 = 0x01 where dX>noise */ /* * mm5 holds 8 separate counts - each one is increased according to * the contents of mm4 (where each byte is either 0x00 or 0x01). */ movq_r2m(mm2, *out); /* U: this will stall */ paddusb_r2r(mm4, mm5); /* V: add counts to mm5 */ /* * Every 255th turn, we need to unload mm5 into the diffs variable, * because otherwise the packed bytes will get saturated. */ if (--unload == 0) { /* Unload mm5 to memory and reset it. */ movq_r2m(mm5, mmtemp); /* U */ pxor_r2r(mm5, mm5); /* V: mm5 = 0 */ diffs += mmtemp.ub[0] + mmtemp.ub[1] + mmtemp.ub[2] + mmtemp.ub[3] + mmtemp.ub[4] + mmtemp.ub[5] + mmtemp.ub[6] + mmtemp.ub[7]; unload = 255; } out += 8; ref += 8; new += 8; } /* * Check if there are diffs left in mm5 that need to be copied to the * diffs variable. */ if (unload < 255) { movq_r2m(mm5, mmtemp); diffs += mmtemp.ub[0] + mmtemp.ub[1] + mmtemp.ub[2] + mmtemp.ub[3] + mmtemp.ub[4] + mmtemp.ub[5] + mmtemp.ub[6] + mmtemp.ub[7]; } emms(); #endif /* * Note that the non-MMX code is present even if the MMX code is present. * This is necessary if the resolution is not a multiple of 8, in which * case the non-MMX code needs to take care of the remaining pixels. */ for (; i > 0; i--) { int curdiff = abs((char)*ref - (char)*new); /* Apply fixed mask */ if (mask) { curdiff = ((int)(curdiff * *mask++) / 255); } if (smartmask_speed) { if (curdiff > noise) { /* * Increase smart_mask sensitivity every frame when motion * is detected. (with speed=5, mask is increased by 1 every * second. To be able to increase by 5 every second (with * speed=10) we add 5 here. NOT related to the 5 at ratio- * calculation. */ if (cnt->event_nr != cnt->prev_event) { (*smartmask_buffer) += SMARTMASK_SENSITIVITY_INCR; } /* Apply smart_mask */ if (!*smartmask_final) { curdiff = 0; } } smartmask_final++; smartmask_buffer++; } /* Pixel still in motion after all the masks? */ if (curdiff > noise) { *out = *new; diffs++; } out++; ref++; new++; } return diffs; } /** * alg_diff_fast * Very fast diff function, does not apply mask overlaying. */ static char alg_diff_fast(struct context *cnt, int max_n_changes, unsigned char *new) { struct images *imgs = &cnt->imgs; int i, diffs = 0, step = imgs->motionsize/10000; int noise = cnt->noise; unsigned char *ref = imgs->ref; if (!step % 2) { step++; } /* We're checking only 1 of several pixels. */ max_n_changes /= step; i = imgs->motionsize; for (; i > 0; i -= step) { int curdiff = abs((char)*ref - (char)*new); if (curdiff > noise) { diffs++; if (diffs > max_n_changes) { return 1; } } ref += step; new += step; } return 0; } /** * alg_diff * Uses diff_fast to quickly decide if there is anything worth * sending to diff_standard. */ int alg_diff(struct context *cnt, unsigned char *new) { int diffs = 0; if (alg_diff_fast(cnt, cnt->conf.threshold / 2, new)) { diffs = alg_diff_standard(cnt, new); } return diffs; } /** * alg_lightswitch * Detects a sudden massive change in the picture. * It is assumed to be the light being switched on or a camera displacement. * In any way the user doesn't think it is worth capturing. */ int alg_lightswitch(struct context *cnt, int diffs) { struct images *imgs = &cnt->imgs; if (cnt->conf.lightswitch_percent < 0) { cnt->conf.lightswitch_percent = 0; } if (cnt->conf.lightswitch_percent > 100) { cnt->conf.lightswitch_percent = 100; } /* Is lightswitch percent of the image changed? */ if (diffs > (imgs->motionsize * cnt->conf.lightswitch_percent / 100)) { return 1; } return 0; } /** * alg_switchfilter * */ int alg_switchfilter(struct context *cnt, int diffs, unsigned char *newimg) { int linediff = diffs / cnt->imgs.height; unsigned char *out = cnt->imgs.img_motion.image_norm; int y, x, line; int lines = 0, vertlines = 0; for (y = 0; y < cnt->imgs.height; y++) { line = 0; for (x = 0; x < cnt->imgs.width; x++) { if (*(out++)) { line++; } } if (line > cnt->imgs.width / 18) { vertlines++; } if (line > linediff * 2) { lines++; } } if (vertlines > cnt->imgs.height / 10 && lines < vertlines / 3 && (vertlines > cnt->imgs.height / 4 || lines - vertlines > lines / 2)) { if (cnt->conf.text_changes) { char tmp[80]; sprintf(tmp, "%d %d", lines, vertlines); draw_text(newimg, cnt->imgs.width, cnt->imgs.height, cnt->imgs.width - 10, 20, tmp, cnt->conf.text_scale); } return diffs; } return 0; } /** * alg_update_reference_frame * * Called from 'motion_loop' to calculate the reference frame * Moving objects are excluded from the reference frame for a certain * amount of time to improve detection. * * Parameters: * * cnt - current thread's context struct * action - UPDATE_REF_FRAME or RESET_REF_FRAME * */ #define ACCEPT_STATIC_OBJECT_TIME 10 /* Seconds */ #define EXCLUDE_LEVEL_PERCENT 20 void alg_update_reference_frame(struct context *cnt, int action) { int accept_timer = cnt->lastrate * ACCEPT_STATIC_OBJECT_TIME; int i, threshold_ref; int *ref_dyn = cnt->imgs.ref_dyn; unsigned char *image_virgin = cnt->imgs.image_vprvcy.image_norm; unsigned char *ref = cnt->imgs.ref; unsigned char *smartmask = cnt->imgs.smartmask_final; unsigned char *out = cnt->imgs.img_motion.image_norm; /* Match rate limit */ if (cnt->lastrate > 5) { accept_timer /= (cnt->lastrate / 3); } if (action == UPDATE_REF_FRAME) { /* Black&white only for better performance. */ threshold_ref = cnt->noise * EXCLUDE_LEVEL_PERCENT / 100; for (i = cnt->imgs.motionsize; i > 0; i--) { /* Exclude pixels from ref frame well below noise level. */ if (((int)(abs(*ref - *image_virgin)) > threshold_ref) && (*smartmask)) { if (*ref_dyn == 0) { /* Always give new pixels a chance. */ *ref_dyn = 1; } else if (*ref_dyn > accept_timer) { /* Include static Object after some time. */ *ref_dyn = 0; *ref = *image_virgin; } else if (*out) { (*ref_dyn)++; /* Motionpixel? Keep excluding from ref frame. */ } else { *ref_dyn = 0; /* Nothing special - release pixel. */ *ref = (*ref + *image_virgin) / 2; } } else { /* No motion: copy to ref frame. */ *ref_dyn = 0; /* Reset pixel */ *ref = *image_virgin; } ref++; image_virgin++; smartmask++; ref_dyn++; out++; } /* end for i */ } else { /* action == RESET_REF_FRAME - also used to initialize the frame at startup. */ /* Copy fresh image */ memcpy(cnt->imgs.ref, cnt->imgs.image_vprvcy.image_norm, cnt->imgs.size_norm); /* Reset static objects */ memset(cnt->imgs.ref_dyn, 0, cnt->imgs.motionsize * sizeof(*cnt->imgs.ref_dyn)); } } motion-release-4.6.0/src/alg.h000066400000000000000000000040761452402535500161630ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * alg.h * Detect changes in a video stream. * Copyright 2001 by Jeroen Vreeken (pe1rxq@amsat.org) */ #ifndef _INCLUDE_ALG_H #define _INCLUDE_ALG_H #include "motion.h" struct coord { int x; int y; int width; int height; int minx; int maxx; int miny; int maxy; }; struct segment { struct coord coord; int width; int height; int open; int count; }; void alg_locate_center_size(struct images *imgs, int width, int height, struct coord *cent); void alg_draw_location(struct coord *cent, struct images *imgs, int width, unsigned char *new, int style, int mode, int process_thisframe); void alg_draw_red_location(struct coord *cent, struct images *imgs, int width, unsigned char *new, int style, int mode, int process_thisframe); void alg_noise_tune(struct context *cnt, unsigned char *new); void alg_threshold_tune(struct context *cnt, int diffs, int motion); int alg_despeckle(struct context *cnt, int olddiffs); void alg_tune_smartmask(struct context *cnt); int alg_diff_standard(struct context *cnt, unsigned char *new); int alg_diff(struct context *cnt, unsigned char *new); int alg_lightswitch(struct context *cnt, int diffs); int alg_switchfilter(struct context *cnt, int diffs, unsigned char *newimg); void alg_update_reference_frame(struct context *cnt, int action); #endif /* _INCLUDE_ALG_H */ motion-release-4.6.0/src/conf.c000066400000000000000000003135711452402535500163430ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* ** ** conf.c ** ** Initially wrote conf.c as part of the drpoxy package ** thanks to Matthew Pratt and others for their additions. ** ** Copyright 1999 Jeroen Vreeken (pe1rxq@chello.nl) ** ** ** */ #include #include #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #define EXTENSION ".conf" struct config conf_template = { /* Overall system configuration parameters */ /* daemon is directly cast into the cnt context rather than conf */ .setup_mode = FALSE, .pid_file = NULL, .log_file = NULL, .log_level = LEVEL_DEFAULT+10, .log_type = NULL, .quiet = TRUE, .native_language = TRUE, .watchdog_tmo = 30, .watchdog_kill = 10, .camera_name = NULL, .camera_id = 0, .camera_dir = NULL, .target_dir = NULL, /* Capture device configuration parameters */ .video_device = DEF_VIDEO_DEVICE, .video_params = NULL, .auto_brightness = 0, .tuner_device = NULL, .roundrobin_frames = 1, .roundrobin_skip = 1, .roundrobin_switchfilter = FALSE, .netcam_url = NULL, .netcam_params = NULL, .netcam_high_url= NULL, .netcam_high_params = NULL, .netcam_userpass = NULL, .mmalcam_name = NULL, .mmalcam_params = NULL, /* Image processing configuration parameters */ .width = DEF_WIDTH, .height = DEF_HEIGHT, .framerate = DEF_MAXFRAMERATE, .minimum_frame_time = 0, .rotate = 0, .flip_axis = "none", .locate_motion_mode = "off", .locate_motion_style = "box", .text_left = NULL, .text_right = DEF_TIMESTAMP, .text_changes = FALSE, .text_scale = 1, .text_event = DEF_EVENTSTAMP, /* Motion detection configuration parameters */ .emulate_motion = FALSE, .pause = FALSE, .threshold = DEF_CHANGES, .threshold_maximum = 0, .threshold_tune = FALSE, .noise_level = DEF_NOISELEVEL, .noise_tune = TRUE, .despeckle_filter = NULL, .area_detect = NULL, .mask_file = NULL, .mask_privacy = NULL, .smart_mask_speed = 0, .lightswitch_percent = 0, .lightswitch_frames = 5, .minimum_motion_frames = 1, .event_gap = DEF_EVENT_GAP, .pre_capture = 0, .post_capture = 0, /* Script execution configuration parameters */ .on_event_start = NULL, .on_event_end = NULL, .on_picture_save = NULL, .on_motion_detected = NULL, .on_area_detected = NULL, .on_movie_start = NULL, .on_movie_end = NULL, .on_camera_lost = NULL, .on_camera_found = NULL, /* Picture output configuration parameters */ .picture_output = "off", .picture_output_motion = FALSE, .picture_type = "jpeg", .picture_quality = 75, .picture_exif = NULL, .picture_filename = DEF_IMAGEPATH, /* Snapshot configuration parameters */ .snapshot_interval = 0, .snapshot_filename = DEF_SNAPPATH, /* Movie output configuration parameters */ .movie_output = TRUE, .movie_output_motion = FALSE, .movie_max_time = 120, .movie_bps = 400000, .movie_quality = 60, .movie_codec = "mkv", .movie_duplicate_frames = FALSE, .movie_passthrough = FALSE, .movie_filename = DEF_MOVIEPATH, .movie_extpipe_use = FALSE, .movie_extpipe = NULL, /* Timelapse movie configuration parameters */ .timelapse_interval = 0, .timelapse_mode = DEF_TIMELAPSE_MODE, .timelapse_fps = 30, .timelapse_codec = "mpg", .timelapse_filename = DEF_TIMEPATH, /* Loopback device configuration parameters */ .video_pipe = NULL, .video_pipe_motion = NULL, /* Webcontrol configuration parameters */ .webcontrol_port = 0, .webcontrol_ipv6 = FALSE, .webcontrol_localhost = TRUE, .webcontrol_parms = 0, .webcontrol_interface = 0, .webcontrol_auth_method = 0, .webcontrol_authentication = NULL, .webcontrol_tls = FALSE, .webcontrol_cert = NULL, .webcontrol_key = NULL, .webcontrol_header_params = NULL, .webcontrol_lock_minutes = 5, .webcontrol_lock_attempts = 5, .webcontrol_lock_max_ips = 25, /* Live stream configuration parameters */ .stream_port = 0, .stream_localhost = TRUE, .stream_auth_method = 0, .stream_authentication = NULL, .stream_tls = FALSE, .stream_header_params = NULL, .stream_preview_scale = 25, .stream_preview_newline = FALSE, .stream_preview_method = 0, .stream_quality = 50, .stream_grey = FALSE, .stream_motion = FALSE, .stream_maxrate = 1, .stream_limit = 0, /* Database and SQL configuration parameters */ .database_type = NULL, .database_dbname = NULL, .database_host = "localhost", .database_port = 0, .database_user = NULL, .database_password = NULL, .database_busy_timeout = 0, .sql_log_picture = FALSE, .sql_log_snapshot = FALSE, .sql_log_movie = FALSE, .sql_log_timelapse = FALSE, .sql_query_start = NULL, .sql_query_stop = NULL, .sql_query = NULL }; /* Forward Declares */ static void malloc_strings(struct context *cnt); static void copy_bool(struct context *cnt, char *str, int val_ptr); static void copy_int(struct context *cnt, char *str, int val_ptr); static const char *print_bool(struct context **cnt, char **str,int parm, unsigned int threadnr); static const char *print_string(struct context **cnt,char **str, int parm, unsigned int threadnr); static const char *print_int(struct context **cnt, char **str, int parm, unsigned int threadnr); static const char *print_camera(struct context **cnt, char **str, int parm, unsigned int threadnr); static struct context **read_camera_dir(struct context **cnt, char *str, int val); static struct context **config_camera(struct context **cnt, const char *str, int val); static void usage(void); static void config_parms_intl(void); /* Pointer magic to determine relative addresses of variables to a struct context pointer */ #define CNT_OFFSET(varname) ((long)&((struct context *)NULL)->varname) #define CONF_OFFSET(varname) ((long)&((struct context *)NULL)->conf.varname) #define TRACK_OFFSET(varname) ((long)&((struct context *)NULL)->track.varname) /* The sequence of these within here determines how they are presented to user * Note daemon goes directly to cnt context rather than conf. * Descriptions are limited to one line and few to no references to values since * the motion_guide.html is our single source of documentation and historically * these descriptions were not updated with revisions. */ config_param config_params[] = { { "daemon", "############################################################\n" "# System control configuration parameters\n" "############################################################\n\n" "# Start in daemon (background) mode and release terminal.", 1, CNT_OFFSET(daemon), copy_bool, print_bool, WEBUI_LEVEL_ADVANCED }, { "setup_mode", "# Start in Setup-Mode, daemon disabled.", 0, CONF_OFFSET(setup_mode), copy_bool, print_bool, WEBUI_LEVEL_ADVANCED }, { "pid_file", "# File to store the process ID.", 1, CONF_OFFSET(pid_file), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "log_file", "# File to write logs messages into. If not defined stderr and syslog is used.", 1, CONF_OFFSET(log_file), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "log_level", "# Level of log messages [1..9] (EMG, ALR, CRT, ERR, WRN, NTC, INF, DBG, ALL).", 1, CONF_OFFSET(log_level), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "log_type", "# Filter to log messages by type (COR, STR, ENC, NET, DBL, EVT, TRK, VID, ALL).", 1, CONF_OFFSET(log_type), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "quiet", "# Do not sound beeps when detecting motion", 0, CONF_OFFSET(quiet), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "native_language", "# Native language support.", 1, CONF_OFFSET(native_language), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "watchdog_tmo", "# Watchdog timeout.", 1, CONF_OFFSET(watchdog_tmo), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "watchdog_kill", "# Watchdog kill.", 1, CONF_OFFSET(watchdog_kill), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "camera_name", "# User defined name for the camera.", 0, CONF_OFFSET(camera_name), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "camera_id", "# Numeric identifier for the camera.", 0, CONF_OFFSET(camera_id), copy_int, print_int, WEBUI_LEVEL_ADVANCED }, /* camera and camera_dir must be last in this list */ { "target_dir", "# Target directory for pictures, snapshots and movies", 0, CONF_OFFSET(target_dir), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "video_device", "# Video device (e.g. /dev/video0) to be used for capturing.", 0, CONF_OFFSET(video_device), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "video_params", "# Parameters to control video device. See motion_guide.html", 0, CONF_OFFSET(video_params), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "auto_brightness", "# The Motion method to use to change the brightness/exposure on video device.", 0, CONF_OFFSET(auto_brightness), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "tuner_device", "# Device name (e.g. /dev/tuner0) to be used for capturing when using tuner as source", 0, CONF_OFFSET(tuner_device), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "roundrobin_frames", "# Number of frames to capture in each roundrobin step", 0, CONF_OFFSET(roundrobin_frames), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "roundrobin_skip", "# Number of frames to skip before each roundrobin step", 0, CONF_OFFSET(roundrobin_skip), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "roundrobin_switchfilter", "# Try to filter out noise generated by roundrobin", 0, CONF_OFFSET(roundrobin_switchfilter), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "netcam_url", "# The full URL of the network camera stream.", 0, CONF_OFFSET(netcam_url), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "netcam_params", "# The parameters for the network camera.", 0, CONF_OFFSET(netcam_params), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "netcam_high_url", "# Optional high resolution URL for rtsp/rtmp cameras only.", 0, CONF_OFFSET(netcam_high_url), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "netcam_high_params", "# The parameters for the high resolution network camera.", 0, CONF_OFFSET(netcam_high_params), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "netcam_userpass", "# Username and password for network camera. Syntax username:password", 0, CONF_OFFSET(netcam_userpass), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "mmalcam_name", "# Name of mmal camera (e.g. vc.ril.camera for pi camera).", 0, CONF_OFFSET(mmalcam_name), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "mmalcam_params", "# Camera control parameters (see raspivid/raspistill tool documentation)", 0, CONF_OFFSET(mmalcam_params), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "width", "############################################################\n" "# Image Processing configuration parameters\n" "############################################################\n\n" "# Image width in pixels.", 0, CONF_OFFSET(width), copy_int, print_int, WEBUI_LEVEL_ADVANCED }, { "height", "# Image height in pixels.", 0, CONF_OFFSET(height), copy_int, print_int, WEBUI_LEVEL_ADVANCED }, { "framerate", "# Maximum number of frames to be captured per second.", 0, CONF_OFFSET(framerate), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "minimum_frame_time", "# Minimum time in seconds between capturing picture frames from the camera.", 0, CONF_OFFSET(minimum_frame_time), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "rotate", "# Number of degrees to rotate image.", 0, CONF_OFFSET(rotate), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "flip_axis", "# Flip image over a given axis", 0, CONF_OFFSET(flip_axis), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "locate_motion_mode", "# Draw a locate box around the moving object.", 0, CONF_OFFSET(locate_motion_mode), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "locate_motion_style", "# Set the look and style of the locate box.", 0, CONF_OFFSET(locate_motion_style), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "text_left", "# Text to be overlayed in the lower left corner of images", 0, CONF_OFFSET(text_left), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "text_right", "# Text to be overlayed in the lower right corner of images.", 0, CONF_OFFSET(text_right), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "text_changes", "# Overlay number of changed pixels in upper right corner of images.", 0, CONF_OFFSET(text_changes), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "text_scale", "# Scale factor for text overlayed on images.", 0, CONF_OFFSET(text_scale), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "text_event", "# The special event conversion specifier %C", 0, CONF_OFFSET(text_event), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "emulate_motion", "############################################################\n" "# Motion detection configuration parameters\n" "############################################################\n\n" "# Always save pictures and movies even if there was no motion.", 0, CONF_OFFSET(emulate_motion), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "pause", "# pause motion detection.", 0, CONF_OFFSET(pause), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "threshold", "# Threshold for number of changed pixels that triggers motion.", 0, CONF_OFFSET(threshold), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "threshold_maximum", "# The maximum threshold for number of changed pixels that triggers motion.", 0, CONF_OFFSET(threshold_maximum), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "threshold_tune", "# Enable tuning of the threshold down if possible.", 0, CONF_OFFSET(threshold_tune), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "noise_level", "# Noise threshold for the motion detection.", 0, CONF_OFFSET(noise_level), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "noise_tune", "# Automatically tune the noise threshold", 0, CONF_OFFSET(noise_tune), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "despeckle_filter", "# Despeckle the image using (E/e)rode or (D/d)ilate or (l)abel.", 0, CONF_OFFSET(despeckle_filter), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "area_detect", "# Area number used to trigger the on_area_detected script.", 0, CONF_OFFSET(area_detect), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "mask_file", "# Full path and file name for motion detection mask PGM file.", 0, CONF_OFFSET(mask_file), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "mask_privacy", "# Full path and file name for privacy mask PGM file.", 0, CONF_OFFSET(mask_privacy), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "smart_mask_speed", "# The value defining how slow or fast the smart motion mask created and used.", 0, CONF_OFFSET(smart_mask_speed), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "lightswitch_percent", "# Percentage of image that triggers a lightswitch detected.", 0, CONF_OFFSET(lightswitch_percent), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "lightswitch_frames", "# When lightswitch is detected, ignore this many frames", 0, CONF_OFFSET(lightswitch_frames), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "minimum_motion_frames", "# Number of images that must contain motion to trigger an event.", 0, CONF_OFFSET(minimum_motion_frames), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "event_gap", "# Gap in seconds of no motion detected that triggers the end of an event.", 0, CONF_OFFSET(event_gap), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "pre_capture", "# The number of pre-captured (buffered) pictures from before motion.", 0, CONF_OFFSET(pre_capture), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "post_capture", "# Number of frames to capture after motion is no longer detected.", 0, CONF_OFFSET(post_capture), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "on_event_start", "############################################################\n" "# Script execution configuration parameters\n" "############################################################\n\n" "# Command to be executed when an event starts.", 0, CONF_OFFSET(on_event_start), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "on_event_end", "# Command to be executed when an event ends.", 0, CONF_OFFSET(on_event_end), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "on_picture_save", "# Command to be executed when a picture is saved.", 0, CONF_OFFSET(on_picture_save), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "on_area_detected", "# Command to be executed when motion in a predefined area is detected", 0, CONF_OFFSET(on_area_detected), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "on_motion_detected", "# Command to be executed when motion is detected", 0, CONF_OFFSET(on_motion_detected), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "on_movie_start", "# Command to be executed when a movie file is created.", 0, CONF_OFFSET(on_movie_start), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "on_movie_end", "# Command to be executed when a movie file is closed.", 0, CONF_OFFSET(on_movie_end), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "on_camera_lost", "# Command to be executed when a camera can't be opened or if it is lost", 0, CONF_OFFSET(on_camera_lost), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "on_camera_found", "# Command to be executed when a camera that was lost has been found.", 0, CONF_OFFSET(on_camera_found), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "picture_output", "############################################################\n" "# Picture output configuration parameters\n" "############################################################\n\n" "# Output pictures when motion is detected", 0, CONF_OFFSET(picture_output), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "picture_output_motion", "# Output pictures with only the pixels moving object (ghost images)", 0, CONF_OFFSET(picture_output_motion), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "picture_type", "# Format for the output pictures.", 0, CONF_OFFSET(picture_type), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "picture_quality", "# The quality (in percent) to be used in the picture compression", 0, CONF_OFFSET(picture_quality), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "picture_exif", "# Text to include in a JPEG EXIF comment", 0, CONF_OFFSET(picture_exif), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "picture_filename", "# File name(without extension) for pictures relative to target directory", 0, CONF_OFFSET(picture_filename), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "snapshot_interval", "############################################################\n" "# Snapshot output configuration parameters\n" "############################################################\n\n" "# Make automated snapshot every N seconds", 0, CONF_OFFSET(snapshot_interval), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "snapshot_filename", "# File name(without extension) for snapshots relative to target directory", 0, CONF_OFFSET(snapshot_filename), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "movie_output", "############################################################\n" "# Movie output configuration parameters\n" "############################################################\n\n" "# Create movies of motion events.", 0, CONF_OFFSET(movie_output), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "movie_output_motion", "# Create movies of moving pixels of motion events.", 0, CONF_OFFSET(movie_output_motion), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "movie_max_time", "# Maximum length of movie in seconds.", 0, CONF_OFFSET(movie_max_time), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "movie_bps", "# The fixed bitrate to be used by the movie encoder. Ignore quality setting", 0, CONF_OFFSET(movie_bps), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "movie_quality", "# The encoding quality of the movie. (0=use bitrate. 1=worst quality, 100=best)", 0, CONF_OFFSET(movie_quality), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "movie_codec", "# Container/Codec to used for the movie. See motion_guide.html", 0, CONF_OFFSET(movie_codec), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "movie_duplicate_frames", "# Duplicate frames to achieve \"framerate\" fps.", 0, CONF_OFFSET(movie_duplicate_frames), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "movie_passthrough", "# Pass through from the camera to the movie without decode/encoding.", 0, CONF_OFFSET(movie_passthrough), copy_bool, print_bool, WEBUI_LEVEL_ADVANCED }, { "movie_filename", "# File name(without extension) for movies relative to target directory", 0, CONF_OFFSET(movie_filename), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "movie_extpipe_use", "# Use pipe and external encoder for creating movies.", 0, CONF_OFFSET(movie_extpipe_use), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "movie_extpipe", "# Full path and options for external encoder of movies from raw images", 0, CONF_OFFSET(movie_extpipe), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "timelapse_interval", "############################################################\n" "# Timelapse output configuration parameters\n" "############################################################\n\n" "# Interval in seconds between timelapse captures.", 0, CONF_OFFSET(timelapse_interval), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "timelapse_mode", "# Timelapse file rollover mode. See motion_guide.html for options and uses.", 0, CONF_OFFSET(timelapse_mode), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "timelapse_fps", "# Frame rate for timelapse playback", 0, CONF_OFFSET(timelapse_fps), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "timelapse_codec", "# Container/Codec for timelapse movie.", 0, CONF_OFFSET(timelapse_codec), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "timelapse_filename", "# File name(without extension) for timelapse movies relative to target directory", 0, CONF_OFFSET(timelapse_filename), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "video_pipe", "############################################################\n" "# Loopback pipe configuration parameters\n" "############################################################\n\n" "# v4l2 loopback device to receive normal images", 0, CONF_OFFSET(video_pipe), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "video_pipe_motion", "# v4l2 loopback device to receive motion images", 0, CONF_OFFSET(video_pipe_motion), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "webcontrol_port", "############################################################\n" "# Webcontrol configuration parameters\n" "############################################################\n\n" "# Port number used for the webcontrol.", 1, CONF_OFFSET(webcontrol_port), copy_int, print_int, WEBUI_LEVEL_ADVANCED }, { "webcontrol_ipv6", "# Enable IPv6 addresses.", 0, CONF_OFFSET(webcontrol_ipv6), copy_bool, print_bool, WEBUI_LEVEL_ADVANCED }, { "webcontrol_localhost", "# Restrict webcontrol connections to the localhost.", 1, CONF_OFFSET(webcontrol_localhost), copy_bool, print_bool, WEBUI_LEVEL_ADVANCED }, { "webcontrol_parms", "# Type of configuration options to allow via the webcontrol.", 1, CONF_OFFSET(webcontrol_parms), copy_int, print_int, WEBUI_LEVEL_NEVER }, { "webcontrol_interface", "# Method that webcontrol should use for interface with user.", 1, CONF_OFFSET(webcontrol_interface), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "webcontrol_auth_method", "# The authentication method for the webcontrol", 0, CONF_OFFSET(webcontrol_auth_method), copy_int, print_int, WEBUI_LEVEL_RESTRICTED }, { "webcontrol_authentication", "# Authentication string for the webcontrol. Syntax username:password", 1, CONF_OFFSET(webcontrol_authentication), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "webcontrol_tls", "# Use ssl / tls for the webcontrol", 0, CONF_OFFSET(webcontrol_tls), copy_bool, print_bool, WEBUI_LEVEL_RESTRICTED }, { "webcontrol_cert", "# Full path and file name of the certificate file for tls", 1, CONF_OFFSET(webcontrol_cert), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "webcontrol_key", "# Full path and file name of the key file for tls", 1, CONF_OFFSET(webcontrol_key), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "webcontrol_header_params", "# The header parameters for webcontrol", 0, CONF_OFFSET(webcontrol_header_params), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "webcontrol_lock_minutes", "# The number of minutes to lock out a IP for failed authentication attempts", 0, CONF_OFFSET(webcontrol_lock_minutes), copy_int, print_int, WEBUI_LEVEL_RESTRICTED }, { "webcontrol_lock_attempts", "# The number failed authentication attempts before locking out a IP address", 0, CONF_OFFSET(webcontrol_lock_attempts), copy_int, print_int, WEBUI_LEVEL_RESTRICTED }, { "webcontrol_lock_max_ips", "# The maximum number of IPs to track at once for locking out.", 0, CONF_OFFSET(webcontrol_lock_max_ips), copy_int, print_int, WEBUI_LEVEL_RESTRICTED }, { "stream_port", "############################################################\n" "# Live stream configuration parameters\n" "############################################################\n\n" "# The port number for the live stream.", 0, CONF_OFFSET(stream_port), copy_int, print_int, WEBUI_LEVEL_ADVANCED }, { "stream_localhost", "# Restrict stream connections to the localhost.", 0, CONF_OFFSET(stream_localhost), copy_bool, print_bool, WEBUI_LEVEL_ADVANCED }, { "stream_auth_method", "# Authentication method for live stream.", 0, CONF_OFFSET(stream_auth_method), copy_int, print_int, WEBUI_LEVEL_RESTRICTED }, { "stream_authentication", "# The authentication string for the stream. Syntax username:password", 1, CONF_OFFSET(stream_authentication), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "stream_tls", "# Use ssl / tls for stream.", 0, CONF_OFFSET(stream_tls), copy_bool, print_bool, WEBUI_LEVEL_RESTRICTED }, { "stream_header_params", "# The header parameters for the stream", 0, CONF_OFFSET(stream_header_params), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "stream_preview_scale", "# Percentage to scale the stream image on the webcontrol.", 0, CONF_OFFSET(stream_preview_scale), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "stream_preview_newline", "# Have the stream image start on a new line of the webcontrol", 0, CONF_OFFSET(stream_preview_newline), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "stream_preview_method", "# Method for showing stream on webcontrol.", 0, CONF_OFFSET(stream_preview_method), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "stream_quality", "# Quality of the jpeg images produced for stream.", 0, CONF_OFFSET(stream_quality), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "stream_grey", "# Provide the stream images in black and white", 0, CONF_OFFSET(stream_grey), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "stream_motion", "# Output frames at 1 fps when no motion is detected.", 0, CONF_OFFSET(stream_motion), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "stream_maxrate", "# Maximum framerate of images provided for stream", 0, CONF_OFFSET(stream_maxrate), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "stream_limit", "# Limit the number of images per connection", 0, CONF_OFFSET(stream_limit), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "database_type", "############################################################\n" "# Database and SQL Configuration parameters\n" "############################################################\n\n" "# The type of database being used if any.", 0, CONF_OFFSET(database_type), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "database_dbname", "# Database name to use. For sqlite3, the full path and name.", 0, CONF_OFFSET(database_dbname), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "database_host", "# The host on which the database is located", 0, CONF_OFFSET(database_host), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "database_port", "# Port used by the database.", 0, CONF_OFFSET(database_port), copy_int, print_int, WEBUI_LEVEL_ADVANCED }, { "database_user", "# User account name for database.", 0, CONF_OFFSET(database_user), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "database_password", "# User password for database.", 0, CONF_OFFSET(database_password), copy_string, print_string, WEBUI_LEVEL_RESTRICTED }, { "database_busy_timeout", "# Database wait for unlock time", 0, CONF_OFFSET(database_busy_timeout), copy_int, print_int, WEBUI_LEVEL_ADVANCED }, { "sql_log_picture", "# Log to the database when creating motion triggered image file", 0, CONF_OFFSET(sql_log_picture), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "sql_log_snapshot", "# Log to the database when creating a snapshot image file", 0, CONF_OFFSET(sql_log_snapshot), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "sql_log_movie", "# Log to the database when creating motion triggered movie file", 0, CONF_OFFSET(sql_log_movie), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "sql_log_timelapse", "# Log to the database when creating timelapse movie file", 0, CONF_OFFSET(sql_log_timelapse), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "sql_query_start", "# SQL query at event start. See motion_guide.html", 0, CONF_OFFSET(sql_query_start), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "sql_query_stop", "# SQL query at event stop. See motion_guide.html", 0, CONF_OFFSET(sql_query_stop), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "sql_query", "# SQL query string that is sent to the database. See motion_guide.html", 0, CONF_OFFSET(sql_query), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { "track_type", "############################################################\n" "# Tracking configuration parameters\n" "############################################################\n\n" "# Method used by tracking camera. See motion_guide.html", 0, TRACK_OFFSET(type), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_auto", "# Enable auto tracking", 0, TRACK_OFFSET(active), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "track_port", "# Serial port of motor", 0, TRACK_OFFSET(port), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "track_motorx", "# Motor number for x-axis", 0, TRACK_OFFSET(motorx), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_motorx_reverse", "# Set motorx reverse", 0, TRACK_OFFSET(motorx_reverse), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "track_motory", "# Motor number for y-axis", 0, TRACK_OFFSET(motory), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_motory_reverse", "# Set motory reverse", 0, TRACK_OFFSET(motory_reverse), copy_bool, print_bool, WEBUI_LEVEL_LIMITED }, { "track_maxx", "# Maximum value on x-axis", 0, TRACK_OFFSET(maxx), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_minx", "# Minimum value on x-axis", 0, TRACK_OFFSET(minx), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_maxy", "# Maximum value on y-axis", 0, TRACK_OFFSET(maxy), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_miny", "# Minimum value on y-axis", 0, TRACK_OFFSET(miny), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_homex", "# Center value on x-axis", 0, TRACK_OFFSET(homex), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_homey", "# Center value on y-axis", 0, TRACK_OFFSET(homey), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_iomojo_id", "# ID of an iomojo camera if used", 0, TRACK_OFFSET(iomojo_id), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_step_angle_x", "# Angle in degrees the camera moves per step on the X-axis with auto-track", 0, TRACK_OFFSET(step_angle_x), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_step_angle_y", "# Angle in degrees the camera moves per step on the Y-axis with auto-track.", 0, TRACK_OFFSET(step_angle_y), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_move_wait", "# Delay to wait for after tracking movement as number of picture frames.", 0, TRACK_OFFSET(move_wait), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_speed", "# Speed to set the motor to (stepper motor option)", 0, TRACK_OFFSET(speed), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_stepsize", "# Number of steps to make (stepper motor option)", 0, TRACK_OFFSET(stepsize), copy_int, print_int, WEBUI_LEVEL_LIMITED }, { "track_generic_move", "# Command to execute to move a camera in generic tracking mode", 0, TRACK_OFFSET(generic_move), copy_string, print_string, WEBUI_LEVEL_LIMITED }, { "camera", "##############################################################\n" "# Camera config files - One for each camera.\n" "##############################################################", 1, 0, NULL, print_camera, WEBUI_LEVEL_ADVANCED }, /* using a conf.d style camera addition */ { "camera_dir", "##############################################################\n" "# Directory to read '.conf' files for cameras.\n" "##############################################################", 1, CONF_OFFSET(camera_dir), copy_string, print_string, WEBUI_LEVEL_ADVANCED }, { NULL, NULL, 0, 0, NULL, NULL, 0 } }; /* * Array of deprecated config options: * When deprecating an option, remove it from above (config_params array) * and create an entry in this array of name, last version, info, * and (if applicable) a replacement conf value and copy funcion. * Upon reading a deprecated config option, a warning will be logged * with the given information and last version it was used in. * If set, the given value will be copied into the conf value * for backwards compatibility. */ dep_config_param dep_config_params[] = { { "thread", "3.4.1", "The \"thread\" option has been replaced by the \"camera\"", 0, "camera", copy_string }, { "ffmpeg_timelapse", "4.0.1", "\"ffmpeg_timelapse\" replaced with \"timelapse_interval\"", CONF_OFFSET(timelapse_interval), "timelapse_interval", copy_int }, { "ffmpeg_timelapse_mode", "4.0.1", "\"ffmpeg_timelapse_mode\" replaced with \"timelapse_mode\"", CONF_OFFSET(timelapse_mode), "timelapse_mode", copy_string }, { "brightness", "4.1.1", "\"brightness\" replaced with \"video_params\"", CONF_OFFSET(video_params), "video_params", NULL }, { "contrast", "4.1.1", "\"contrast\" replaced with \"video_params\"", CONF_OFFSET(video_params), "video_params", NULL }, { "saturation", "4.1.1", "\"saturation\" replaced with \"video_params\"", CONF_OFFSET(video_params), "video_params", NULL }, { "hue", "4.1.1", "\"hue\" replaced with \"video_params\"", CONF_OFFSET(video_params), "video_params", NULL }, { "power_line_frequency", "4.1.1", "\"power_line_frequency\" replaced with \"video_params\"", CONF_OFFSET(video_params), "video_params", NULL }, { "text_double", "4.1.1", "\"text_double\" replaced with \"text_scale\"", CONF_OFFSET(text_scale), "text_scale", NULL }, { "webcontrol_html_output", "4.1.1", "\"webcontrol_html_output\" replaced with \"webcontrol_interface\"", CONF_OFFSET(webcontrol_interface), "webcontrol_interface", NULL }, { "lightswitch", "4.1.1", "\"lightswitch\" replaced with \"lightswitch_percent\"", CONF_OFFSET(lightswitch_percent), "lightswitch_percent", copy_int }, { "ffmpeg_output_movies", "4.1.1", "\"ffmpeg_output_movies\" replaced with \"movie_output\"", CONF_OFFSET(movie_output), "movie_output", copy_bool }, { "ffmpeg_output_debug_movies", "4.1.1", "\"ffmpeg_output_debug_movies\" replaced with \"movie_output_motion\"", CONF_OFFSET(movie_output_motion), "movie_output_motion", copy_bool }, { "max_movie_time", "4.1.1", "\"max_movie_time\" replaced with \"movie_max_time\"", CONF_OFFSET(movie_max_time), "movie_max_time", copy_int }, { "ffmpeg_bps", "4.1.1", "\"ffmpeg_bps\" replaced with \"movie_bps\"", CONF_OFFSET(movie_bps), "movie_bps", copy_int }, { "ffmpeg_variable_bitrate", "4.1.1", "\"ffmpeg_variable_bitrate\" replaced with \"movie_quality\"", CONF_OFFSET(movie_quality), "movie_quality", copy_int }, { "ffmpeg_video_codec", "4.1.1", "\"ffmpeg_video_codec\" replaced with \"movie_codec\"", CONF_OFFSET(movie_codec), "movie_codec", copy_string }, { "ffmpeg_duplicate_frames", "4.1.1", "\"ffmpeg_duplicate_frames\" replaced with \"movie_duplicate_frames\"", CONF_OFFSET(movie_duplicate_frames), "movie_duplicate_frames", copy_bool }, { "ffmpeg_passthrough", "4.1.1", "\"ffmpeg_passthrough\" replaced with \"movie_passthrough\"", CONF_OFFSET(movie_passthrough), "movie_passthrough", copy_bool }, { "use_extpipe", "4.1.1", "\"use_extpipe\" replaced with \"movie_extpipe_use\"", CONF_OFFSET(movie_extpipe_use), "movie_extpipe_use", copy_bool }, { "extpipe", "4.1.1", "\"extpipe\" replaced with \"movie_extpipe\"", CONF_OFFSET(movie_extpipe), "movie_extpipe", copy_string }, { "output_pictures", "4.1.1", "\"output_pictures\" replaced with \"picture_output\"", CONF_OFFSET(picture_output), "picture_output", copy_string }, { "output_debug_pictures", "4.1.1", "\"output_debug_pictures\" replaced with \"picture_output_motion\"", CONF_OFFSET(picture_output_motion), "picture_output_motion", copy_bool }, { "quality", "4.1.1", "\"quality\" replaced with \"picture_quality\"", CONF_OFFSET(picture_quality), "picture_quality", copy_int }, { "exif_text", "4.1.1", "\"exif_text\" replaced with \"picture_exif\"", CONF_OFFSET(picture_exif), "picture_exif", copy_string }, { "motion_video_pipe", "4.1.1", "\"motion_video_pipe\" replaced with \"video_pipe_motion\"", CONF_OFFSET(video_pipe_motion), "video_pipe_motion", copy_string }, { "ipv6_enabled", "4.1.1", "\"ipv6_enabled\" replaced with \"webcontrol_ipv6\"", CONF_OFFSET(webcontrol_ipv6), "webcontrol_ipv6", copy_bool }, { "switchfilter", "4.1.1", "\"switchfilter\" replaced with \"roundrobin_switchfilter\"", CONF_OFFSET(roundrobin_switchfilter), "roundrobin_switchfilter", copy_bool }, { "logfile", "4.1.1", "\"logfile\" replaced with \"log_file\"", CONF_OFFSET(log_file), "log_file", copy_string }, { "process_id_file", "4.1.1", "\"process_id_file\" replaced with \"pid_file\"", CONF_OFFSET(pid_file), "pid_file", copy_string }, { "vid_control_params", "4.3.2", "\"vid_control_params\" replaced with \"video_params\"", CONF_OFFSET(video_params), "video_params", NULL }, { "v4l2_palette", "4.3.2", "\"v4l2_palette\" replaced with \"video_params\"", CONF_OFFSET(video_params), "video_params", NULL }, { "input", "4.3.2", "\"input\" replaced with \"video_params\"", CONF_OFFSET(video_params), "video_params", NULL }, { "norm", "4.3.2", "\"norm\" replaced with \"video_params\"", CONF_OFFSET(video_params), "video_params", NULL }, { "frequency", "4.3.2", "\"frequency\" replaced with \"video_params\"", CONF_OFFSET(video_params), "video_params", NULL }, { "rtsp_uses_tcp", "4.3.2", "\"rtsp_uses_tcp\" replaced with \"netcam_params\"", CONF_OFFSET(netcam_params), "netcam_params", NULL }, { "netcam_use_tcp", "4.3.2", "\"netcam_use_tcp\" replaced with \"netcam_params\"", CONF_OFFSET(netcam_params), "netcam_params", NULL }, { "netcam_rate", "4.3.2", "\"netcam_rate\" replaced with \"netcam_params\"", CONF_OFFSET(netcam_params), "netcam_params", NULL }, { "netcam_ratehigh", "4.3.2", "\"netcam_ratehigh\" replaced with \"netcam_params\"", CONF_OFFSET(netcam_params), "netcam_params", NULL }, { "netcam_decoder", "4.3.2", "\"netcam_decoder\" replaced with \"netcam_params\"", CONF_OFFSET(netcam_params), "netcam_params", NULL }, { "netcam_proxy", "4.3.2", "\"netcam_proxy\" replaced with \"netcam_params\"", CONF_OFFSET(netcam_params), "netcam_params", NULL }, { "netcam_keepalive", "4.3.2", "\"netcam_keepalive\" replaced with \"netcam_params\"", CONF_OFFSET(netcam_params), "netcam_params", NULL }, { "netcam_tolerant_check", "4.3.2", "\"netcam_tolerant_check\" replaced with \"netcam_params\"", CONF_OFFSET(netcam_params), "netcam_params", NULL }, { "videodevice", "4.3.2", "\"videodevice\" replaced with \"video_device\"", CONF_OFFSET(video_device), "video_device", copy_string }, { "tunerdevice", "4.3.2", "\"tunerdevice\" replaced with \"tuner_device\"", CONF_OFFSET(tuner_device), "tuner_device", copy_string }, { "mmalcam_control_params", "4.3.2", "\"mmalcam_control_params\" replaced with \"mmalcam_params\"", CONF_OFFSET(mmalcam_params), "mmalcam_params", copy_string }, { "netcam_highres", "4.3.2", "\"netcam_highres\" replaced with \"netcam_high_url\"", CONF_OFFSET(netcam_high_url), "netcam_high_url", copy_string }, { "webcontrol_cors_header", "4.3.2", "\"webcontrol_cors_header\" replaced with \"webcontrol_header_params\"", CONF_OFFSET(webcontrol_header_params), "webcontrol_header_params", NULL }, { "stream_cors_header", "4.3.2", "\"stream_cors_header\" replaced with \"stream_header_params\"", CONF_OFFSET(stream_header_params), "stream_header_params", NULL }, { NULL, NULL, NULL, 0, NULL, NULL} }; /** * copy_bool * Assigns a config option to a new boolean value. */ static void copy_bool(struct context *cnt, char *str, int val_ptr) { void *tmp; tmp = (char *)cnt + (int)val_ptr; if (mystreq(str, "1") || mystrceq(str, "yes") || mystrceq(str, "on")) { *((int *)tmp) = 1; } else { *((int *)tmp) = 0; } } /** * copy_int * Assigns a config option to a new integer value. */ static void copy_int(struct context *cnt, char *str, int val_ptr) { void *tmp; tmp = (char *)cnt + val_ptr; if (mystrceq(str, "yes") || mystrceq(str, "on")) { *((int *)tmp) = 1; } else if (mystrceq(str, "no") || mystrceq(str, "off")) { *((int *)tmp) = 0; } else { *((int *)tmp) = atoi(str); } } /** * copy_string * Assigns a new string value to a config option. */ void copy_string(struct context *cnt, char *str, int val_ptr) { char **tmp; tmp = (char **)((char *)cnt + val_ptr); if (*tmp != NULL) { free(*tmp); *tmp = NULL; } if (str != NULL) { if (strlen(str) > 0) { *tmp = mymalloc(strlen(str)+1); sprintf(*tmp,"%s",str); } } } /** * copy_video_params * Assign old values into new config option. */ static void copy_video_params(struct context *cnt, char *config_val, int config_indx) { int indx, parmval; struct params_context *params; struct params_context *params_depr; if (config_val == NULL) { return; } /* If the depreciated option is the default, then just return */ parmval = atoi(config_val); if (mystreq(dep_config_params[config_indx].name,"power_line_frequency") && (parmval == -1)) { return; } if ((mystreq(dep_config_params[config_indx].name,"brightness") || mystreq(dep_config_params[config_indx].name,"contrast") || mystreq(dep_config_params[config_indx].name,"saturation") || mystreq(dep_config_params[config_indx].name,"hue")) && (parmval == 0)) { return; } params = mymalloc(sizeof(struct params_context)); util_parms_parse(params, cnt->conf.video_params, TRUE); if (mystreq(dep_config_params[config_indx].name,"power_line_frequency")) { util_parms_add_update(params, "power line frequency", config_val); } else if (mystreq(dep_config_params[config_indx].name,"v4l2_palette")) { util_parms_add_update(params, "palette", config_val); } else if (mystreq(dep_config_params[config_indx].name,"vid_control_params")) { params_depr = mymalloc(sizeof(struct params_context)); util_parms_parse(params_depr, config_val, TRUE); for (indx = 0; indx < params_depr->params_count; indx++) { util_parms_add_update(params , params_depr->params_array[indx].param_name , params_depr->params_array[indx].param_value); } util_parms_free(params_depr); free(params_depr); } else { util_parms_add_update(params, dep_config_params[config_indx].name, config_val); } util_parms_update(params, cnt, "video_params"); util_parms_free(params); free(params); return; } /** * copy_netcam_params * Assigns a new string value to a config option. */ static void copy_netcam_params(struct context *cnt, char *config_val, int config_indx) { struct params_context *params; if (config_val == NULL) { return; } if (mystreq(dep_config_params[config_indx].name,"netcam_ratehigh")) { params = mymalloc(sizeof(struct params_context)); util_parms_parse(params, cnt->conf.netcam_high_params, TRUE); util_parms_add_update(params, "capture_rate", config_val); util_parms_update(params, cnt, "netcam_high_params"); util_parms_free(params); free(params); } else { params = mymalloc(sizeof(struct params_context)); util_parms_parse(params, cnt->conf.netcam_params, TRUE); if (mystreq(dep_config_params[config_indx].name,"netcam_use_tcp") || mystreq(dep_config_params[config_indx].name,"rtsp_uses_tcp")) { if (mystrceq(config_val,"on")) { util_parms_add_update(params, "rtsp_transport", "tcp"); } else { util_parms_add_update(params, "rtsp_transport", "udp"); } } else if (mystreq(dep_config_params[config_indx].name,"netcam_decoder")) { util_parms_add_update(params, "decoder",config_val); } else if (mystreq(dep_config_params[config_indx].name,"netcam_rate")) { util_parms_add_update(params, "capture_rate", config_val); } else if (mystreq(dep_config_params[config_indx].name,"netcam_proxy")) { util_parms_add_update(params, "proxy", config_val); } else if (mystreq(dep_config_params[config_indx].name,"netcam_keepalive")) { util_parms_add_update(params, "keepalive", config_val); } else if (mystreq(dep_config_params[config_indx].name,"netcam_tolerant_check")) { util_parms_add_update(params, "tolerant_check", config_val); } util_parms_update(params, cnt, "netcam_params"); util_parms_free(params); free(params); } return; } /** * copy_webcontrol_header * Assigns a new string value to a config option. */ static void copy_webcontrol_header(struct context *cnt, char *config_val) { struct params_context *params; if (config_val == NULL) { return; } params = mymalloc(sizeof(struct params_context)); util_parms_parse(params, cnt->conf.webcontrol_header_params, TRUE); util_parms_add_update(params, "Access-Control-Allow-Origin", config_val); util_parms_update(params, cnt, "webcontrol_header_params"); util_parms_free(params); free(params); return; } /** * copy_stream_header * Assigns a new string value to a config option. */ static void copy_stream_header(struct context *cnt, char *config_val) { struct params_context *params; if (config_val == NULL) { return; } params = mymalloc(sizeof(struct params_context)); util_parms_parse(params, cnt->conf.stream_header_params, TRUE); util_parms_add_update(params, "Access-Control-Allow-Origin", config_val); util_parms_update(params, cnt, "stream_header_params"); util_parms_free(params); free(params); return; } /** * copy_text_double * Converts the bool of text_double to a 1 or 2 in text_scale */ static void copy_text_double(struct context *cnt, char *config_val) { if (mystreq(config_val, "1") || mystrceq(config_val, "yes") || mystrceq(config_val, "on")) { cnt->conf.text_scale = 2; } else { cnt->conf.text_scale = 1; } return; } /** * copy_html_output * Converts the webcontrol_html_output to the webcontrol_interface option. */ static void copy_html_output(struct context *cnt, char *config_val) { if (mystreq(config_val, "1") || mystrceq(config_val, "yes") || mystrceq(config_val, "on")) { cnt->conf.webcontrol_interface = 0; } else { cnt->conf.webcontrol_interface = 1; } return; } /** * conf_cmdline * Sets the conf struct options as defined by the Command-line. * Any option already set from a config file are overridden. * * Returns nothing. */ static void conf_cmdline(struct context *cnt, int thread) { struct config *conf = &cnt->conf; int c; while ((c = getopt(conf->argc, conf->argv, "bc:d:hmns?p:k:l:")) != EOF) { switch (c) { case 'c': if (thread == -1) { strcpy(cnt->conf_filename, optarg); } break; case 'b': cnt->daemon = 1; break; case 'n': cnt->daemon = 0; break; case 's': conf->setup_mode = 1; break; case 'd': /* No validation - just take what user gives. */ if (thread == -1) { cnt->log_level = (unsigned int)atoi(optarg); } break; case 'k': if (thread == -1) { strncpy(cnt->log_type_str, optarg, sizeof(cnt->log_type_str) - 1); cnt->log_type_str[sizeof(cnt->log_type_str) - 1] = '\0'; } break; case 'p': if (thread == -1) { strncpy(cnt->pid_file, optarg, sizeof(cnt->pid_file) - 1); cnt->pid_file[sizeof(cnt->pid_file) - 1] = '\0'; } break; case 'l': if (thread == -1) { strncpy(cnt->log_file, optarg, sizeof(cnt->log_file) - 1); cnt->log_file[sizeof(cnt->log_file) - 1] = '\0'; } break; case 'm': cnt->pause = 1; break; case 'h': case '?': default: usage(); exit(1); } } optind = 1; } /** * conf_cmdparse * Sets a config option given by 'cmd' to the value given by 'arg1'. * Based on the name of the option it searches through the struct 'config_params' * for an option where the config_params[i].param_name matches the option. * By calling the function pointed to by config_params[i].copy the option gets * assigned. * * Returns context struct. */ struct context **conf_cmdparse(struct context **cnt, char *param_name, char *param_val) { int indx; if (param_name == NULL) { return cnt; } indx = 0; while (config_params[indx].param_name != NULL) { if (mystrceq(param_name, config_params[indx].param_name)) { if (mystreq(param_name, "camera")) { cnt = config_camera(cnt, param_val, config_params[indx].conf_value); } else if (mystreq(param_name, "camera_dir")) { cnt = read_camera_dir(cnt, param_val, config_params[indx].conf_value); } else { config_params[indx].copy(*cnt, param_val, config_params[indx].conf_value); } return cnt; } indx++; } /* Now check deprecated options */ indx = 0; while (dep_config_params[indx].name != NULL) { if (mystreq(param_name, dep_config_params[indx].name)) { MOTION_LOG(ALR, TYPE_ALL, NO_ERRNO, _("%s after version %s") , dep_config_params[indx].info , dep_config_params[indx].last_version); if (mystreq(dep_config_params[indx].name,"brightness") || mystreq(dep_config_params[indx].name,"contrast") || mystreq(dep_config_params[indx].name,"saturation") || mystreq(dep_config_params[indx].name,"hue") || mystreq(dep_config_params[indx].name,"power_line_frequency") || mystreq(dep_config_params[indx].name,"v4l2_palette") || mystreq(dep_config_params[indx].name,"input") || mystreq(dep_config_params[indx].name,"norm") || mystreq(dep_config_params[indx].name,"frequency") || mystreq(dep_config_params[indx].name,"vid_control_params")) { copy_video_params(*cnt, param_val, indx); } else if (mystreq(dep_config_params[indx].name,"netcam_decoder") || mystreq(dep_config_params[indx].name,"netcam_use_tcp") || mystreq(dep_config_params[indx].name,"rtsp_uses_tcp") || mystreq(dep_config_params[indx].name,"netcam_rate") || mystreq(dep_config_params[indx].name,"netcam_ratehigh") || mystreq(dep_config_params[indx].name,"netcam_proxy") || mystreq(dep_config_params[indx].name,"netcam_tolerant_check") || mystreq(dep_config_params[indx].name,"netcam_keepalive")) { copy_netcam_params(*cnt, param_val, indx); } else if (mystreq(dep_config_params[indx].name,"webcontrol_cors_header")) { copy_webcontrol_header(*cnt, param_val); } else if (mystreq(dep_config_params[indx].name,"stream_cors_header")) { copy_stream_header(*cnt, param_val); } else if (mystreq(dep_config_params[indx].name,"text_double")) { copy_text_double(*cnt, param_val); } else if (mystreq(dep_config_params[indx].name,"webcontrol_html_output")) { copy_html_output(*cnt, param_val); } else if (mystreq(dep_config_params[indx].name,"thread")) { cnt = config_camera(cnt, param_val, dep_config_params[indx].conf_value); } else if (dep_config_params[indx].copy != NULL) { dep_config_params[indx].copy(*cnt, param_val, dep_config_params[indx].conf_value); } return cnt; } indx++; } /* If we get here, it's unknown to us. */ MOTION_LOG(ALR, TYPE_ALL, NO_ERRNO, _("Unknown config option \"%s\""), param_name); return cnt; } /** * conf_process * Walks through an already open config file line by line * Any line starting with '#' or ';' or empty lines are ignored as a comments. * Any non empty line is processed so that the first word is the name of an option 'cmd' * and the rest of the line is the argument 'arg1' * White space before the first word, between option and argument and end of the line * is discarded. A '=' between option and first word in argument is also discarded. * Quotation marks round the argument are also discarded. * For each option/argument pair the function conf_cmdparse is called which takes * care of assigning the value to the option in the config structures. * * Returns context struct. */ static struct context **conf_process(struct context **cnt, FILE *fp) { /* Process each line from the config file. */ char line[PATH_MAX], *cmd = NULL, *arg1 = NULL; char *beg = NULL, *end = NULL; while (fgets(line, PATH_MAX-1, fp)) { if (!(line[0] == '#' || line[0] == ';' || strlen(line) < 2)) { /* skipcomment */ arg1 = NULL; /* Trim white space and any CR or LF at the end of the line. */ end = line + strlen(line) - 1; /* Point to the last non-null character in the string. */ while (end >= line && (*end == ' ' || *end == '\t' || *end == '\n' || *end == '\r')) { end--; } *(end+1) = '\0'; /* If line is only whitespace we continue to the next line. */ if (strlen(line) == 0) { continue; } /* Trim leading whitespace from the line and find command. */ beg = line; while (*beg == ' ' || *beg == '\t') { beg++; } cmd = beg; /* Command starts here. */ while (*beg != ' ' && *beg != '\t' && *beg != '=' && *beg != '\0') { beg++; } *beg = '\0'; /* Command string terminates here. */ /* Trim space between command and argument. */ beg++; if (strlen(beg) > 0) { while (*beg == ' ' || *beg == '\t' || *beg == '=' || *beg == '\n' || *beg == '\r') { beg++; } /* * If argument is in "" we will strip them off * It is important that we can use "" so that we can use * leading spaces in text_left and text_right. */ /* For the config values of 'params' we leave on the quotes. * These parameters use the util_parms_parse routine that * will strip away the quotes if they are there */ if (strstr(cmd, "params") == NULL) { if ((beg[0] == '"' && beg[strlen(beg)-1] == '"') || (beg[0] == '\'' && beg[strlen(beg)-1] == '\'')) { beg[strlen(beg)-1] = '\0'; beg++; } } arg1 = beg; /* Argument starts here */ } /* Else arg1 stays null pointer */ cnt = conf_cmdparse(cnt, cmd, arg1); } } return cnt; } /** * conf_print * Is used to write out the config file(s) motion.conf and any camera * config files. The function is called when using http remote control. * * Returns nothing. */ void conf_print(struct context **cnt) { const char *retval; char *val; unsigned int i, thread; FILE *conffile; for (thread = 0; cnt[thread]; thread++) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Writing config file to %s") ,cnt[thread]->conf_filename); conffile = fopen(cnt[thread]->conf_filename, "we"); if (!conffile) { continue; } char timestamp[32]; time_t now = time(0); strftime(timestamp, 32, "%Y-%m-%dT%H:%M:%S", localtime(&now)); fprintf(conffile, "# %s\n", cnt[thread]->conf_filename); fprintf(conffile, "#\n# This config file was generated by motion " VERSION "\n"); fprintf(conffile, "# at %s\n", timestamp); fprintf(conffile, "\n\n"); for (i = 0; config_params[i].param_name; i++) { retval = config_params[i].print(cnt, NULL, i, thread); /* If config parameter has a value (not NULL) print it to the config file. */ if (retval) { fprintf(conffile, "%s\n", config_params[i].param_help); /* * If the option is a text_* and first char is a space put * quotation marks around to allow leading spaces. */ if (strncmp(config_params[i].param_name, "text", 4) || strncmp(retval, " ", 1)) { fprintf(conffile, "%s %s\n\n", config_params[i].param_name, retval); } else { fprintf(conffile, "%s \"%s\"\n\n", config_params[i].param_name, retval); } } else { val = NULL; config_params[i].print(cnt, &val, i, thread); /* * It can either be a camera file parameter or a disabled parameter. * If it is a camera parameter write it out. * Else write the disabled option to the config file but with a * comment mark in front of the parameter name. */ if (val) { fprintf(conffile, "%s\n", config_params[i].param_help); if (strlen(val) > 0) { fprintf(conffile, "%s\n", val); } else { fprintf(conffile, "; camera %s/camera1.conf\n", sysconfdir); } free(val); } else if (thread == 0) { char value[PATH_MAX]; /* The 'camera_dir' option should keep the installed default value */ if (!strncmp(config_params[i].param_name, "camera_dir", 10)) { sprintf(value, "%s", sysconfdir"/conf.d"); } else { sprintf(value, "%s", "value"); } fprintf(conffile, "%s\n", config_params[i].param_help); fprintf(conffile, "; %s %s\n\n", config_params[i].param_name, value); } } } fprintf(conffile, "\n"); myfclose(conffile); conffile = NULL; } } /** * conf_load * Is the main function, called from motion.c * The function sets the important context structure "cnt" including * loading the config parameters from config files and Command-line. * The following takes place in the function: * - The default start values for cnt stored in the struct conf_template * are copied to cnt[0] which is the default context structure common to * all threads. * - All config (cnt.conf) struct members pointing to a string are changed * so that they point to a malloc'ed piece of memory containing a copy of * the string given in conf_template. * - motion.conf is opened and processed. The process populates the cnt[0] and * for each camera config file it populates a cnt[1], cnt[2]... for each * camera. * - Finally it processes the options given in the Command-line. This is done * for each camera cnt[i] so that the Command-line options overrides any * option given by motion.conf or a camera config file. * * Returns context struct. */ struct context **conf_load(struct context **cnt) { FILE *fp = NULL; char filename[PATH_MAX]; int i, retcd; /* We preserve argc and argv because they get overwritten by the memcpy command. */ char **argv = cnt[0]->conf.argv; int argc = cnt[0]->conf.argc; /* * Copy the template config structure with all the default config values * into cnt[0]->conf */ memcpy(&cnt[0]->conf, &conf_template, sizeof(struct config)); /* * For each member of cnt[0] which is a pointer to a string * if the member points to a string in conf_template and is not NULL. * 1. Reserve (malloc) memory for the string. * 2. Copy the conf_template given string to the reserved memory. * 3. Change the cnt[0] member (char*) pointing to the string in reserved memory. * This ensures that we can free and malloc the string when changed * via http remote control or config file or Command-line options. */ malloc_strings(cnt[0]); /* Restore the argc and argv */ cnt[0]->conf.argv = argv; cnt[0]->conf.argc = argc; /* * Open the motion.conf file. We try in this sequence: * 1. Command-line * 2. current working directory * 3. $HOME/.motion/motion.conf * 4. sysconfdir/motion.conf */ /* Get filename , pid file & log file from Command-line. */ cnt[0]->log_type_str[0] = 0; cnt[0]->conf_filename[0] = 0; cnt[0]->pid_file[0] = 0; cnt[0]->log_file[0] = 0; cnt[0]->log_level = -1; conf_cmdline(cnt[0], -1); if (cnt[0]->conf_filename[0]) { /* User has supplied filename on Command-line. */ strncpy(filename, cnt[0]->conf_filename, PATH_MAX-1); filename[PATH_MAX-1] = '\0'; fp = fopen (filename, "re"); } if (!fp) { /* Command-line didn't work, try current dir. */ char path[PATH_MAX]; if (cnt[0]->conf_filename[0]) { MOTION_LOG(ALR, TYPE_ALL, SHOW_ERRNO ,_("Configfile %s not found - trying defaults.") ,filename); } if (getcwd(path, sizeof(path)) == NULL) { MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO, _("Error getcwd")); exit(-1); } snprintf(filename, PATH_MAX, "%.*s/motion.conf" , (int)(PATH_MAX-1-strlen("/motion.conf")) , path); fp = fopen (filename, "re"); } if (!fp) { /* Specified file does not exist... try default file. */ snprintf(filename, PATH_MAX, "%s/.motion/motion.conf", getenv("HOME")); fp = fopen(filename, "re"); if (!fp) { snprintf(filename, PATH_MAX, "%s/motion.conf", sysconfdir); fp = fopen(filename, "re"); if (!fp) { /* There is no config file.... use defaults. */ MOTION_LOG(ALR, TYPE_ALL, SHOW_ERRNO ,_("could not open configfile %s") ,filename); } } } /* Now we process the motion.conf config file and close it. */ if (fp) { retcd = snprintf(cnt[0]->conf_filename ,sizeof(cnt[0]->conf_filename) ,"%s",filename); if ((retcd < 0) || (retcd >= (int)sizeof(cnt[0]->conf_filename))) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Invalid file name %s"), filename); } else { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Processing thread 0 - config file %s"), filename); cnt = conf_process(cnt, fp); myfclose(fp); } } else { MOTION_LOG(CRT, TYPE_ALL, NO_ERRNO ,_("No config file to process, using default values")); } /* * For each thread (given by cnt[i]) being not null * cnt is an array of pointers to a context type structure * cnt[0] is the default context structure * cnt[1], cnt[2], ... are context structures for each thread * Command line options always wins over config file options * so we go through each thread and overrides any set Command-line * options. */ i = -1; while (cnt[++i]) { conf_cmdline(cnt[i], i); } /* If pid file was passed from Command-line copy to main thread conf struct. */ if (cnt[0]->pid_file[0]) { if (cnt[0]->conf.pid_file != NULL) { free(cnt[0]->conf.pid_file); cnt[0]->conf.pid_file = NULL; } cnt[0]->conf.pid_file = mymalloc(strlen(cnt[0]->pid_file) + 1); sprintf(cnt[0]->conf.pid_file, "%s", cnt[0]->pid_file); } /* If log file was passed from Command-line copy to main thread conf struct. */ if (cnt[0]->log_file[0]) { if (cnt[0]->conf.log_file != NULL) { free(cnt[0]->conf.log_file); cnt[0]->conf.log_file = NULL; } cnt[0]->conf.log_file = mymalloc(strlen(cnt[0]->log_file) + 1); sprintf(cnt[0]->conf.log_file, "%s", cnt[0]->log_file); } /* If log type string was passed from Command-line copy to main thread conf struct. */ if (cnt[0]->log_type_str[0]) { if (cnt[0]->conf.log_type != NULL) { free(cnt[0]->conf.log_type); cnt[0]->conf.log_type = NULL; } cnt[0]->conf.log_type = mymalloc(strlen(cnt[0]->log_type_str) + 1); sprintf(cnt[0]->conf.log_type, "%s", cnt[0]->log_type_str); } /* if log level was passed from Command-line copy to main thread conf struct. */ if (cnt[0]->log_level != -1) { cnt[0]->conf.log_level = cnt[0]->log_level; } config_parms_intl(); return cnt; } /** * conf_output_parms * Dump config options to log, useful for support purposes. * Redact sensitive information and re-add quotation marks where needed (see conf_print). * Not using the MOTION_LOG macro here to skip the function naming, * and produce a slightly cleaner dump. * * Returns nothing */ void conf_output_parms(struct context **cnt) { unsigned int i, t = 0; const char *name, *value; while(cnt[++t]) { continue; } MOTION_LOG(INF, TYPE_ALL, NO_ERRNO ,_("Writing configuration parameters from all files (%d):"), t); for (t = 0; cnt[t]; t++) { motion_log(INF, TYPE_ALL, NO_ERRNO,0 ,_("Thread %d - Config file: %s"), t, cnt[t]->conf_filename); i = 0; while (config_params[i].param_name != NULL) { name=config_params[i].param_name; if ((value = config_params[i].print(cnt, NULL, i, t)) != NULL) { if (mystreq(name, "netcam_url") || mystreq(name, "netcam_userpass") || mystreq(name, "netcam_high_url") || mystreq(name, "stream_authentication") || mystreq(name, "webcontrol_authentication") || mystreq(name, "webcontrol_key") || mystreq(name, "webcontrol_cert") || mystreq(name, "database_user") || mystreq(name, "database_password")) { motion_log(INF, TYPE_ALL, NO_ERRNO,0 ,_("%-25s "), name); } else if (mystreq(name, "webcontrol_header_params") && (cnt[t]->conf.webcontrol_localhost == FALSE)) { motion_log(INF, TYPE_ALL, NO_ERRNO,0 ,_("%-25s "), name); } else if (mystreq(name, "stream_header_params") && (cnt[t]->conf.stream_localhost == FALSE)) { motion_log(INF, TYPE_ALL, NO_ERRNO,0 ,_("%-25s "), name); } else { if (strncmp(name, "text", 4) || strncmp(value, " ", 1)) { motion_log(INF, TYPE_ALL, NO_ERRNO,0, "%-25s %s", name, value); } else { motion_log(INF, TYPE_ALL, NO_ERRNO,0, "%-25s \"%s\"", name, value); } } } else { if (t == 0) { motion_log(INF, TYPE_ALL, NO_ERRNO,0, "%-25s ", name); } } i++; } } } /** * malloc_strings * goes through the members of a context structure. * For each context structure member which is a pointer to a string it does this: * If the member points to a string and is not NULL * 1. Reserve (malloc) memory for the string * 2. Copy the original string to the reserved memory * 3. Change the cnt member (char*) pointing to the string in reserved memory * This ensures that we can free and malloc the string if it is later changed * * Returns nothing. */ static void malloc_strings(struct context *cnt) { unsigned int i = 0; char **val; while (config_params[i].param_name != NULL) { if (config_params[i].copy == copy_string) { /* if member is a string */ /* val is made to point to a pointer to the current string. */ val = (char **)((char *)cnt+config_params[i].conf_value); /* * If there is a string, malloc() space for it, copy * the string to new space, and point to the new * string. we don't free() because we're copying a * static string. */ *val = mystrdup(*val); } i++; } } /** * print_bool * Returns a pointer to string containing boolean value 'on' / 'off' or NULL. * * Returns const char *. */ static const char *print_bool(struct context **cnt, char **str, int parm, unsigned int threadnr) { int val = config_params[parm].conf_value; (void)str; if (threadnr && *(int*)((char *)cnt[threadnr] + val) == *(int*)((char *)cnt[0] + val)) { return NULL; } if (*(int*)((char *)cnt[threadnr] + val)) { return "on"; } else { return "off"; } } /** * print_string * Returns a pointer to a string containing the value of the config option, * If the thread number is not 0 the string is compared with the value of the same * option in thread 0. * * Returns If the option is not defined NULL is returned. * If the value is the same, NULL is returned which means that * the option is not written to the camera config file. */ static const char *print_string(struct context **cnt, char **str, int parm, unsigned int threadnr) { int val = config_params[parm].conf_value; const char **cptr0, **cptr1; (void)str; /* Check for NULL also. */ cptr0 = (const char **)((char *)cnt[0] + val); cptr1 = (const char **)((char *)cnt[threadnr] + val); if ((threadnr) && (*cptr0 != NULL) && (*cptr1 != NULL) && (mystreq(*cptr0, *cptr1))) { return NULL; } return *cptr1; } /** * print_int * Returns a pointer to a string containing the integer of the config option value. * If the thread number is not 0 the integer is compared with the value of the same * option in thread 0. * * Returns If the option is different, const char * * If the option is the same, NULL is returned which means that * the option is not written to the camera config file. */ static const char *print_int(struct context **cnt, char **str, int parm, unsigned int threadnr) { static char retval[20]; int val = config_params[parm].conf_value; (void)str; if (threadnr && *(int*)((char *)cnt[threadnr] + val) == *(int*)((char *)cnt[0] + val)) { return NULL; } sprintf(retval, "%d", *(int*)((char *)cnt[threadnr] + val)); return retval; } /** * print_camera * Modifies a pointer to a string with each 'camera' line. * Does nothing if single threaded or no pointer was supplied. * * Returns NULL */ static const char *print_camera(struct context **cnt, char **str, int parm, unsigned int threadnr) { char *retval; unsigned int i = 0; (void)parm; if (!str || threadnr) { return NULL; } retval = mymalloc(1); retval[0] = 0; while (cnt[++i]) { /* Skip config files loaded from conf directory */ if (cnt[i]->from_conf_dir) { continue; } retval = myrealloc(retval, strlen(retval) + strlen(cnt[i]->conf_filename) + 10, "print_camera"); sprintf(retval + strlen(retval), "camera %s\n", cnt[i]->conf_filename); } *str = retval; return NULL; } /** * read_camera_dir * Read the directory finding all *.conf files in the path * When found calls config_camera */ static struct context **read_camera_dir(struct context **cnt, char *str, int val) { DIR *dp; struct dirent *ep; size_t name_len; int i; char conf_file[PATH_MAX]; /* Store the given config value to allow writing it out */ copy_string(*cnt, str, val); dp = opendir(str); if (dp != NULL) { while( (ep = readdir(dp)) ) { name_len = strlen(ep->d_name); if (name_len > strlen(EXTENSION) && (strncmp(EXTENSION,(ep->d_name + name_len - strlen(EXTENSION)), strlen(EXTENSION)) == 0 )) { memset(conf_file, '\0', sizeof(conf_file)); snprintf(conf_file, sizeof(conf_file) - 1, "%s/%s", str, ep->d_name); MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Processing config file %s"), conf_file ); cnt = config_camera(cnt, conf_file, 0); /* The last context thread would be ours, * set it as created from conf directory. */ i = 0; while (cnt[++i]) { continue; } cnt[i-1]->from_conf_dir = 1; } } closedir(dp); } else { MOTION_LOG(ALR, TYPE_ALL, SHOW_ERRNO ,_("Camera directory config %s not found"), str); return cnt; } return cnt; } /** * config_camera * Is called during initial config file loading each time Motion * finds a camera option in motion.conf * The size of the context array is increased and the main context's values are * copied to the new thread. * * cnt - pointer to the array of pointers pointing to the context structures * str - pointer to a string which is the filename of the camera config file * val - is not used. It is defined to be function header compatible with * copy_int, copy_bool and copy_string. */ static struct context **config_camera(struct context **cnt, const char *str, int val) { int i; FILE *fp; (void)val; if (cnt[0]->threadnr) { return cnt; } fp = fopen(str, "re"); if (!fp) { MOTION_LOG(ALR, TYPE_ALL, SHOW_ERRNO ,_("Camera config file %s not found"), str); return cnt; } /* Find the current number of threads defined. */ i = -1; while (cnt[++i]) { continue; } /* * Make space for the threads + the terminating NULL pointer * in the array of pointers to context structures * First thread is 0 so the number of threads is i + 1 * plus an extra for the NULL pointer. This gives i + 2 */ cnt = myrealloc(cnt, sizeof(struct context *) * (i + 2), "config_camera"); /* Now malloc space for an additional context structure for thread nr. i */ cnt[i] = mymalloc(sizeof(struct context)); /* And make this an exact clone of the context structure for thread 0 */ memcpy(cnt[i], cnt[0], sizeof(struct context)); /* * All the integers are copies of the actual value. * The strings are all pointers to strings so we need to create * unique malloc'ed space for all the strings that are not NULL and * change the string pointers to point to the new strings. * malloc_strings takes care of this. */ malloc_strings(cnt[i]); /* Mark the end if the array of pointers to context structures. */ cnt[i + 1] = NULL; /* Process the camera's config file and notify user on console. */ strcpy(cnt[i]->conf_filename, str); MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Processing camera config file %s"), str); conf_process(cnt + i, fp); /* Finally we close the camera config file. */ myfclose(fp); return cnt; } /** * usage * Prints usage and options allowed from Command-line. * * Returns nothing. */ static void usage() { printf("motion Version "VERSION", Copyright 2000-2023 Jeroen Vreeken/Folkert van Heusden/Kenneth Lavrsen/Motion-Project maintainers\n"); printf("\nHome page :\t https://motion-project.github.io/ \n"); printf("\nusage:\tmotion [options]\n"); printf("\n\n"); printf("Possible options:\n\n"); printf("-b\t\t\tRun in background (daemon) mode.\n"); printf("-n\t\t\tRun in non-daemon mode.\n"); printf("-s\t\t\tRun in setup mode.\n"); printf("-c config\t\tFull path and filename of config file.\n"); printf("-d level\t\tLog level (1-9) (EMG, ALR, CRT, ERR, WRN, NTC, INF, DBG, ALL). default: 6 / NTC.\n"); printf("-k type\t\t\tType of log (COR, STR, ENC, NET, DBL, EVT, TRK, VID, ALL). default: ALL.\n"); printf("-p process_id_file\tFull path and filename of process id file (pid file).\n"); printf("-l log file \t\tFull path and filename of log file.\n"); printf("-m\t\t\tDisable motion detection at startup.\n"); printf("-h\t\t\tShow this screen.\n"); printf("\n"); printf("Motion is configured using a config file only. If none is supplied,\n"); printf("it will read motion.conf from current directory, ~/.motion or %s.\n", sysconfdir); printf("\n"); } static void config_parms_intl() { /* This function prints out the configuration parms side by side * with the translations. It is currently disabled but put into * the code so that they can be found by xgettext. If enabled, then * it will be printed when called from the conf_load. */ if (FALSE) { MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","daemon",_("daemon")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","setup_mode",_("setup_mode")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","pid_file",_("pid_file")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","log_file",_("log_file")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","log_level",_("log_level")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","log_type",_("log_type")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","quiet",_("quiet")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","watchdog_tmo",_("watchdog_tmo")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","watchdog_kill",_("watchdog_kill")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","native_language",_("native_language")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","camera_name",_("camera_name")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","camera_id",_("camera_id")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","target_dir",_("target_dir")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","video_device",_("video_device")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","video_params",_("video_params")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","auto_brightness",_("auto_brightness")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","tuner_device",_("tuner_device")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","roundrobin_frames",_("roundrobin_frames")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","roundrobin_skip",_("roundrobin_skip")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","roundrobin_switchfilter",_("roundrobin_switchfilter")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","netcam_url",_("netcam_url")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","netcam_params",_("netcam_params")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","netcam_high_url",_("netcam_high_url")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","netcam_high_params",_("netcam_high_params")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","netcam_userpass",_("netcam_userpass")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","mmalcam_name",_("mmalcam_name")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","mmalcam_params",_("mmalcam_params")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","width",_("width")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","height",_("height")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","framerate",_("framerate")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","minimum_frame_time",_("minimum_frame_time")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","rotate",_("rotate")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","flip_axis",_("flip_axis")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","locate_motion_mode",_("locate_motion_mode")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","locate_motion_style",_("locate_motion_style")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","text_left",_("text_left")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","text_right",_("text_right")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","text_changes",_("text_changes")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","text_scale",_("text_scale")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","text_event",_("text_event")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","emulate_motion",_("emulate_motion")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","pause",_("pause")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","threshold",_("threshold")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","threshold_maximum",_("threshold_maximum")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","threshold_tune",_("threshold_tune")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","noise_level",_("noise_level")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","noise_tune",_("noise_tune")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","despeckle_filter",_("despeckle_filter")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","area_detect",_("area_detect")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","mask_file",_("mask_file")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","mask_privacy",_("mask_privacy")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","smart_mask_speed",_("smart_mask_speed")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","lightswitch_percent",_("lightswitch_percent")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","lightswitch_frames",_("lightswitch_frames")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","minimum_motion_frames",_("minimum_motion_frames")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","event_gap",_("event_gap")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","pre_capture",_("pre_capture")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","post_capture",_("post_capture")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","on_event_start",_("on_event_start")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","on_event_end",_("on_event_end")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","on_picture_save",_("on_picture_save")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","on_area_detected",_("on_area_detected")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","on_motion_detected",_("on_motion_detected")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","on_movie_start",_("on_movie_start")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","on_movie_end",_("on_movie_end")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","on_camera_lost",_("on_camera_lost")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","on_camera_found",_("on_camera_found")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","picture_output",_("picture_output")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","picture_output_motion",_("picture_output_motion")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","picture_type",_("picture_type")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","picture_quality",_("picture_quality")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","picture_exif",_("picture_exif")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","picture_filename",_("picture_filename")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","snapshot_interval",_("snapshot_interval")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","snapshot_filename",_("snapshot_filename")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","movie_output",_("movie_output")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","movie_output_motion",_("movie_output_motion")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","movie_max_time",_("movie_max_time")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","movie_bps",_("movie_bps")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","movie_quality",_("movie_quality")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","movie_codec",_("movie_codec")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","movie_duplicate_frames",_("movie_duplicate_frames")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","movie_passthrough",_("movie_passthrough")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","movie_filename",_("movie_filename")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","movie_extpipe_use",_("movie_extpipe_use")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","movie_extpipe",_("movie_extpipe")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","timelapse_interval",_("timelapse_interval")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","timelapse_mode",_("timelapse_mode")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","timelapse_fps",_("timelapse_fps")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","timelapse_codec",_("timelapse_codec")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","timelapse_filename",_("timelapse_filename")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","video_pipe",_("video_pipe")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","video_pipe_motion",_("video_pipe_motion")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_port",_("webcontrol_port")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_ipv6",_("webcontrol_ipv6")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_localhost",_("webcontrol_localhost")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_parms",_("webcontrol_parms")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_interface",_("webcontrol_interface")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_auth_method",_("webcontrol_auth_method")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_authentication",_("webcontrol_authentication")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_tls",_("webcontrol_tls")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_cert",_("webcontrol_cert")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_key",_("webcontrol_key")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_header_params",_("webcontrol_header_params")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_lock_minutes",_("webcontrol_lock_minutes")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_lock_attempts",_("webcontrol_lock_attempts")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","webcontrol_lock_max_ips",_("webcontrol_lock_max_ips")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_port",_("stream_port")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_localhost",_("stream_localhost")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_auth_method",_("stream_auth_method")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_authentication",_("stream_authentication")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_tls",_("stream_tls")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_header_params",_("stream_header_params")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_preview_scale",_("stream_preview_scale")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_preview_newline",_("stream_preview_newline")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_preview_method",_("stream_preview_method")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_quality",_("stream_quality")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_grey",_("stream_grey")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_motion",_("stream_motion")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_maxrate",_("stream_maxrate")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","stream_limit",_("stream_limit")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","database_type",_("database_type")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","database_dbname",_("database_dbname")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","database_host",_("database_host")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","database_port",_("database_port")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","database_user",_("database_user")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","database_password",_("database_password")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","database_busy_timeout",_("database_busy_timeout")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_log_picture",_("sql_log_picture")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_log_snapshot",_("sql_log_snapshot")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_log_movie",_("sql_log_movie")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_log_timelapse",_("sql_log_timelapse")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_query_start",_("sql_query_start")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_query_stop",_("sql_query_stop")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_query",_("sql_query")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_type",_("track_type")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_auto",_("track_auto")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_port",_("track_port")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_motorx",_("track_motorx")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_motorx_reverse",_("track_motorx_reverse")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_motory",_("track_motory")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_motory_reverse",_("track_motory_reverse")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_maxx",_("track_maxx")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_minx",_("track_minx")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_maxy",_("track_maxy")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_miny",_("track_miny")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_homex",_("track_homex")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_homey",_("track_homey")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_iomojo_id",_("track_iomojo_id")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_step_angle_x",_("track_step_angle_x")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_step_angle_y",_("track_step_angle_y")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_move_wait",_("track_move_wait")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_speed",_("track_speed")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_stepsize",_("track_stepsize")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","track_generic_move",_("track_generic_move")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","camera",_("camera")); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","camera_dir",_("camera_dir")); } } motion-release-4.6.0/src/conf.h000066400000000000000000000206611452402535500163430ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * conf.h * Originally written for the dproxy package by Matthew Pratt. * Copyright 2000 Jeroen Vreeken (pe1rxq@chello.nl) */ #ifndef _INCLUDE_CONF_H #define _INCLUDE_CONF_H /* * More parameters may be added later. */ struct config { /* Overall system configuration parameters */ /* daemon is directly cast into the cnt context rather than conf */ int setup_mode; char *pid_file; char *log_file; int log_level; char *log_type; int quiet; int native_language; int watchdog_tmo; int watchdog_kill; const char *camera_name; int camera_id; const char *camera_dir; const char *target_dir; /* Capture device configuration parameters */ const char *video_device; char *video_params; int auto_brightness; const char *tuner_device; int roundrobin_frames; int roundrobin_skip; int roundrobin_switchfilter; const char *netcam_url; char *netcam_params; const char *netcam_high_url; char *netcam_high_params; const char *netcam_userpass; const char *mmalcam_name; const char *mmalcam_params; /* Image processing configuration parameters */ int width; int height; int framerate; int minimum_frame_time; int rotate; const char *flip_axis; const char *locate_motion_mode; const char *locate_motion_style; const char *text_left; const char *text_right; int text_changes; int text_scale; const char *text_event; /* Motion detection configuration parameters */ int pause; int emulate_motion; int threshold; int threshold_maximum; int threshold_tune; int noise_level; int noise_tune; const char *despeckle_filter; const char *area_detect; const char *mask_file; const char *mask_privacy; int smart_mask_speed; int lightswitch_percent; int lightswitch_frames; int minimum_motion_frames; int event_gap; int pre_capture; int post_capture; /* Script execution configuration parameters */ char *on_event_start; char *on_event_end; char *on_picture_save; char *on_area_detected; char *on_motion_detected; char *on_movie_start; char *on_movie_end; char *on_camera_lost; char *on_camera_found; /* Picture output configuration parameters */ const char *picture_output; int picture_output_motion; const char *picture_type; int picture_quality; const char *picture_exif; const char *picture_filename; /* Snapshot configuration parameters */ int snapshot_interval; const char *snapshot_filename; /* Movie output configuration parameters */ int movie_output; int movie_output_motion; int movie_max_time; int movie_bps; int movie_quality; const char *movie_codec; int movie_duplicate_frames; int movie_passthrough; const char *movie_filename; int movie_extpipe_use; const char *movie_extpipe; /* Timelapse movie configuration parameters */ int timelapse_interval; const char *timelapse_mode; int timelapse_fps; const char *timelapse_codec; const char *timelapse_filename; /* Loopback device configuration parameters */ const char *video_pipe; const char *video_pipe_motion; /* Webcontrol configuration parameters */ int webcontrol_port; int webcontrol_ipv6; int webcontrol_localhost; int webcontrol_parms; int webcontrol_interface; int webcontrol_auth_method; const char *webcontrol_authentication; int webcontrol_tls; const char *webcontrol_cert; const char *webcontrol_key; char *webcontrol_header_params; int webcontrol_lock_minutes; int webcontrol_lock_attempts; int webcontrol_lock_max_ips; /* Live stream configuration parameters */ int stream_port; int stream_localhost; int stream_auth_method; const char *stream_authentication; int stream_tls; char *stream_header_params; int stream_preview_scale; int stream_preview_newline; int stream_preview_method; int stream_quality; int stream_grey; int stream_motion; int stream_maxrate; int stream_limit; /* Database and SQL configuration parameters */ const char *database_type; const char *database_dbname; const char *database_host; int database_port; const char *database_user; const char *database_password; int database_busy_timeout; int sql_log_picture; int sql_log_snapshot; int sql_log_movie; int sql_log_timelapse; const char *sql_query_start; const char *sql_query_stop; const char *sql_query; /* Command line parameters */ int argc; char **argv; }; struct context; /** * typedef for a param copy function. */ typedef void (* conf_copy_func)(struct context *, char *, int); typedef const char *(* conf_print_func)(struct context **, char **, int, unsigned int); /** * description for parameters in the config file */ typedef struct { const char *param_name; /* name for this parameter */ const char *param_help; /* short explanation for parameter */ unsigned int main_thread; /* belong only to main thread when value>0 */ int conf_value; /* pointer to a field in struct context */ conf_copy_func copy; /* a function to set the value in 'config' */ conf_print_func print; /* a function to output the value to a file */ int webui_level; /* Enum to display in webui: 0,1,2,3,99(always to never)*/ } config_param; extern config_param config_params[]; /** * description for deprecated parameters in the config file */ typedef struct { const char *name; /* Name of the deprecated option */ const char *last_version; /* Last version this option was used in */ const char *info; /* Short text on why it was deprecated (removed, replaced with, etc) */ int conf_value; /* Pointer to the replacement field in struct context */ const char *newname; /* Name of the new parameter */ conf_copy_func copy; /* Function to set the replacement value */ } dep_config_param; extern dep_config_param dep_config_params[]; struct context **conf_cmdparse(struct context **cnt, char *cmd, char *arg1); void conf_print(struct context **cnt); struct context **conf_load(struct context **cnt); void conf_output_parms(struct context **cnt); void copy_string(struct context *cnt, char *str, int val_ptr); #endif /* _INCLUDE_CONF_H */ motion-release-4.6.0/src/dbse.c000066400000000000000000000550161452402535500163300ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /** * dbse.c * * Module of routines associated with database processing. * */ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include "dbse.h" pthread_mutex_t dbse_lock; /** dbse_global_deinit */ void dbse_global_deinit(struct context **cntlist) { struct context *cnt; int i; pthread_mutex_destroy(&dbse_lock); #if defined(HAVE_MYSQL) for (cnt=cntlist[i=0]; cnt; cnt=cntlist[++i]) { if (mystreq(cnt->conf.database_type, "mysql")) { MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, _("Closing MySQL library")); mysql_library_end(); break; } } #endif /* HAVE_MYSQL */ #if defined(HAVE_MARIADB) for (cnt=cntlist[i=0]; cnt; cnt=cntlist[++i]) { if (mystreq(cnt->conf.database_type, "mariadb")) { MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, _("Closing MariaDB library")); mysql_library_end(); break; } } #endif /* HAVE_MARIADB */ for (cnt=cntlist[i=0]; cnt; cnt=cntlist[++i]) { if (cnt->conf.database_type) { MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, _("Database closed")); break; } } } /** dbse_global_init */ void dbse_global_init(struct context **cntlist) { int indx; MOTION_LOG(DBG, TYPE_DB, NO_ERRNO,_("Initializing database")); pthread_mutex_init(&dbse_lock, NULL); /* Initialize all the database items; different camera threads can use different DBMSs */ #if defined(HAVE_MYSQL) indx = 0; while (cntlist[indx] != NULL) { if (mystreq(cntlist[indx]->conf.database_type, "mysql") && mysql_library_init(0, NULL, NULL)) { fprintf(stderr, "Could not initialize MySQL library\n"); exit(1); } else { break; } indx++; } #endif /* HAVE_MYSQL */ #if defined(HAVE_MARIADB) indx = 0; while (cntlist[indx] != NULL) { if (mystreq(cntlist[indx]->conf.database_type, "mariadb") && mysql_library_init(0, NULL, NULL)) { fprintf(stderr, "Could not initialize MariaDB library\n"); exit(1); } else { break; } indx++; } #endif /* HAVE_MARIADB */ #if !defined(HAVE_MYSQL) && !defined(HAVE_MARIADB) (void)indx; (void)cntlist; #endif } /** * dbse_init_mysql * */ static int dbse_init_mysql(struct context *cnt) { #if defined(HAVE_MYSQL) int dbport; if ((mystreq(cnt->conf.database_type, "mysql")) && (cnt->conf.database_dbname)) { cnt->database_mysql = mymalloc(sizeof(MYSQL)); mysql_init(cnt->database_mysql); if ((cnt->conf.database_port < 0) || (cnt->conf.database_port > 65535)) { dbport = 0; } else { dbport = cnt->conf.database_port; } if (!mysql_real_connect(cnt->database_mysql, cnt->conf.database_host, cnt->conf.database_user, cnt->conf.database_password, cnt->conf.database_dbname, dbport, NULL, 0)) { MOTION_LOG(ERR, TYPE_DB, NO_ERRNO ,_("Cannot connect to MySQL database %s on host %s with user %s") ,cnt->conf.database_dbname, cnt->conf.database_host ,cnt->conf.database_user); MOTION_LOG(ERR, TYPE_DB, NO_ERRNO ,_("MySQL error was %s"), mysql_error(cnt->database_mysql)); return -2; } #if (defined(MYSQL_VERSION_ID)) && (MYSQL_VERSION_ID > 50012) int my_true = TRUE; mysql_options(cnt->database_mysql, MYSQL_OPT_RECONNECT, &my_true); #endif } #else (void)cnt; /* Avoid compiler warnings */ #endif /* HAVE_MYSQL */ return 0; } /** * dbse_init_mariadb * */ static int dbse_init_mariadb(struct context *cnt) { #if defined(HAVE_MARIADB) int dbport; if ((mystreq(cnt->conf.database_type, "mariadb")) && (cnt->conf.database_dbname)) { cnt->database_mariadb = mymalloc(sizeof(MYSQL)); mysql_init(cnt->database_mariadb); if ((cnt->conf.database_port < 0) || (cnt->conf.database_port > 65535)) { dbport = 0; } else { dbport = cnt->conf.database_port; } if (!mysql_real_connect(cnt->database_mariadb, cnt->conf.database_host, cnt->conf.database_user, cnt->conf.database_password, cnt->conf.database_dbname, dbport, NULL, 0)) { MOTION_LOG(ERR, TYPE_DB, NO_ERRNO ,_("Cannot connect to MariaDB database %s on host %s with user %s") ,cnt->conf.database_dbname, cnt->conf.database_host ,cnt->conf.database_user); MOTION_LOG(ERR, TYPE_DB, NO_ERRNO ,_("MariaDB error was %s"), mysql_error(cnt->database_mariadb)); return -2; } #if (defined(MYSQL_VERSION_ID)) && (MYSQL_VERSION_ID > 50012) int my_true = TRUE; mysql_options(cnt->database_mariadb, MYSQL_OPT_RECONNECT, &my_true); #endif } #else (void)cnt; /* Avoid compiler warnings */ #endif /* HAVE_MARIADB */ return 0; } /** dbse_init_sqlite3 */ static int dbse_init_sqlite3(struct context *cnt) { #ifdef HAVE_SQLITE3 int retcd; if ((mystreq(cnt->conf.database_type, "sqlite3")) && (cnt->conf.database_dbname != NULL)) { MOTION_LOG(NTC, TYPE_DB, NO_ERRNO ,_("Opening database %s"), cnt->conf.database_dbname); retcd = sqlite3_open(cnt->conf.database_dbname, &cnt->database_sqlite3); if (retcd != SQLITE_OK) { MOTION_LOG(ERR, TYPE_DB, NO_ERRNO ,_("Can't open SQLite3 database %s. Error %d : %s") , cnt->conf.database_dbname, retcd , sqlite3_errmsg(cnt->database_sqlite3)); sqlite3_close(cnt->database_sqlite3); return -2; } MOTION_LOG(NTC, TYPE_DB, NO_ERRNO , _("Setting busy timeout to %d msec") , cnt->conf.database_busy_timeout); retcd = sqlite3_busy_timeout(cnt->database_sqlite3 , cnt->conf.database_busy_timeout); if (retcd != SQLITE_OK) { MOTION_LOG(ERR, TYPE_DB, NO_ERRNO , _("Setting busy timeout failed. Error %d:%s") , retcd, sqlite3_errmsg(cnt->database_sqlite3)); } } #else (void)cnt; #endif /* HAVE_SQLITE3 */ return 0; } /** * dbse_init_pgsql * */ static int dbse_init_pgsql(struct context *cnt) { #ifdef HAVE_PGSQL if ((mystreq(cnt->conf.database_type, "postgresql")) && (cnt->conf.database_dbname)) { char connstring[255]; snprintf(connstring, 255, "dbname='%s' host='%s' user='%s' password='%s' port='%d'", cnt->conf.database_dbname, /* dbname */ (cnt->conf.database_host ? cnt->conf.database_host : ""), /* host (may be blank) */ (cnt->conf.database_user ? cnt->conf.database_user : ""), /* user (may be blank) */ (cnt->conf.database_password ? cnt->conf.database_password : ""), /* password (may be blank) */ cnt->conf.database_port ); cnt->database_pgsql = PQconnectdb(connstring); if (PQstatus(cnt->database_pgsql) == CONNECTION_BAD) { MOTION_LOG(ERR, TYPE_DB, NO_ERRNO ,_("Connection to PostgreSQL database '%s' failed: %s") ,cnt->conf.database_dbname, PQerrorMessage(cnt->database_pgsql)); return -2; } cnt->eid_db_format = dbeid_undetermined; } #else (void)cnt; /* Avoid compiler warnings */ #endif /* HAVE_PGSQL */ return 0; } /** dbse_init */ int dbse_init(struct context *cnt) { int retcd = 0; if (cnt->conf.database_type) { MOTION_LOG(NTC, TYPE_DB, NO_ERRNO ,_("Database type %s"), cnt->conf.database_type); if (mystreq(cnt->conf.database_type,"mysql")) { retcd = dbse_init_mysql(cnt); } else if (mystreq(cnt->conf.database_type,"mariadb")) { retcd = dbse_init_mariadb(cnt); } else if (mystreq(cnt->conf.database_type,"postgresql")) { retcd = dbse_init_pgsql(cnt); } else if (mystreq(cnt->conf.database_type,"sqlite3")) { retcd = dbse_init_sqlite3(cnt); } /* Set the sql mask file according to the SQL config options*/ cnt->sql_mask = cnt->conf.sql_log_picture * (FTYPE_IMAGE + FTYPE_IMAGE_MOTION) + cnt->conf.sql_log_snapshot * FTYPE_IMAGE_SNAPSHOT + cnt->conf.sql_log_movie * (FTYPE_MPEG + FTYPE_MPEG_MOTION) + cnt->conf.sql_log_timelapse * FTYPE_MPEG_TIMELAPSE; } return retcd; } /** * dbse_deinit * */ void dbse_deinit(struct context *cnt) { if (cnt->conf.database_type) { #if defined(HAVE_MYSQL) if ( (mystreq(cnt->conf.database_type, "mysql")) && (cnt->conf.database_dbname)) { mysql_thread_end(); mysql_close(cnt->database_mysql); } #endif /* HAVE_MYSQL */ #if defined(HAVE_MARIADB) if ( (mystreq(cnt->conf.database_type, "mariadb")) && (cnt->conf.database_dbname)) { mysql_thread_end(); mysql_close(cnt->database_mariadb); } #endif /* HAVE_MARIADB */ #ifdef HAVE_PGSQL if ((mystreq(cnt->conf.database_type, "postgresql")) && (cnt->conf.database_dbname)) { PQfinish(cnt->database_pgsql); cnt->database_pgsql = NULL; } #endif /* HAVE_PGSQL */ #ifdef HAVE_SQLITE3 if (cnt->database_sqlite3 != NULL) { sqlite3_close(cnt->database_sqlite3); cnt->database_sqlite3 = NULL; } #endif /* HAVE_SQLITE3 */ (void)cnt; } } /** * dbse_sqlmask_update * */ void dbse_sqlmask_update(struct context *cnt) { /* * Set the sql mask file according to the SQL config options * We update it for every frame in case the config was updated * via remote control. */ cnt->sql_mask = cnt->conf.sql_log_picture * (FTYPE_IMAGE + FTYPE_IMAGE_MOTION) + cnt->conf.sql_log_snapshot * FTYPE_IMAGE_SNAPSHOT + cnt->conf.sql_log_movie * (FTYPE_MPEG + FTYPE_MPEG_MOTION) + cnt->conf.sql_log_timelapse * FTYPE_MPEG_TIMELAPSE; } /** * dbse_exec_mysql * */ static void dbse_exec_mysql(char *sqlquery, struct context *cnt) { #if defined(HAVE_MYSQL) if (mystreq(cnt->conf.database_type, "mysql")) { MOTION_LOG(DBG, TYPE_DB, NO_ERRNO, _("Executing MySQL query")); if (mysql_query(cnt->database_mysql, sqlquery) != 0) { int error_code = mysql_errno(cnt->database_mysql); MOTION_LOG(ERR, TYPE_DB, SHOW_ERRNO ,_("MySQL query failed %s error code %d") ,mysql_error(cnt->database_mysql), error_code); /* Try to reconnect ONCE if fails continue and discard this sql query */ if (error_code >= 2000) { // Close connection before start a new connection mysql_close(cnt->database_mysql); cnt->database_mysql = (MYSQL *) mymalloc(sizeof(MYSQL)); mysql_init(cnt->database_mysql); if (!mysql_real_connect(cnt->database_mysql, cnt->conf.database_host, cnt->conf.database_user, cnt->conf.database_password, cnt->conf.database_dbname, 0, NULL, 0)) { MOTION_LOG(ALR, TYPE_DB, NO_ERRNO ,_("Cannot reconnect to MySQL" " database %s on host %s with user %s MySQL error was %s"), cnt->conf.database_dbname, cnt->conf.database_host, cnt->conf.database_user, mysql_error(cnt->database_mysql)); } else { MOTION_LOG(INF, TYPE_DB, NO_ERRNO ,_("Re-Connection to MySQL database '%s' Succeed") ,cnt->conf.database_dbname); if (mysql_query(cnt->database_mysql, sqlquery) != 0) { int error_my = mysql_errno(cnt->database_mysql); MOTION_LOG(ERR, TYPE_DB, SHOW_ERRNO ,_("after re-connection MySQL query failed %s error code %d") ,mysql_error(cnt->database_mysql), error_my); } } } } } #else (void)sqlquery; (void)cnt; #endif /* HAVE_MYSQL*/ } /** * dbse_exec_mariadb * */ static void dbse_exec_mariadb(char *sqlquery, struct context *cnt) { #if defined(HAVE_MARIADB) if (mystreq(cnt->conf.database_type, "mariadb")) { MOTION_LOG(DBG, TYPE_DB, NO_ERRNO, _("Executing MariaDB query")); if (mysql_query(cnt->database_mariadb, sqlquery) != 0) { int error_code = mysql_errno(cnt->database_mariadb); MOTION_LOG(ERR, TYPE_DB, SHOW_ERRNO ,_("MariaDB query failed %s error code %d") ,mysql_error(cnt->database_mariadb), error_code); /* Try to reconnect ONCE if fails continue and discard this sql query */ if (error_code >= 2000) { // Close connection before start a new connection mysql_close(cnt->database_mariadb); cnt->database_mariadb = (MYSQL *) mymalloc(sizeof(MYSQL)); mysql_init(cnt->database_mariadb); if (!mysql_real_connect(cnt->database_mariadb, cnt->conf.database_host, cnt->conf.database_user, cnt->conf.database_password, cnt->conf.database_dbname, 0, NULL, 0)) { MOTION_LOG(ALR, TYPE_DB, NO_ERRNO ,_("Cannot reconnect to MariaDB" " database %s on host %s with user %s MariaDB error was %s"), cnt->conf.database_dbname, cnt->conf.database_host, cnt->conf.database_user, mysql_error(cnt->database_mariadb)); } else { MOTION_LOG(INF, TYPE_DB, NO_ERRNO ,_("Re-Connection to MariaDB database '%s' Succeed") ,cnt->conf.database_dbname); if (mysql_query(cnt->database_mariadb, sqlquery) != 0) { int error_my = mysql_errno(cnt->database_mariadb); MOTION_LOG(ERR, TYPE_DB, SHOW_ERRNO ,_("after re-connection MariaDB query failed %s error code %d") ,mysql_error(cnt->database_mariadb), error_my); } } } } } #else (void)sqlquery; (void)cnt; #endif /* HAVE_MYSQL HAVE_MARIADB*/ } /** * dbse_exec_pgsql * */ static void dbse_exec_pgsql(char *sqlquery, struct context *cnt) { #ifdef HAVE_PGSQL if (mystreq(cnt->conf.database_type, "postgresql") && cnt->database_pgsql) { PGresult *res; ExecStatusType estat; PostgresPollingStatusType pstat; if (cnt->eid_db_format == dbeid_recovery) { /* lost DB session recovery pending */ pstat = PQresetPoll(cnt->database_pgsql); if (pstat == PGRES_POLLING_OK) { MOTION_LOG(WRN, TYPE_DB, NO_ERRNO ,_("Re-connected to PostgreSQL database '%s'") ,cnt->conf.database_dbname); cnt->eid_db_format = dbeid_undetermined; /* reinit eid logic */ } else if (pstat == PGRES_POLLING_FAILED) { cnt->eid_db_format = dbeid_rec_fail; /* retry PGresetStart() */ } else { /* session recovery in process but not complete */ return; /* discard this sqlquery; check again on next one */ } } /* attempt sqlquery unless previous DB session break recovery failed */ if (cnt->eid_db_format > dbeid_recovery) { MOTION_LOG(DBG, TYPE_DB, NO_ERRNO, _("Executing PostgreSQL query")); res = PQexec(cnt->database_pgsql, sqlquery); estat = PQresultStatus(res); } else { res = NULL; /* skip PQclear() below */ estat = PGRES_NONFATAL_ERROR; } if (PQstatus(cnt->database_pgsql) != PGSQL_CONNECTION_OK) { /* DB session break! */ /* Non-blocking broken session recovery (PGSQL Doc.sec.32.1; PGSQL>v9, 33.1) * Note: to avoid blocking, each sqlquery during a session break is discarded. */ if (cnt->eid_db_format != dbeid_rec_fail) { /* log only first attempt */ MOTION_LOG(ERR, TYPE_DB, NO_ERRNO ,_("Attempting reconnect to PostgreSQL database '%s': %s") ,cnt->conf.database_dbname, PQerrorMessage(cnt->database_pgsql)); } if (PQresetStart(cnt->database_pgsql)) { /* reset request delivered */ cnt->eid_db_format = dbeid_recovery; /* suspend SQL operations */ } else { /* reset request fails if PGSQL server is (temporarily?) unreachable */ cnt->eid_db_format = dbeid_rec_fail; /* try again next sqlquery */ } } else if (!(estat == PGRES_COMMAND_OK || estat == PGRES_TUPLES_OK)) { MOTION_LOG(ERR, TYPE_DB, SHOW_ERRNO, _("PGSQL query failed: [%s] %s %s"), sqlquery, PQresStatus(PQresultStatus(res)), PQresultErrorMessage(res)); } if (res) { PQclear(res); } } #else (void)sqlquery; (void)cnt; #endif /* HAVE_PGSQL */ } /** dbse_exec_sqlite3 */ static void dbse_exec_sqlite3(char *sqlquery, struct context *cnt) { #ifdef HAVE_SQLITE3 if (cnt->database_sqlite3 != NULL) { int retcd; char *errmsg = NULL; MOTION_LOG(DBG, TYPE_DB, NO_ERRNO, _("Executing %s"), sqlquery); retcd = sqlite3_exec(cnt->database_sqlite3, sqlquery, NULL, 0, &errmsg); if (retcd != SQLITE_OK ) { MOTION_LOG(ERR, TYPE_DB, NO_ERRNO , _("SQLite3 error %d : %s"), retcd, errmsg); sqlite3_free(errmsg); } } #else (void)sqlquery; (void)cnt; #endif /* HAVE_SQLITE3 */ } /** dbse_firstmotion */ void dbse_firstmotion(struct context *cnt) { char sqlquery[PATH_MAX]; mystrftime(cnt, sqlquery, sizeof(sqlquery), cnt->conf.sql_query_start, &cnt->current_image->timestamp_tv, NULL, 0); if (strlen(sqlquery) <= 0) { MOTION_LOG(WRN, TYPE_DB, NO_ERRNO, _("Ignoring empty sql query")); return; } pthread_mutex_lock(&dbse_lock); if (mystreq(cnt->conf.database_type,"mysql")) { dbse_exec_mysql(sqlquery, cnt); } else if (mystreq(cnt->conf.database_type,"mariadb")) { dbse_exec_mariadb(sqlquery, cnt); } else if (mystreq(cnt->conf.database_type,"postgresql")) { dbse_exec_pgsql(sqlquery, cnt); } else if (mystreq(cnt->conf.database_type,"sqlite3")) { dbse_exec_sqlite3(sqlquery, cnt); } pthread_mutex_unlock(&dbse_lock); } /** dbse_newfile */ void dbse_newfile(struct context *cnt, char *filename, int sqltype, struct timeval *tv1) { char sqlquery[PATH_MAX]; mystrftime(cnt, sqlquery, sizeof(sqlquery), cnt->conf.sql_query, tv1, filename, sqltype); if (strlen(sqlquery) <= 0) { MOTION_LOG(WRN, TYPE_DB, NO_ERRNO, _("Ignoring empty sql query")); return; } pthread_mutex_lock(&dbse_lock); if (mystreq(cnt->conf.database_type,"mysql")) { dbse_exec_mysql(sqlquery, cnt); } else if (mystreq(cnt->conf.database_type,"mariadb")) { dbse_exec_mariadb(sqlquery, cnt); } else if (mystreq(cnt->conf.database_type,"postgresql")) { dbse_exec_pgsql(sqlquery, cnt); } else if (mystreq(cnt->conf.database_type,"sqlite3")) { dbse_exec_sqlite3(sqlquery, cnt); } pthread_mutex_unlock(&dbse_lock); } /** dbse_fileclose */ void dbse_fileclose(struct context *cnt, char *filename, int sqltype, struct timeval *tv1) { char sqlquery[PATH_MAX]; mystrftime(cnt, sqlquery, sizeof(sqlquery), cnt->conf.sql_query_stop, tv1, filename, sqltype); if (strlen(sqlquery) <= 0) { MOTION_LOG(WRN, TYPE_DB, NO_ERRNO, _("Ignoring empty sql query")); return; } pthread_mutex_lock(&dbse_lock); if (mystreq(cnt->conf.database_type,"mysql")) { dbse_exec_mysql(sqlquery, cnt); } else if (mystreq(cnt->conf.database_type,"mariadb")) { dbse_exec_mariadb(sqlquery, cnt); } else if (mystreq(cnt->conf.database_type,"postgresql")) { dbse_exec_pgsql(sqlquery, cnt); } else if (mystreq(cnt->conf.database_type,"sqlite3")) { dbse_exec_sqlite3(sqlquery, cnt); } pthread_mutex_unlock(&dbse_lock); } motion-release-4.6.0/src/dbse.h000066400000000000000000000024001452402535500163220ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * dbse.h * Headers associated with functions in the dbse.c module. */ #ifndef _INCLUDE_DBSE_H #define _INCLUDE_DBSE_H void dbse_global_init(struct context **cntlist); void dbse_global_deinit(struct context **cntlist); int dbse_init(struct context *cnt); void dbse_deinit(struct context *cnt); void dbse_sqlmask_update(struct context *cnt); void dbse_firstmotion(struct context *cnt); void dbse_newfile(struct context *cnt, char *filename, int sqltype, struct timeval *tv1); void dbse_fileclose(struct context *cnt, char *filename, int sqltype, struct timeval *tv1); #endif motion-release-4.6.0/src/draw.c000066400000000000000000000642101452402535500163440ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * draw.c * * Routines for drawing text on images * * Copyright 2000, Jeroen Vreeken * */ #include #include "motion.h" #include "util.h" #include "draw.h" /* Highest ascii value is 126 (~) */ #define ASCII_MAX 127 unsigned char *char_arr_ptr[ASCII_MAX]; struct draw_char { unsigned char ascii; unsigned char pix[8][7]; }; struct draw_char draw_table[]= { { ' ', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0} } }, { '0', { {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {1,2,1,1,2,2,1}, {1,2,1,2,1,2,1}, {1,2,1,2,1,2,1}, {1,2,2,1,1,2,1}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { '1', { {0,0,0,1,0,0,0}, {0,0,1,2,1,0,0}, {0,1,2,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { '2', { {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {1,2,1,1,1,2,1}, {0,1,1,2,2,1,0}, {0,1,2,1,1,0,0}, {1,2,1,1,1,1,0}, {1,2,2,2,2,2,1}, {0,1,1,1,1,1,0} } }, { '3', { {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {1,2,1,1,1,2,1}, {0,1,1,2,2,1,0}, {0,1,0,1,1,2,1}, {1,2,1,1,1,2,1}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { '4', { {0,0,0,0,1,0,0}, {0,0,0,1,2,1,0}, {0,0,1,2,2,1,0}, {0,1,2,1,2,1,0}, {1,2,2,2,2,2,1}, {0,1,1,1,2,1,0}, {0,0,0,1,2,1,0}, {0,0,0,0,1,0,0} } }, { '5', { {0,1,1,1,1,1,0}, {1,2,2,2,2,2,1}, {1,2,1,1,1,1,0}, {1,2,2,2,2,1,0}, {0,1,1,1,1,2,0}, {0,1,1,1,1,2,0}, {1,2,2,2,2,1,0}, {0,1,1,1,1,0,0} } }, { '6', { {0,0,1,1,1,1,0}, {0,1,2,2,2,2,1}, {1,2,1,1,1,1,0}, {1,2,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,1,1,1,2,1}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { '7', { {0,1,1,1,1,1,0}, {1,2,2,2,2,2,1}, {0,1,1,1,1,2,1}, {0,0,0,1,2,1,0}, {0,0,1,2,1,0,0}, {0,1,2,1,0,0,0}, {0,1,2,1,0,0,0}, {0,0,1,0,0,0,0} } }, { '8', { {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {1,2,1,1,1,2,1}, {0,1,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,1,1,1,2,1}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { '9', { {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {1,2,1,1,1,2,1}, {0,1,2,2,2,2,1}, {0,1,1,1,1,2,1}, {1,2,1,1,1,2,1}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { '"', { {0,0,1,0,1,0,0}, {0,1,2,1,2,1,0}, {0,1,2,1,2,1,0}, {0,0,1,0,1,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0} } }, { '/', { {0,0,0,0,1,0,0}, {0,0,0,1,2,1,0}, {0,0,0,1,2,1,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,1,2,1,0,0,0}, {0,1,2,1,0,0,0}, {0,0,1,0,0,0,0} } }, { '(', { {0,0,0,1,0,0,0}, {0,0,1,2,1,0,0}, {0,1,2,1,0,0,0}, {0,1,2,1,0,0,0}, {0,1,2,1,0,0,0}, {0,1,2,1,0,0,0}, {0,0,1,2,1,0,0}, {0,0,0,1,0,0,0} } }, { ')', { {0,0,0,1,0,0,0}, {0,0,1,2,1,0,0}, {0,0,0,1,2,1,0}, {0,0,0,1,2,1,0}, {0,0,0,1,2,1,0}, {0,0,0,1,2,1,0}, {0,0,1,2,1,0,0}, {0,0,0,1,0,0,0} } }, { '@', { {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,1,2,2,2,1}, {1,2,1,2,2,2,1}, {1,2,1,1,1,1,0}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { '~', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,1,0,0,0,0}, {0,1,2,1,0,1,0}, {1,2,1,2,1,2,1}, {0,1,0,1,2,1,0}, {0,0,0,0,1,0,0}, {0,0,0,0,0,0,0} } }, { '#', { {0,0,1,0,1,0,0}, {0,1,2,1,2,1,0}, {1,2,2,2,2,2,1}, {0,1,2,1,2,1,0}, {0,1,2,1,2,1,0}, {1,2,2,2,2,2,1}, {0,1,2,1,2,1,0}, {0,0,1,0,1,0,0} } }, { '<', { {0,0,0,0,0,1,0}, {0,0,0,1,1,2,1}, {0,1,1,2,2,1,0}, {1,2,2,1,1,0,0}, {0,1,1,2,2,1,0}, {0,0,0,1,1,2,1}, {0,0,0,0,0,1,0}, {0,0,0,0,0,0,0} } }, { '>', { {0,1,0,0,0,0,0}, {1,2,1,1,0,0,0}, {0,1,2,2,1,1,0}, {0,0,1,1,2,2,1}, {0,1,2,2,1,1,0}, {1,2,1,1,0,0,0}, {0,1,0,0,0,0,0}, {0,0,0,0,0,0,0} } }, { '|', { {0,0,0,1,0,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,0,1,0,0,0} } }, { ',', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,1,1,0,0,0}, {0,1,2,2,1,0,0}, {0,1,2,2,1,0,0}, {0,1,2,1,0,0,0}, {0,0,1,0,0,0,0} } }, { '.', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,1,1,0,0,0}, {0,1,2,2,1,0,0}, {0,1,2,2,1,0,0}, {0,0,1,1,0,0,0}, {0,0,0,0,0,0,0} } }, { ':', { {0,0,1,1,0,0,0}, {0,1,2,2,1,0,0}, {0,1,2,2,1,0,0}, {0,0,1,1,0,0,0}, {0,0,1,1,0,0,0}, {0,1,2,2,1,0,0}, {0,1,2,2,1,0,0}, {0,0,1,1,0,0,0} } }, { '-', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0} } }, { '+', { {0,0,0,0,0,0,0}, {0,0,0,1,0,0,0}, {0,0,1,2,1,0,0}, {0,1,2,2,2,1,0}, {0,0,1,2,1,0,0}, {0,0,0,1,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0} } }, { '_', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,1,1,1,1,1,0}, {1,2,2,2,2,2,1}, {0,1,1,1,1,1,0} } }, { '\'', { {0,0,0,1,0,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,0,1,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0} } }, { 'a', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,1,1,1,1,0}, {0,1,2,2,2,2,1}, {1,2,1,1,1,2,1}, {1,2,1,1,1,2,1}, {0,1,2,2,2,2,1}, {0,0,1,1,1,1,0} } }, { 'b', { {0,1,0,0,0,0,0}, {1,2,1,0,0,0,0}, {1,2,1,1,1,0,0}, {1,2,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,1,1,1,2,1}, {1,2,2,2,2,1,0}, {0,1,1,1,1,0,0} } }, { 'c', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,1,1,1,1,0}, {0,1,2,2,2,2,1}, {1,2,1,1,1,1,0}, {1,2,1,1,1,1,0}, {0,1,2,2,2,2,1}, {0,0,1,1,1,1,0} } }, { 'd', { {0,0,0,0,0,1,0}, {0,0,0,0,1,2,1}, {0,0,1,1,1,2,1}, {0,1,2,2,2,2,1}, {1,2,1,1,1,2,1}, {1,2,1,1,1,2,1}, {0,1,2,2,2,2,1}, {0,0,1,1,1,1,0} } }, { 'e', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {1,2,2,1,1,2,1}, {1,2,1,2,2,1,0}, {0,1,2,2,2,2,1}, {0,0,1,1,1,1,0} } }, { 'f', { {0,0,0,0,1,1,0}, {0,0,0,1,2,2,1}, {0,0,1,2,1,1,0}, {0,1,2,2,2,1,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,0,1,0,0,0} } }, { 'g', { {0,0,0,0,0,0,0}, {0,0,1,1,1,1,0}, {0,1,2,2,2,2,1}, {1,2,1,1,1,2,1}, {0,1,2,2,2,2,1}, {0,1,1,1,1,2,1}, {1,2,2,2,2,1,0}, {0,1,1,1,1,0,0} } }, { 'h', { {0,1,0,0,0,0,0}, {1,2,1,0,0,0,0}, {1,2,1,1,1,0,0}, {1,2,1,2,2,1,0}, {1,2,2,1,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {0,1,0,0,0,1,0} } }, { 'i', { {0,0,0,1,0,0,0}, {0,0,1,2,1,0,0}, {0,0,0,1,0,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { 'j', { {0,0,0,1,0,0,0}, {0,0,1,2,1,0,0}, {0,0,0,1,0,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,1,1,2,1,0,0}, {1,2,2,1,0,0,0}, {0,1,1,0,0,0,0} } }, { 'k', { {0,1,0,0,0,0,0}, {1,2,1,0,0,0,0}, {1,2,1,0,1,0,0}, {1,2,1,1,2,1,0}, {1,2,1,2,1,0,0}, {1,2,2,1,2,1,0}, {1,2,1,0,1,2,1}, {0,1,0,0,0,1,0} } }, { 'l', { {0,0,1,1,0,0,0}, {0,1,2,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,0,1,2,1,0}, {0,0,0,0,1,0,0} } }, { 'm', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,1,1,0,1,0,0}, {1,2,2,1,2,1,0}, {1,2,1,2,1,2,1}, {1,2,1,2,1,2,1}, {1,2,1,2,1,2,1}, {0,1,0,1,0,1,0} } }, { 'n', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,1,0,1,1,0,0}, {1,2,1,2,2,1,0}, {1,2,2,1,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {0,1,0,0,0,1,0} } }, { 'o', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,1,1,1,2,1}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { 'p', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,1,1,1,1,0,0}, {1,2,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,2,2,2,1,0}, {1,2,1,1,1,0,0}, {1,2,1,0,0,0,0}, } }, { 'q', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,1,1,1,1,0}, {0,1,2,2,2,2,1}, {1,2,1,1,1,2,1}, {0,1,2,2,2,2,1}, {0,0,1,1,1,2,1}, {0,0,0,0,1,2,1} } }, { 'r', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,1,0,1,1,0,0}, {1,2,1,2,2,1,0}, {1,2,2,1,1,2,1}, {1,2,1,0,0,1,0}, {1,2,1,0,0,0,0}, {0,1,0,0,0,0,0} } }, { 's', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,1,1,1,1,0}, {0,1,2,2,2,2,1}, {1,2,2,2,1,1,0}, {0,1,1,2,2,2,1}, {1,2,2,2,2,1,0}, {0,1,1,1,1,0,0} } }, { 't', { {0,0,0,1,0,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,1,2,2,2,1,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,0,1,2,1,0}, {0,0,0,0,1,0,0} } }, { 'u', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,1,0,0,0,1,0}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,1,2,2,1}, {0,1,2,2,1,2,1}, {0,0,1,1,0,1,0} } }, { 'v', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,1,0,0,0,1,0}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {0,1,2,1,2,1,0}, {0,0,1,2,1,0,0}, {0,0,0,1,0,0,0} } }, { 'w', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,1,0,0,0,1,0}, {1,2,1,0,1,2,1}, {1,2,1,1,1,2,1}, {1,2,1,2,1,2,1}, {0,1,2,1,2,1,0}, {0,0,1,0,1,0,0} } }, { 'x', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,1,0,0,1,0,0}, {1,2,1,1,2,1,0}, {0,1,2,2,1,0,0}, {0,1,2,2,1,0,0}, {1,2,1,1,2,1,0}, {0,1,0,0,1,0,0} } }, { 'y', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,1,0,0,0,1,0}, {1,2,1,0,1,2,1}, {0,1,2,1,2,1,0}, {0,0,1,2,1,0,0}, {0,1,2,1,0,0,0}, {1,2,1,0,0,0,0} } }, { 'z', { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,1,1,1,1,0,0}, {1,2,2,2,2,1,0}, {0,1,1,2,1,0,0}, {0,1,2,1,1,0,0}, {1,2,2,2,2,1,0}, {0,1,1,1,1,0,0} } }, { 'A', { {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,1,1,1,2,1}, {1,2,2,2,2,2,1}, {1,2,1,1,1,2,1}, {1,2,1,0,1,2,1}, {0,1,0,0,0,1,0} } }, { 'B', { {0,1,1,1,1,0,0}, {1,2,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,1,1,1,2,1}, {1,2,2,2,2,1,0}, {0,1,1,1,1,0,0} } }, { 'C', { {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,1,0,0,1,0}, {1,2,1,0,0,1,0}, {1,2,1,1,1,2,1}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { 'D', { {0,1,1,1,1,0,0}, {1,2,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,1,1,2,1}, {1,2,2,2,2,1,0}, {0,1,1,1,1,0,0} } }, { 'E', { {0,1,1,1,1,1,0}, {1,2,2,2,2,2,1}, {1,2,1,1,1,1,0}, {1,2,2,2,2,1,0}, {1,2,1,1,1,0,0}, {1,2,1,1,1,1,0}, {1,2,2,2,2,2,1}, {0,1,1,1,1,1,0} } }, { 'F', { {0,1,1,1,1,1,0}, {1,2,2,2,2,2,1}, {1,2,1,1,1,1,0}, {1,2,2,2,2,1,0}, {1,2,1,1,1,0,0}, {1,2,1,0,0,0,0}, {1,2,1,0,0,0,0}, {0,1,0,0,0,0,0} } }, { 'G', { {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,1,1,1,1,0}, {1,2,1,2,2,2,1}, {1,2,1,1,1,2,1}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { 'H', { {0,1,0,0,0,1,0}, {1,2,1,0,1,2,1}, {1,2,1,1,1,2,1}, {1,2,2,2,2,2,1}, {1,2,1,1,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {0,1,0,0,0,1,0} } }, { 'I', { {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { 'J', { {0,0,1,1,1,1,0}, {0,1,2,2,2,2,1}, {0,0,1,1,1,2,1}, {0,0,0,0,1,2,1}, {0,1,0,0,1,2,1}, {1,2,1,1,1,2,1}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { 'K', { {0,1,0,0,0,1,0}, {1,2,1,0,1,2,1}, {1,2,1,1,2,1,0}, {1,2,1,2,1,0,0}, {1,2,2,2,1,0,0}, {1,2,1,1,2,1,0}, {1,2,1,0,1,2,1}, {0,1,0,0,0,1,0} } }, { 'L', { {0,1,0,0,0,0,0}, {1,2,1,0,0,0,0}, {1,2,1,0,0,0,0}, {1,2,1,0,0,0,0}, {1,2,1,0,0,0,0}, {1,2,1,1,1,0,0}, {1,2,2,2,2,1,0}, {0,1,1,1,1,0,0} } }, { 'M', { {0,1,1,0,1,1,0}, {1,2,2,1,2,2,1}, {1,2,1,2,1,2,1}, {1,2,1,1,1,2,}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {0,1,0,0,0,1,0} } }, { 'N', { {0,1,0,0,0,1,0}, {1,2,1,0,1,2,1}, {1,2,2,1,1,2,1}, {1,2,1,2,1,2,1}, {1,2,1,1,2,2,1}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {0,1,0,0,0,1,0} } }, { 'O', { {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,1,1,2,1}, {0,1,2,2,2,1,0}, {0,0,1,1,1,0,0} } }, { 'P', { {0,1,1,1,1,0,0}, {1,2,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,2,2,2,1,0}, {1,2,1,1,1,0,0}, {1,2,1,0,0,0,0}, {1,2,1,0,0,0,0}, {0,1,0,0,0,0,0} } }, { 'Q', { {0,0,1,1,1,0,0}, {0,1,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,1,1,1,2,1}, {1,2,1,2,1,2,1}, {1,2,1,1,2,1,0}, {0,1,2,2,1,2,1}, {0,0,1,1,0,1,0} } }, { 'R', { {0,1,1,1,1,0,0}, {1,2,2,2,2,1,0}, {1,2,1,1,1,2,1}, {1,2,2,2,2,1,0}, {1,2,1,2,1,0,0}, {1,2,1,1,2,1,0}, {1,2,1,0,1,2,1}, {0,1,0,0,0,1,0} } }, { 'S', { {0,0,1,1,1,1,0}, {0,1,2,2,2,2,1}, {1,2,1,1,1,1,0}, {0,1,2,2,2,1,0}, {0,0,1,1,1,2,1}, {0,1,1,1,1,2,1}, {1,2,2,2,2,1,0}, {0,1,1,1,1,0,0} } }, { 'T', { {0,1,1,1,1,1,0}, {1,2,2,2,2,2,1}, {0,1,1,2,1,1,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,0,1,0,0,0} } }, { 'U', { {0,1,0,0,0,1,0}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,1,1,2,1}, {0,1,2,2,2,2,1}, {0,0,1,1,1,1,0} } }, { 'V', { {0,1,0,0,0,1,0}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {0,1,2,1,2,1,0}, {0,0,1,2,1,0,0}, {0,0,0,1,0,0,0} } }, { 'W', { {0,1,0,0,0,1,0}, {1,2,1,0,1,2,1}, {1,2,1,0,1,2,1}, {1,2,1,1,1,2,1}, {1,2,1,2,1,2,1}, {1,2,1,2,1,2,1}, {0,1,2,1,2,1,0}, {0,0,1,0,1,0,0} } }, { 'X', { {0,1,0,0,0,1,0}, {1,2,1,0,1,2,1}, {0,1,2,1,2,1,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,1,2,1,2,1,0}, {1,2,1,0,1,2,1}, {0,1,0,0,0,1,0} } }, { 'Y', { {0,1,0,0,0,1,0}, {1,2,1,0,1,2,1}, {0,1,2,1,2,1,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,1,2,1,0,0}, {0,0,0,1,0,0,0} } }, { 'Z', { {0,1,1,1,1,1,0}, {1,2,2,2,2,2,1}, {0,1,1,1,2,1,0}, {0,0,1,2,1,0,0}, {0,1,2,1,0,0,0}, {1,2,1,1,1,1,0}, {1,2,2,2,2,2,1}, {0,1,1,1,1,1,0} } } }; #define NEWLINE "\\n" /** * draw_textn */ static int draw_textn(unsigned char *image, int startx, int starty, int width, const char *text, int len, int factor) { int x, y; int pos, line_offset, next_char_offs; unsigned char *image_ptr, *char_ptr; if (startx > width / 2) { startx -= len * (6 * factor); } if (startx + len * 6 * factor >= width) { len = (width-startx-1)/(6*factor); } if ((startx < 1) || (starty < 1) || (len < 1)) { return 0; } line_offset = width - (7 * factor); next_char_offs = (width * 8 * factor) - (6 * factor); image_ptr = image + startx + (starty * width); for (pos = 0; pos < len; pos++) { int pos_check = (int)text[pos]; if ((pos_check <0) || (pos_check >127)) { pos_check = 45; /* Use a - for non ascii characters*/ } char_ptr = char_arr_ptr[pos_check]; for (y = 0; y < 8 * factor; y++) { for (x = 0; x < 7 * factor; x++) { char_ptr = char_arr_ptr[pos_check] + y/factor*7 + x/factor; switch(*char_ptr) { case 1: *image_ptr = 0; break; case 2: *image_ptr = 255; break; default: break; } image_ptr++; } image_ptr += line_offset; } image_ptr -= next_char_offs; } return 0; } /** * draw_text */ int draw_text(unsigned char *image, int width, int height, int startx, int starty, const char *text, int factor) { int num_nl = 0; const char *end, *begin; int line_space, txtlen; /* Count the number of newlines in "text" so we scroll it up the image. */ begin = end = text; txtlen = 0; while ((end = strstr(end, NEWLINE))) { if ((end - begin)>txtlen) { txtlen = (end - begin); } num_nl++; end += sizeof(NEWLINE)-1; begin = end; } if (txtlen == 0) { txtlen = strlen(text); } /* Adjust the factor if it is out of bounds * txtlen at this point is the approx length of longest line */ if ((txtlen * 7 * factor) > width) { factor = (width / (txtlen * 7)); if (factor <= 0) { factor = 1; } } if (((num_nl+1) * 8 * factor) > height) { factor = (height / ((num_nl+1) * 8)); if (factor <= 0) { factor = 1; } } line_space = factor * 9; starty -= line_space * num_nl; begin = end = text; while ((end = strstr(end, NEWLINE))) { int len = end-begin; draw_textn(image, startx, starty, width, begin, len, factor); end += sizeof(NEWLINE)-1; begin = end; starty += line_space; } draw_textn(image, startx, starty, width, begin, strlen(begin), factor); return 0; } /** * initialize_chars */ int initialize_chars(void) { unsigned int i; size_t draw_table_size; draw_table_size = sizeof(draw_table) / sizeof(struct draw_char); /* First init all char ptrs to a space character. */ for (i = 0; i < ASCII_MAX; i++) { char_arr_ptr[i] = &draw_table[0].pix[0][0]; } /* Build char_arr_ptr table to point to each available ascii. */ for (i = 0; i < draw_table_size; i++) { char_arr_ptr[(int)draw_table[i].ascii] = &draw_table[i].pix[0][0]; } return 0; } motion-release-4.6.0/src/draw.h000066400000000000000000000017151452402535500163520ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * draw.h * Headers associated with functions in the draw.c module. */ #ifndef _INCLUDE_DRAW_H #define _INCLUDE_DRAW_H int initialize_chars(void); int draw_text(unsigned char *image, int width, int height, int startx, int starty, const char *text, int factor); #endif motion-release-4.6.0/src/event.c000066400000000000000000001343021452402535500165300ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* event.c Generalised event handling for motion Copyright Jeroen Vreeken, 2002 */ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include "picture.h" #include "netcam.h" #include "netcam_rtsp.h" #include "ffmpeg.h" #include "event.h" #include "video_loopback.h" #include "video_common.h" #include "dbse.h" /* * TODO Items: * Rework the snprintf uses. * Edit directories so they can never be null and eliminate defaults from here * Move the ffmpeg initialize stuff to ffmpeg module * eliminate #if for v4l2 * Move stream stuff to webu_stream */ const char *eventList[] = { "NULL", "EVENT_FILECREATE", "EVENT_MOTION", "EVENT_FIRSTMOTION", "EVENT_ENDMOTION", "EVENT_STOP", "EVENT_TIMELAPSE", "EVENT_TIMELAPSEEND", "EVENT_STREAM", "EVENT_IMAGE_DETECTED", "EVENT_IMAGEM_DETECTED", "EVENT_IMAGE_SNAPSHOT", "EVENT_IMAGE", "EVENT_IMAGEM", "EVENT_IMAGE_PREVIEW", "EVENT_FILECLOSE", "EVENT_DEBUG", "EVENT_CRITICAL", "EVENT_AREA_DETECTED", "EVENT_CAMERA_LOST", "EVENT_CAMERA_FOUND", "EVENT_FFMPEG_PUT", "EVENT_MOVIE_START", "EVENT_MOVIE_END", "EVENT_LAST" }; /** * exec_command * Execute 'command' with 'arg' as its argument. * if !arg command is started with no arguments * Before we call execl we need to close all the file handles * that the fork inherited from the parent in order not to pass * the open handles on to the shell */ static void exec_command(struct context *cnt, char *command, char *filename, int filetype) { char stamp[PATH_MAX]; mystrftime(cnt, stamp, sizeof(stamp), command, &cnt->current_image->timestamp_tv, filename, filetype); if (!fork()) { /* Detach from parent */ setsid(); execl("/bin/sh", "sh", "-c", stamp, " &", NULL); /* if above function succeeds the program never reach here */ MOTION_LOG(ALR, TYPE_EVENTS, SHOW_ERRNO ,_("Unable to start external command '%s'"), stamp); exit(1); } MOTION_LOG(DBG, TYPE_EVENTS, NO_ERRNO ,_("Executing external command '%s'"), stamp); } /* * Event handlers */ static void event_newfile(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)cnt; (void)eventtype; (void)img_data; (void)tv1; if ((unsigned long)eventdata <= 4) { MOTION_LOG(NTC, TYPE_EVENTS, NO_ERRNO ,_("Writing image to file: %s"), filename); } else { MOTION_LOG(NTC, TYPE_EVENTS, NO_ERRNO ,_("Writing movie to file: %s"), filename); } } static void event_closefile(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)cnt; (void)eventtype; (void)img_data; (void)tv1; if ((unsigned long)eventdata <= 4) { MOTION_LOG(DBG, TYPE_EVENTS, NO_ERRNO ,_("Saved image to file: %s"), filename); } else { MOTION_LOG(DBG, TYPE_EVENTS, NO_ERRNO ,_("Saved movie to file: %s"), filename); } } static void event_beep(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)eventtype; (void)img_data; (void)filename; (void)eventdata; (void)tv1; if (!cnt->conf.quiet) { printf("\a"); } } /** * on_picture_save_command * handles both on_picture_save and on_movie_start * If arg = FTYPE_IMAGE_ANY on_picture_save script is executed * If arg = FTYPE_MPEG_ANY on_movie_start script is executed * The scripts are executed with the filename of picture or movie appended * to the config parameter. */ static void on_picture_save_command(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { int filetype = (unsigned long)eventdata; (void)eventtype; (void)img_data; (void)tv1; if ((filetype & FTYPE_IMAGE_ANY) != 0 && cnt->conf.on_picture_save) { exec_command(cnt, cnt->conf.on_picture_save, filename, filetype); } if ((filetype & FTYPE_MPEG_ANY) != 0 && cnt->conf.on_movie_start) { exec_command(cnt, cnt->conf.on_movie_start, filename, filetype); } } static void on_motion_detected_command(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)eventtype; (void)img_data; (void)filename; (void)eventdata; (void)tv1; if (cnt->conf.on_motion_detected) { exec_command(cnt, cnt->conf.on_motion_detected, NULL, 0); } } static void event_sqlfirstmotion(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)eventtype; (void)img_data; (void)filename; (void)eventdata; (void)tv1; if (!(cnt->conf.database_type)) { return; } else { dbse_firstmotion(cnt); } } static void event_sqlnewfile(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { int sqltype = (unsigned long)eventdata; (void)eventtype; (void)img_data; /* Only log the file types we want */ if (!(cnt->conf.database_type) || (sqltype & cnt->sql_mask) == 0) { return; } else { dbse_newfile(cnt, filename, sqltype, tv1); } } static void event_sqlfileclose(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { int sqltype = (unsigned long)eventdata; (void)eventtype; (void)img_data; /* Only log the file types we want */ if (!(cnt->conf.database_type) || (sqltype & cnt->sql_mask) == 0) { return; } else { dbse_fileclose(cnt, filename, sqltype, tv1); } } static void on_area_command(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)eventtype; (void)img_data; (void)filename; (void)eventdata; (void)tv1; if (cnt->conf.on_area_detected) { exec_command(cnt, cnt->conf.on_area_detected, NULL, 0); } } static void on_event_start_command(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)eventtype; (void)img_data; (void)filename; (void)eventdata; (void)tv1; if (cnt->conf.on_event_start) { exec_command(cnt, cnt->conf.on_event_start, NULL, 0); } } static void on_event_end_command(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)eventtype; (void)img_data; (void)filename; (void)eventdata; (void)tv1; if (cnt->conf.on_event_end) { exec_command(cnt, cnt->conf.on_event_end, NULL, 0); } } static void event_stream_put(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { int subsize; (void)eventtype; (void)filename; (void)eventdata; (void)tv1; pthread_mutex_lock(&cnt->mutex_stream); /* Normal stream processing */ if (cnt->stream_norm.cnct_count > 0) { if (cnt->stream_norm.jpeg_data == NULL) { cnt->stream_norm.jpeg_data = mymalloc(cnt->imgs.size_norm); } if (img_data->image_norm != NULL) { cnt->stream_norm.jpeg_size = put_picture_memory(cnt ,cnt->stream_norm.jpeg_data ,cnt->imgs.size_norm ,img_data->image_norm ,cnt->conf.stream_quality ,cnt->imgs.width ,cnt->imgs.height); } } /* Substream processing */ if (cnt->stream_sub.cnct_count > 0) { if (cnt->stream_sub.jpeg_data == NULL) { cnt->stream_sub.jpeg_data = mymalloc(cnt->imgs.size_norm); } if (img_data->image_norm != NULL) { /* Resulting substream image must be multiple of 8 */ if (((cnt->imgs.width % 16) == 0) && ((cnt->imgs.height % 16) == 0)) { subsize = ((cnt->imgs.width / 2) * (cnt->imgs.height / 2) * 3 / 2); if (cnt->imgs.substream_image == NULL) { cnt->imgs.substream_image = mymalloc(subsize); } pic_scale_img(cnt->imgs.width ,cnt->imgs.height ,img_data->image_norm ,cnt->imgs.substream_image); cnt->stream_sub.jpeg_size = put_picture_memory(cnt ,cnt->stream_sub.jpeg_data ,subsize ,cnt->imgs.substream_image ,cnt->conf.stream_quality ,(cnt->imgs.width / 2) ,(cnt->imgs.height / 2)); } else { /* Substream was not multiple of 8 so send full image*/ cnt->stream_sub.jpeg_size = put_picture_memory(cnt ,cnt->stream_sub.jpeg_data ,cnt->imgs.size_norm ,img_data->image_norm ,cnt->conf.stream_quality ,cnt->imgs.width ,cnt->imgs.height); } } } /* Motion stream processing */ if (cnt->stream_motion.cnct_count > 0) { if (cnt->stream_motion.jpeg_data == NULL) { cnt->stream_motion.jpeg_data = mymalloc(cnt->imgs.size_norm); } if (cnt->imgs.img_motion.image_norm != NULL) { cnt->stream_motion.jpeg_size = put_picture_memory(cnt ,cnt->stream_motion.jpeg_data ,cnt->imgs.size_norm ,cnt->imgs.img_motion.image_norm ,cnt->conf.stream_quality ,cnt->imgs.width ,cnt->imgs.height); } } /* Source stream processing */ if (cnt->stream_source.cnct_count > 0) { if (cnt->stream_source.jpeg_data == NULL) { cnt->stream_source.jpeg_data = mymalloc(cnt->imgs.size_norm); } if (cnt->imgs.image_virgin.image_norm != NULL) { cnt->stream_source.jpeg_size = put_picture_memory(cnt ,cnt->stream_source.jpeg_data ,cnt->imgs.size_norm ,cnt->imgs.image_virgin.image_norm ,cnt->conf.stream_quality ,cnt->imgs.width ,cnt->imgs.height); } } pthread_mutex_unlock(&cnt->mutex_stream); } #if defined(HAVE_V4L2) && !defined(BSD) static void event_vlp_putpipe(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)eventtype; (void)filename; (void)tv1; if (*(int *)eventdata >= 0) { if (vlp_putpipe(*(int *)eventdata, img_data->image_norm, cnt->imgs.size_norm) == -1) { MOTION_LOG(ERR, TYPE_EVENTS, SHOW_ERRNO ,_("Failed to put image into video pipe")); } } } #endif /* defined(HAVE_V4L2) && !defined(BSD) */ const char *imageext(struct context *cnt) { if (cnt->imgs.picture_type == IMAGE_TYPE_PPM) { return "ppm"; } if (cnt->imgs.picture_type == IMAGE_TYPE_WEBP) { return "webp"; } return "jpg"; } static void event_image_detect(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { char fullfilename[PATH_MAX]; char fname[PATH_MAX]; int passthrough; (void)eventtype; (void)filename; (void)eventdata; if (cnt->new_img & NEWIMG_ON) { const char *imagepath; /* * conf.imagepath would normally be defined but if someone deleted it by control interface * it is better to revert to the default than fail */ if (cnt->conf.picture_filename) { imagepath = cnt->conf.picture_filename; } else { imagepath = DEF_IMAGEPATH; } mystrftime(cnt, fname, sizeof(fname), imagepath, tv1, NULL, 0); snprintf(fullfilename, PATH_MAX, "%.*s/%.*s.%s" , (int)(PATH_MAX-2-strlen(fname)-strlen(imageext(cnt))) , cnt->conf.target_dir , (int)(PATH_MAX-2-strlen(cnt->conf.target_dir)-strlen(imageext(cnt))) , fname, imageext(cnt)); passthrough = util_check_passthrough(cnt); if ((cnt->imgs.size_high > 0) && (!passthrough)) { put_picture(cnt, fullfilename,img_data->image_high, FTYPE_IMAGE); } else { put_picture(cnt, fullfilename,img_data->image_norm, FTYPE_IMAGE); } event(cnt, EVENT_FILECREATE, NULL, fullfilename, (void *)FTYPE_IMAGE, tv1); } } static void event_imagem_detect(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { struct config *conf = &cnt->conf; char fullfilenamem[PATH_MAX]; char fname[PATH_MAX]; char filenamem[PATH_MAX]; (void)eventtype; (void)img_data; (void)filename; (void)eventdata; if (conf->picture_output_motion) { const char *imagepath; /* * conf.picture_filename would normally be defined but if someone deleted it by control interface * it is better to revert to the default than fail */ if (cnt->conf.picture_filename) { imagepath = cnt->conf.picture_filename; } else { imagepath = DEF_IMAGEPATH; } mystrftime(cnt, fname, sizeof(fname), imagepath, tv1, NULL, 0); /* motion images gets same name as normal images plus an appended 'm' */ snprintf(filenamem, PATH_MAX, "%.*sm" , (int)(PATH_MAX-1-strlen(fname)) , fname); snprintf(fullfilenamem, PATH_MAX, "%.*s/%.*s.%s" , (int)(PATH_MAX-2-strlen(filenamem)-strlen(imageext(cnt))) , cnt->conf.target_dir , (int)(PATH_MAX-2-strlen(cnt->conf.target_dir)-strlen(imageext(cnt))) , filenamem, imageext(cnt)); put_picture(cnt, fullfilenamem, cnt->imgs.img_motion.image_norm, FTYPE_IMAGE_MOTION); event(cnt, EVENT_FILECREATE, NULL, fullfilenamem, (void *)FTYPE_IMAGE, tv1); } } static void event_image_snapshot(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { char fullfilename[PATH_MAX]; char fname[PATH_MAX]; char filepath[PATH_MAX]; int offset = 0; int len = strlen(cnt->conf.snapshot_filename); int passthrough; (void)eventtype; (void)filename; (void)eventdata; if (len >= 9) { offset = len - 8; } if (mystrne(cnt->conf.snapshot_filename+offset, "lastsnap")) { char linkpath[PATH_MAX]; const char *snappath; /* * conf.snapshot_filename would normally be defined but if someone deleted it by control interface * it is better to revert to the default than fail */ if (cnt->conf.snapshot_filename) { snappath = cnt->conf.snapshot_filename; } else { snappath = DEF_SNAPPATH; } mystrftime(cnt, filepath, sizeof(filepath), snappath, tv1, NULL, 0); snprintf(fname, PATH_MAX, "%.*s.%s" , (int)(PATH_MAX-1-strlen(filepath)-strlen(imageext(cnt))) , filepath, imageext(cnt)); snprintf(fullfilename, PATH_MAX, "%.*s/%.*s" , (int)(PATH_MAX-1-strlen(fname)) , cnt->conf.target_dir , (int)(PATH_MAX-1-strlen(cnt->conf.target_dir)) , fname); passthrough = util_check_passthrough(cnt); if ((cnt->imgs.size_high > 0) && (!passthrough)) { put_picture(cnt, fullfilename, img_data->image_high, FTYPE_IMAGE_SNAPSHOT); } else { put_picture(cnt, fullfilename, img_data->image_norm, FTYPE_IMAGE_SNAPSHOT); } event(cnt, EVENT_FILECREATE, NULL, fullfilename, (void *)FTYPE_IMAGE_SNAPSHOT, tv1); /* * Update symbolic link *after* image has been written so that * the link always points to a valid file. */ snprintf(linkpath, PATH_MAX, "%.*s/lastsnap.%s" , (int)(PATH_MAX-strlen("/lastsnap.")-strlen(imageext(cnt))) , cnt->conf.target_dir, imageext(cnt)); remove(linkpath); if (symlink(fname, linkpath)) { MOTION_LOG(ERR, TYPE_EVENTS, SHOW_ERRNO ,_("Could not create symbolic link [%s]"), fname); return; } } else { mystrftime(cnt, filepath, sizeof(filepath), cnt->conf.snapshot_filename, tv1, NULL, 0); snprintf(fname, PATH_MAX, "%.*s.%s" , (int)(PATH_MAX-1-strlen(imageext(cnt))) , filepath, imageext(cnt)); snprintf(fullfilename, PATH_MAX, "%.*s/%.*s" , (int)(PATH_MAX-1-strlen(fname)) , cnt->conf.target_dir , (int)(PATH_MAX-1-strlen(cnt->conf.target_dir)) , fname); remove(fullfilename); passthrough = util_check_passthrough(cnt); if ((cnt->imgs.size_high > 0) && (!passthrough)) { put_picture(cnt, fullfilename, img_data->image_high, FTYPE_IMAGE_SNAPSHOT); } else { put_picture(cnt, fullfilename, img_data->image_norm, FTYPE_IMAGE_SNAPSHOT); } event(cnt, EVENT_FILECREATE, NULL, fullfilename, (void *)FTYPE_IMAGE_SNAPSHOT, tv1); } cnt->snapshot = 0; } /** * event_image_preview * event_image_preview * * Returns nothing. */ static void event_image_preview(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { int use_imagepath; const char *imagepath; char previewname[PATH_MAX]; char fname[PATH_MAX]; struct image_data *saved_current_image; int passthrough, retcd; (void)eventtype; (void)img_data; (void)filename; (void)eventdata; if (cnt->imgs.preview_image.diffs) { saved_current_image = cnt->current_image; cnt->current_image = &cnt->imgs.preview_image; /* Use filename of movie i.o. jpeg_filename when set to 'preview'. */ use_imagepath = strcmp(cnt->conf.picture_filename, "preview"); if ((cnt->ffmpeg_output || (cnt->conf.movie_extpipe_use && cnt->extpipe)) && !use_imagepath) { if (cnt->conf.movie_extpipe_use && cnt->extpipe) { retcd = snprintf(previewname, PATH_MAX,"%s.%s" , cnt->extpipefilename, imageext(cnt)); if ((retcd < 0) || (retcd >= PATH_MAX)) { MOTION_LOG(ERR, TYPE_EVENTS, NO_ERRNO ,_("Error creating preview pipe name %d %s") ,retcd, previewname); return; } } else { /* Replace avi/mpg with jpg/ppm and keep the rest of the filename. */ /* TODO: Hope that extensions are always 3 bytes*/ /* -2 to allow for null terminating byte*/ retcd = snprintf(fname, strlen(cnt->newfilename) - 2 ,"%s", cnt->newfilename); if (retcd < 0) { MOTION_LOG(ERR, TYPE_EVENTS, NO_ERRNO ,_("Error creating file name base %d %s") ,retcd, fname); return; } retcd = snprintf(previewname, PATH_MAX ,"%s%s", fname, imageext(cnt)); if ((retcd < 0) || (retcd >= PATH_MAX)) { MOTION_LOG(ERR, TYPE_EVENTS, NO_ERRNO ,_("Error creating preview name %d %s") , retcd, previewname); return; } } passthrough = util_check_passthrough(cnt); if ((cnt->imgs.size_high > 0) && (!passthrough)) { put_picture(cnt, previewname, cnt->imgs.preview_image.image_high , FTYPE_IMAGE); } else { put_picture(cnt, previewname, cnt->imgs.preview_image.image_norm , FTYPE_IMAGE); } event(cnt, EVENT_FILECREATE, NULL, previewname, (void *)FTYPE_IMAGE, tv1); } else { /* * Save best preview-shot also when no movies are recorded or imagepath * is used. Filename has to be generated - nothing available to reuse! */ /* * conf.picture_filename would normally be defined but if someone deleted it by * control interface it is better to revert to the default than fail. */ if (cnt->conf.picture_filename) { imagepath = cnt->conf.picture_filename; } else { imagepath = (char *)DEF_IMAGEPATH; } mystrftime(cnt, fname, sizeof(fname), imagepath, &cnt->imgs.preview_image.timestamp_tv, NULL, 0); snprintf(previewname, PATH_MAX, "%.*s/%.*s.%s" , (int)(PATH_MAX-2-strlen(fname)-strlen(imageext(cnt))) , cnt->conf.target_dir , (int)(PATH_MAX-2-strlen(cnt->conf.target_dir)-strlen(imageext(cnt))) , fname, imageext(cnt)); passthrough = util_check_passthrough(cnt); if ((cnt->imgs.size_high > 0) && (!passthrough)) { put_picture(cnt, previewname, cnt->imgs.preview_image.image_high , FTYPE_IMAGE); } else { put_picture(cnt, previewname, cnt->imgs.preview_image.image_norm, FTYPE_IMAGE); } event(cnt, EVENT_FILECREATE, NULL, previewname, (void *)FTYPE_IMAGE, tv1); } /* Restore global context values. */ cnt->current_image = saved_current_image; } } static void event_camera_lost(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)eventtype; (void)img_data; (void)filename; (void)eventdata; (void)tv1; if (cnt->conf.on_camera_lost) { exec_command(cnt, cnt->conf.on_camera_lost, NULL, 0); } } static void event_camera_found(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)eventtype; (void)img_data; (void)filename; (void)eventdata; (void)tv1; if (cnt->conf.on_camera_found) { exec_command(cnt, cnt->conf.on_camera_found, NULL, 0); } } static void on_movie_end_command(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { int filetype = (unsigned long) eventdata; (void)eventtype; (void)img_data; (void)tv1; if ((filetype & FTYPE_MPEG_ANY) && cnt->conf.on_movie_end) { exec_command(cnt, cnt->conf.on_movie_end, filename, filetype); } } static void event_extpipe_end(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)eventtype; (void)img_data; (void)filename; (void)eventdata; if (cnt->extpipe_open) { cnt->extpipe_open = 0; fflush(cnt->extpipe); MOTION_LOG(NTC, TYPE_EVENTS, NO_ERRNO ,_("CLOSING: extpipe file desc %d, error state %d") ,fileno(cnt->extpipe), ferror(cnt->extpipe)); MOTION_LOG(NTC, TYPE_EVENTS, NO_ERRNO, _("pclose return: %d"), pclose(cnt->extpipe)); event(cnt, EVENT_FILECLOSE, NULL, cnt->extpipefilename, (void *)FTYPE_MPEG, tv1); cnt->extpipe = NULL; } } static void event_create_extpipe(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { int retcd; (void)eventtype; (void)img_data; (void)filename; (void)eventdata; if ((cnt->conf.movie_extpipe_use) && (cnt->conf.movie_extpipe)) { char stamp[PATH_MAX] = ""; const char *moviepath; cnt->movie_last_shot = -1; cnt->movie_fps = cnt->lastrate; cnt->movie_tv.tv_sec = tv1->tv_sec; cnt->movie_tv.tv_usec = tv1->tv_usec; MOTION_LOG(INF, TYPE_EVENTS, NO_ERRNO, _("Source FPS %d"), cnt->movie_fps); if (cnt->movie_fps < 2) { cnt->movie_fps = 2; } /* * conf.mpegpath would normally be defined but if someone deleted it by control interface * it is better to revert to the default than fail */ if (cnt->conf.movie_filename) { moviepath = cnt->conf.movie_filename; } else { moviepath = DEF_MOVIEPATH; MOTION_LOG(NTC, TYPE_EVENTS, NO_ERRNO, _("moviepath: %s"), moviepath); } mystrftime(cnt, stamp, sizeof(stamp), moviepath, tv1, NULL, 0); snprintf(cnt->extpipefilename, PATH_MAX - 4, "%.*s/%.*s" , (int)(PATH_MAX-5-strlen(stamp)) , cnt->conf.target_dir , (int)(PATH_MAX-5-strlen(cnt->conf.target_dir)) , stamp); if (access(cnt->conf.target_dir, W_OK)!= 0) { /* Permission denied */ if (errno == EACCES) { MOTION_LOG(ERR, TYPE_EVENTS, SHOW_ERRNO ,_("no write access to target directory %s"), cnt->conf.target_dir); return ; /* Path not found - create it */ } else if (errno == ENOENT) { MOTION_LOG(ERR, TYPE_EVENTS, SHOW_ERRNO ,_("path not found, trying to create it %s ..."), cnt->conf.target_dir); if (mycreate_path(cnt->extpipefilename) == -1) { return; } } else { MOTION_LOG(ERR, TYPE_EVENTS, SHOW_ERRNO ,_("error accesing path %s"), cnt->conf.target_dir); return ; } } /* Always create any path specified as file name */ if (mycreate_path(cnt->extpipefilename) == -1) { return; } mystrftime(cnt, stamp, sizeof(stamp), cnt->conf.movie_extpipe, tv1, cnt->extpipefilename, 0); retcd = snprintf(cnt->extpipecmdline, PATH_MAX, "%s", stamp); if ((retcd < 0 ) || (retcd >= PATH_MAX)) { MOTION_LOG(ERR, TYPE_EVENTS, NO_ERRNO , _("Error specifying command line: %s"), cnt->extpipecmdline); return; } MOTION_LOG(NTC, TYPE_EVENTS, NO_ERRNO, _("pipe: %s"), cnt->extpipecmdline); MOTION_LOG(NTC, TYPE_EVENTS, NO_ERRNO, _("cnt->moviefps: %d"), cnt->movie_fps); event(cnt, EVENT_FILECREATE, NULL, cnt->extpipefilename, (void *)FTYPE_MPEG, tv1); cnt->extpipe = popen(cnt->extpipecmdline, "we"); if (cnt->extpipe == NULL) { MOTION_LOG(ERR, TYPE_EVENTS, SHOW_ERRNO, _("popen failed")); return; } setbuf(cnt->extpipe, NULL); cnt->extpipe_open = 1; } } static void event_extpipe_put(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { int passthrough; (void)eventtype; (void)filename; (void)eventdata; (void)tv1; /* Check use_extpipe enabled and ext_pipe not NULL */ if ((cnt->conf.movie_extpipe_use) && (cnt->extpipe != NULL)) { MOTION_LOG(DBG, TYPE_EVENTS, NO_ERRNO, _("Using extpipe")); passthrough = util_check_passthrough(cnt); /* Check that is open */ if ((cnt->extpipe_open) && (fileno(cnt->extpipe) > 0)) { if ((cnt->imgs.size_high > 0) && (!passthrough)) { if (!fwrite(img_data->image_high, cnt->imgs.size_high, 1, cnt->extpipe)) { MOTION_LOG(ERR, TYPE_EVENTS, SHOW_ERRNO ,_("Error writing in pipe , state error %d"), ferror(cnt->extpipe)); } } else { if (!fwrite(img_data->image_norm, cnt->imgs.size_norm, 1, cnt->extpipe)) { MOTION_LOG(ERR, TYPE_EVENTS, SHOW_ERRNO ,_("Error writing in pipe , state error %d"), ferror(cnt->extpipe)); } } } else { MOTION_LOG(ERR, TYPE_EVENTS, NO_ERRNO ,_("pipe %s not created or closed already "), cnt->extpipecmdline); } } } static void event_ffmpeg_newfile(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { char stamp[PATH_MAX]; const char *moviepath; const char *codec; long codenbr; int retcd; (void)eventtype; (void)img_data; (void)filename; (void)eventdata; if (!cnt->conf.movie_output && !cnt->conf.movie_output_motion) { return; } cnt->movie_last_shot = -1; cnt->movie_fps = cnt->lastrate; cnt->movie_tv.tv_sec = tv1->tv_sec; cnt->movie_tv.tv_usec = tv1->tv_usec; MOTION_LOG(INF, TYPE_EVENTS, NO_ERRNO, _("Source FPS %d"), cnt->movie_fps); if (cnt->movie_fps < 2) { cnt->movie_fps = 2; } /* * path would normally be defined but if someone deleted it by control interface * it is better to revert to the default than fail */ if (cnt->conf.movie_filename) { moviepath = cnt->conf.movie_filename; } else { moviepath = DEF_MOVIEPATH; } mystrftime(cnt, stamp, sizeof(stamp), moviepath, tv1, NULL, 0); /* * motion movies get the same name as normal movies plus an appended 'm' * PATH_MAX - 4 to allow for .mpg to be appended without overflow */ /* The following section allows for testing of all the various containers * that Motion permits. The container type is pre-pended to the name of the * file so that we can determine which container type created what movie. * The intent for this is be used for developer testing when the ffmpeg libs * change or the code inside our ffmpeg module changes. For each event, the * container type will change. This way, you can turn on emulate motion, then * specify a maximum movie time and let Motion run for days creating all the * different types of movies checking for crashes, warnings, etc. */ codec = cnt->conf.movie_codec; if (mystreq(codec, "ogg")) { MOTION_LOG(WRN, TYPE_ENCODER, NO_ERRNO, _("The ogg container is no longer supported. Changing to mpeg4")); codec = "mpeg4"; } if (mystreq(codec, "test")) { MOTION_LOG(NTC, TYPE_ENCODER, NO_ERRNO, _("Running test of the various output formats.")); codenbr = cnt->event_nr % 10; switch (codenbr) { case 1: codec = "mpeg4"; break; case 2: codec = "msmpeg4"; break; case 3: codec = "swf"; break; case 4: codec = "flv"; break; case 5: codec = "ffv1"; break; case 6: codec = "mov"; break; case 7: codec = "mp4"; break; case 8: codec = "mkv"; break; case 9: codec = "hevc"; break; default: codec = "msmpeg4"; break; } snprintf(cnt->motionfilename, PATH_MAX - 4, "%.*s/%s_%.*sm" , (int)(PATH_MAX-7-strlen(stamp)-strlen(codec)) , cnt->conf.target_dir, codec , (int)(PATH_MAX-7-strlen(cnt->conf.target_dir)-strlen(codec)) , stamp); snprintf(cnt->newfilename, PATH_MAX - 4, "%.*s/%s_%.*s" , (int)(PATH_MAX-6-strlen(stamp)-strlen(codec)) , cnt->conf.target_dir, codec , (int)(PATH_MAX-6-strlen(cnt->conf.target_dir)-strlen(codec)) , stamp); } else { snprintf(cnt->motionfilename, PATH_MAX - 4, "%.*s/%.*sm" , (int)(PATH_MAX-6-strlen(stamp)) , cnt->conf.target_dir , (int)(PATH_MAX-6-strlen(cnt->conf.target_dir)) , stamp); snprintf(cnt->newfilename, PATH_MAX - 4, "%.*s/%.*s" , (int)(PATH_MAX-5-strlen(stamp)) , cnt->conf.target_dir , (int)(PATH_MAX-5-strlen(cnt->conf.target_dir)) , stamp); } if (cnt->conf.movie_output) { cnt->ffmpeg_output = mymalloc(sizeof(struct ffmpeg)); if (cnt->imgs.size_high > 0) { cnt->ffmpeg_output->width = cnt->imgs.width_high; cnt->ffmpeg_output->height = cnt->imgs.height_high; cnt->ffmpeg_output->high_resolution = TRUE; cnt->ffmpeg_output->rtsp_data = cnt->rtsp_high; } else { cnt->ffmpeg_output->width = cnt->imgs.width; cnt->ffmpeg_output->height = cnt->imgs.height; cnt->ffmpeg_output->high_resolution = FALSE; cnt->ffmpeg_output->rtsp_data = cnt->rtsp; } cnt->ffmpeg_output->tlapse = TIMELAPSE_NONE; cnt->ffmpeg_output->fps = cnt->movie_fps; cnt->ffmpeg_output->bps = cnt->conf.movie_bps; cnt->ffmpeg_output->filename = cnt->newfilename; cnt->ffmpeg_output->quality = cnt->conf.movie_quality; cnt->ffmpeg_output->start_time.tv_sec = tv1->tv_sec; cnt->ffmpeg_output->start_time.tv_usec = tv1->tv_usec; cnt->ffmpeg_output->last_pts = -1; cnt->ffmpeg_output->base_pts = 0; cnt->ffmpeg_output->gop_cnt = 0; cnt->ffmpeg_output->codec_name = codec; if (mystreq(cnt->conf.movie_codec, "test")) { cnt->ffmpeg_output->test_mode = 1; } else { cnt->ffmpeg_output->test_mode = 0; } cnt->ffmpeg_output->motion_images = 0; cnt->ffmpeg_output->passthrough =util_check_passthrough(cnt); retcd = ffmpeg_open(cnt->ffmpeg_output); if (retcd < 0) { MOTION_LOG(ERR, TYPE_EVENTS, NO_ERRNO ,_("Error opening context for movie output.")); free(cnt->ffmpeg_output); cnt->ffmpeg_output=NULL; return; } event(cnt, EVENT_FILECREATE, NULL, cnt->newfilename, (void *)FTYPE_MPEG, tv1); } if (cnt->conf.movie_output_motion) { cnt->ffmpeg_output_motion = mymalloc(sizeof(struct ffmpeg)); cnt->ffmpeg_output_motion->width = cnt->imgs.width; cnt->ffmpeg_output_motion->height = cnt->imgs.height; cnt->ffmpeg_output_motion->rtsp_data = NULL; cnt->ffmpeg_output_motion->tlapse = TIMELAPSE_NONE; cnt->ffmpeg_output_motion->fps = cnt->movie_fps; cnt->ffmpeg_output_motion->bps = cnt->conf.movie_bps; cnt->ffmpeg_output_motion->filename = cnt->motionfilename; cnt->ffmpeg_output_motion->quality = cnt->conf.movie_quality; cnt->ffmpeg_output_motion->start_time.tv_sec = tv1->tv_sec; cnt->ffmpeg_output_motion->start_time.tv_usec = tv1->tv_usec; cnt->ffmpeg_output_motion->last_pts = -1; cnt->ffmpeg_output_motion->base_pts = 0; cnt->ffmpeg_output_motion->gop_cnt = 0; cnt->ffmpeg_output_motion->codec_name = codec; if (mystreq(cnt->conf.movie_codec, "test")) { cnt->ffmpeg_output_motion->test_mode = TRUE; } else { cnt->ffmpeg_output_motion->test_mode = FALSE; } cnt->ffmpeg_output_motion->motion_images = TRUE; cnt->ffmpeg_output_motion->passthrough = FALSE; cnt->ffmpeg_output_motion->high_resolution = FALSE; cnt->ffmpeg_output_motion->rtsp_data = NULL; retcd = ffmpeg_open(cnt->ffmpeg_output_motion); if (retcd < 0) { MOTION_LOG(ERR, TYPE_EVENTS, NO_ERRNO ,_("ffopen_open error creating (motion) file [%s]"), cnt->motionfilename); free(cnt->ffmpeg_output_motion); cnt->ffmpeg_output_motion = NULL; return; } } } static void event_ffmpeg_timelapse(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { int retcd; int passthrough; (void)eventtype; (void)filename; (void)eventdata; if (!cnt->ffmpeg_timelapse) { char tmp[PATH_MAX]; const char *timepath; const char *codec_mpg = "mpg"; const char *codec_mpeg = "mpeg4"; /* * conf.timelapse_filename would normally be defined but if someone deleted it by control interface * it is better to revert to the default than fail */ if (cnt->conf.timelapse_filename) { timepath = cnt->conf.timelapse_filename; } else { timepath = DEF_TIMEPATH; } mystrftime(cnt, tmp, sizeof(tmp), timepath, tv1, NULL, 0); /* PATH_MAX - 4 to allow for .mpg to be appended without overflow */ snprintf(cnt->timelapsefilename, PATH_MAX - 4, "%.*s/%.*s" , (int)(PATH_MAX-5-strlen(tmp)) , cnt->conf.target_dir , (int)(PATH_MAX-5-strlen(cnt->conf.target_dir)) , tmp); passthrough = util_check_passthrough(cnt); cnt->ffmpeg_timelapse = mymalloc(sizeof(struct ffmpeg)); if ((cnt->imgs.size_high > 0) && (!passthrough)) { cnt->ffmpeg_timelapse->width = cnt->imgs.width_high; cnt->ffmpeg_timelapse->height = cnt->imgs.height_high; cnt->ffmpeg_timelapse->high_resolution = TRUE; } else { cnt->ffmpeg_timelapse->width = cnt->imgs.width; cnt->ffmpeg_timelapse->height = cnt->imgs.height; cnt->ffmpeg_timelapse->high_resolution = FALSE; } cnt->ffmpeg_timelapse->fps = cnt->conf.timelapse_fps; cnt->ffmpeg_timelapse->bps = cnt->conf.movie_bps; cnt->ffmpeg_timelapse->filename = cnt->timelapsefilename; cnt->ffmpeg_timelapse->quality = cnt->conf.movie_quality; cnt->ffmpeg_timelapse->start_time.tv_sec = tv1->tv_sec; cnt->ffmpeg_timelapse->start_time.tv_usec = tv1->tv_usec; cnt->ffmpeg_timelapse->last_pts = -1; cnt->ffmpeg_timelapse->base_pts = 0; cnt->ffmpeg_timelapse->test_mode = FALSE; cnt->ffmpeg_timelapse->gop_cnt = 0; cnt->ffmpeg_timelapse->motion_images = FALSE; cnt->ffmpeg_timelapse->passthrough = FALSE; cnt->ffmpeg_timelapse->rtsp_data = NULL; if ((mystreq(cnt->conf.timelapse_codec,"mpg")) || (mystreq(cnt->conf.timelapse_codec,"swf"))) { if (mystreq(cnt->conf.timelapse_codec,"swf")) { MOTION_LOG(WRN, TYPE_EVENTS, NO_ERRNO ,_("The swf container for timelapse no longer supported. Using mpg container.")); } MOTION_LOG(NTC, TYPE_EVENTS, NO_ERRNO, _("Timelapse using mpg codec.")); MOTION_LOG(NTC, TYPE_EVENTS, NO_ERRNO, _("Events will be appended to file")); cnt->ffmpeg_timelapse->tlapse = TIMELAPSE_APPEND; cnt->ffmpeg_timelapse->codec_name = codec_mpg; retcd = ffmpeg_open(cnt->ffmpeg_timelapse); } else { MOTION_LOG(NTC, TYPE_EVENTS, NO_ERRNO, _("Timelapse using mpeg4 codec.")); MOTION_LOG(NTC, TYPE_EVENTS, NO_ERRNO, _("Events will be trigger new files")); cnt->ffmpeg_timelapse->tlapse = TIMELAPSE_NEW; cnt->ffmpeg_timelapse->codec_name = codec_mpeg; retcd = ffmpeg_open(cnt->ffmpeg_timelapse); } if (retcd < 0) { MOTION_LOG(ERR, TYPE_EVENTS, NO_ERRNO ,_("ffopen_open error creating (timelapse) file [%s]"), cnt->timelapsefilename); free(cnt->ffmpeg_timelapse); cnt->ffmpeg_timelapse = NULL; return; } event(cnt, EVENT_FILECREATE, NULL, cnt->timelapsefilename, (void *)FTYPE_MPEG_TIMELAPSE, tv1); } if (ffmpeg_put_image(cnt->ffmpeg_timelapse, img_data, tv1) == -1) { MOTION_LOG(ERR, TYPE_EVENTS, NO_ERRNO, _("Error encoding image")); } } static void event_ffmpeg_put(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)eventtype; (void)filename; (void)eventdata; if (cnt->ffmpeg_output) { if (ffmpeg_put_image(cnt->ffmpeg_output, img_data, tv1) == -1) { MOTION_LOG(ERR, TYPE_EVENTS, NO_ERRNO, _("Error encoding image")); } } if (cnt->ffmpeg_output_motion) { if (ffmpeg_put_image(cnt->ffmpeg_output_motion, &cnt->imgs.img_motion, tv1) == -1) { MOTION_LOG(ERR, TYPE_EVENTS, NO_ERRNO, _("Error encoding image")); } } } static void event_ffmpeg_closefile(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)eventtype; (void)img_data; (void)filename; (void)eventdata; if (cnt->ffmpeg_output) { ffmpeg_close(cnt->ffmpeg_output); free(cnt->ffmpeg_output); cnt->ffmpeg_output = NULL; event(cnt, EVENT_FILECLOSE, NULL, cnt->newfilename, (void *)FTYPE_MPEG, tv1); } if (cnt->ffmpeg_output_motion) { ffmpeg_close(cnt->ffmpeg_output_motion); free(cnt->ffmpeg_output_motion); cnt->ffmpeg_output_motion = NULL; event(cnt, EVENT_FILECLOSE, NULL, cnt->motionfilename, (void *)FTYPE_MPEG_MOTION, tv1); } } static void event_ffmpeg_timelapseend(struct context *cnt, motion_event eventtype , struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { (void)eventtype; (void)img_data; (void)filename; (void)eventdata; if (cnt->ffmpeg_timelapse) { ffmpeg_close(cnt->ffmpeg_timelapse); free(cnt->ffmpeg_timelapse); cnt->ffmpeg_timelapse = NULL; event(cnt, EVENT_FILECLOSE, NULL, cnt->timelapsefilename, (void *)FTYPE_MPEG_TIMELAPSE, tv1); } } /* * Starting point for all events */ struct event_handlers { motion_event eventtype; event_handler handler; }; struct event_handlers event_handlers[] = { { EVENT_FILECREATE, event_sqlnewfile }, { EVENT_FILECREATE, on_picture_save_command }, { EVENT_FILECREATE, event_newfile }, { EVENT_MOTION, event_beep }, { EVENT_MOTION, on_motion_detected_command }, { EVENT_AREA_DETECTED, on_area_command }, { EVENT_FIRSTMOTION, event_sqlfirstmotion }, { EVENT_FIRSTMOTION, on_event_start_command }, { EVENT_ENDMOTION, on_event_end_command }, { EVENT_IMAGE_DETECTED, event_image_detect }, { EVENT_IMAGEM_DETECTED, event_imagem_detect }, { EVENT_IMAGE_SNAPSHOT, event_image_snapshot }, #if defined(HAVE_V4L2) && !defined(BSD) { EVENT_IMAGE, event_vlp_putpipe }, { EVENT_IMAGEM, event_vlp_putpipe }, #endif /* defined(HAVE_V4L2) && !defined(BSD) */ { EVENT_IMAGE_PREVIEW, event_image_preview }, { EVENT_STREAM, event_stream_put }, { EVENT_FIRSTMOTION, event_ffmpeg_newfile }, { EVENT_IMAGE_DETECTED, event_ffmpeg_put }, { EVENT_FFMPEG_PUT, event_ffmpeg_put }, { EVENT_ENDMOTION, event_ffmpeg_closefile }, { EVENT_TIMELAPSE, event_ffmpeg_timelapse }, { EVENT_TIMELAPSEEND, event_ffmpeg_timelapseend }, { EVENT_FILECLOSE, event_sqlfileclose }, { EVENT_FILECLOSE, on_movie_end_command }, { EVENT_FILECLOSE, event_closefile }, { EVENT_FIRSTMOTION, event_create_extpipe }, { EVENT_IMAGE_DETECTED, event_extpipe_put }, { EVENT_FFMPEG_PUT, event_extpipe_put }, { EVENT_ENDMOTION, event_extpipe_end }, { EVENT_CAMERA_LOST, event_camera_lost }, { EVENT_CAMERA_FOUND, event_camera_found }, { EVENT_MOVIE_END, event_ffmpeg_closefile }, { EVENT_MOVIE_END, event_extpipe_end }, { EVENT_MOVIE_START, event_ffmpeg_newfile }, { EVENT_MOVIE_START, event_create_extpipe }, {0, NULL} }; /** * event * defined with the following parameters: * - Type as defined in event.h (EVENT_...) * - The global context struct cnt * - img_data - A pointer to a image_data context used for images * - filename - A pointer to typically a string for a file path * - eventdata - A void pointer that can be cast to anything. E.g. FTYPE_... * - tm - A tm struct that carries a full time structure * The split between unsigned images and signed filenames was introduced in 3.2.2 * as a code reading friendly solution to avoid a stream of compiler warnings in gcc 4.0. */ void event(struct context *cnt, motion_event eventtype, struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1) { int i=-1; while (event_handlers[++i].handler) { if (eventtype == event_handlers[i].eventtype) { event_handlers[i].handler(cnt, eventtype, img_data, filename, eventdata, tv1); } } } motion-release-4.6.0/src/event.h000066400000000000000000000033711452402535500165360ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * event.h * Headers associated with functions in the event.c module. * Copyright Jeroen Vreeken, 2002 */ #ifndef _INCLUDE_EVENT_H_ #define _INCLUDE_EVENT_H_ typedef enum { EVENT_FILECREATE = 1, EVENT_MOTION, EVENT_FIRSTMOTION, EVENT_ENDMOTION, EVENT_TIMELAPSE, EVENT_TIMELAPSEEND, EVENT_STREAM, EVENT_IMAGE_DETECTED, EVENT_IMAGEM_DETECTED, EVENT_IMAGE_SNAPSHOT, EVENT_IMAGE, EVENT_IMAGEM, EVENT_IMAGE_PREVIEW, EVENT_FILECLOSE, EVENT_DEBUG, EVENT_CRITICAL, EVENT_AREA_DETECTED, EVENT_CAMERA_LOST, EVENT_CAMERA_FOUND, EVENT_FFMPEG_PUT, EVENT_MOVIE_START, EVENT_MOVIE_END, EVENT_LAST } motion_event; typedef void(* event_handler)(struct context *cnt, motion_event type, struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1); void event(struct context *cnt, motion_event type, struct image_data *img_data, char *filename, void *eventdata, struct timeval *tv1); const char *imageext(struct context *cnt); #endif /* _INCLUDE_EVENT_H_ */ motion-release-4.6.0/src/ffmpeg.c000066400000000000000000001505231452402535500166560ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * * ffmpeg.c * * The contents of this file has been derived from output_example.c * and apiexample.c from the FFmpeg distribution. * * This file has been modified so that only major versions greater than * 53 are supported. * Note that while the conditions are based upon LIBAVFORMAT, not all of the changes are * specific to libavformat.h. Some changes could be related to other components of ffmpeg. * This is for simplicity. The avformat version has historically changed at the same time * as the other components so it is easier to have a single version number to track rather * than the particular version numbers which are associated with each component. * The libav variant also has different apis with the same major/minor version numbers. * As such, it is occasionally necessary to look at the microversion number. Numbers * greater than 100 for micro version indicate ffmpeg whereas numbers less than 100 * indicate libav */ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include "netcam.h" #include "netcam_rtsp.h" #include "ffmpeg.h" #ifdef HAVE_FFMPEG static void ffmpeg_free_pkt(struct ffmpeg *ffmpeg) { if (ffmpeg->pkt != NULL) { my_packet_free(ffmpeg->pkt); } ffmpeg->pkt = NULL; } static void ffmpeg_free_nal(struct ffmpeg *ffmpeg) { if (ffmpeg->nal_info) { free(ffmpeg->nal_info); ffmpeg->nal_info = NULL; ffmpeg->nal_info_len = 0; } } static int ffmpeg_encode_nal(struct ffmpeg *ffmpeg) { // h264_v4l2m2m has NAL units separated from the first frame, which makes // some players very unhappy. if ((ffmpeg->pkt->pts == 0) && (!(ffmpeg->pkt->flags & AV_PKT_FLAG_KEY))) { ffmpeg_free_nal(ffmpeg); ffmpeg->nal_info_len = ffmpeg->pkt->size; ffmpeg->nal_info = malloc(ffmpeg->nal_info_len); if (ffmpeg->nal_info) { memcpy(ffmpeg->nal_info, &ffmpeg->pkt->data[0], ffmpeg->nal_info_len); return 1; } else ffmpeg->nal_info_len = 0; } else if (ffmpeg->nal_info) { int old_size = ffmpeg->pkt->size; av_grow_packet(ffmpeg->pkt, ffmpeg->nal_info_len); memmove(&ffmpeg->pkt->data[ffmpeg->nal_info_len], &ffmpeg->pkt->data[0], old_size); memcpy(&ffmpeg->pkt->data[0], ffmpeg->nal_info, ffmpeg->nal_info_len); ffmpeg_free_nal(ffmpeg); } return 0; } static int ffmpeg_timelapse_exists(const char *fname) { FILE *file; /* We do not use myfopen since we are doing * a file check.(using a very poor method) */ file = fopen(fname, "rbe"); if (file) { myfclose(file); return 1; } return 0; } static int ffmpeg_timelapse_append(struct ffmpeg *ffmpeg, AVPacket *pkt) { FILE *file; file = fopen(ffmpeg->filename, "abe"); if (!file) { return -1; } fwrite(pkt->data, 1, pkt->size,file); fclose(file); return 0; } #if ( MYFFVER < 58000) /* TODO Determine if this is even needed for old versions. Per * documentation for version 58, 'av_lockmgr_register This function does nothing' */ static int ffmpeg_lockmgr_cb(void **arg, enum AVLockOp op) { pthread_mutex_t *mutex = *arg; int err; switch (op) { case AV_LOCK_CREATE: mutex = malloc(sizeof(*mutex)); if (!mutex) { return AVERROR(ENOMEM); } if ((err = pthread_mutex_init(mutex, NULL))) { free(mutex); return AVERROR(err); } *arg = mutex; return 0; case AV_LOCK_OBTAIN: if ((err = pthread_mutex_lock(mutex))) { return AVERROR(err); } return 0; case AV_LOCK_RELEASE: if ((err = pthread_mutex_unlock(mutex))) { return AVERROR(err); } return 0; case AV_LOCK_DESTROY: if (mutex) { pthread_mutex_destroy(mutex); } free(mutex); *arg = NULL; return 0; } return 1; } #endif static void ffmpeg_free_context(struct ffmpeg *ffmpeg) { if (ffmpeg->picture != NULL) { my_frame_free(ffmpeg->picture); ffmpeg->picture = NULL; } if (ffmpeg->ctx_codec != NULL) { my_avcodec_close(ffmpeg->ctx_codec); ffmpeg->ctx_codec = NULL; } if (ffmpeg->oc != NULL) { avformat_free_context(ffmpeg->oc); ffmpeg->oc = NULL; } } static int ffmpeg_get_oformat(struct ffmpeg *ffmpeg) { size_t codec_name_len = strcspn(ffmpeg->codec_name, ":"); char *codec_name = malloc(codec_name_len + 1); char basename[PATH_MAX]; int retcd; /* TODO: Rework the extenstion asssignment along with the code in event.c * If extension is ever something other than three bytes, * preceded by . then lots of things will fail */ if (codec_name == NULL) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Failed to allocate memory for codec name")); ffmpeg_free_context(ffmpeg); return -1; } memcpy(codec_name, ffmpeg->codec_name, codec_name_len); codec_name[codec_name_len] = 0; /* Only the newer codec and containers can handle the really fast FPS */ if ((mystreq(codec_name, "msmpeg4") || mystreq(codec_name, "mpeg4") || mystreq(codec_name, "swf")) && (ffmpeg->fps >50)) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("The frame rate specified is too high for the ffmpeg movie type specified. " "Choose a different ffmpeg container or lower framerate.")); ffmpeg_free_context(ffmpeg); free(codec_name); return -1; } retcd = snprintf(basename,PATH_MAX,"%s",ffmpeg->filename); if ((retcd < 0) || (retcd >= PATH_MAX)) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Error setting base file name")); ffmpeg_free_context(ffmpeg); free(codec_name); return -1; } if (ffmpeg->tlapse == TIMELAPSE_APPEND) { ffmpeg->oc->oformat = av_guess_format ("mpeg2video", NULL, NULL); if (ffmpeg->oc->oformat) { ffmpeg->oc->video_codec_id = MY_CODEC_ID_MPEG2VIDEO; } retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.mpg",basename); if ((!ffmpeg->oc->oformat) || (retcd < 0) || (retcd >= PATH_MAX)) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Error setting timelapse append for codec %s"), codec_name); ffmpeg_free_context(ffmpeg); free(codec_name); return -1; } free(codec_name); return 0; } if (mystreq(codec_name, "mpeg4")) { ffmpeg->oc->oformat = av_guess_format("avi", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.avi",basename); if (ffmpeg->oc->oformat) { ffmpeg->oc->video_codec_id = MY_CODEC_ID_MSMPEG4V2; } } if (mystreq(codec_name, "msmpeg4")) { ffmpeg->oc->oformat = av_guess_format("avi", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.avi",basename); if (ffmpeg->oc->oformat) { ffmpeg->oc->video_codec_id = MY_CODEC_ID_MSMPEG4V2; } } if (mystreq(codec_name, "swf")) { ffmpeg->oc->oformat = av_guess_format("swf", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.swf",basename); } if (mystreq(codec_name, "flv")) { ffmpeg->oc->oformat = av_guess_format("flv", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.flv",basename); if (ffmpeg->oc->oformat) { ffmpeg->oc->video_codec_id = MY_CODEC_ID_FLV1; } } if (mystreq(codec_name, "ffv1")) { ffmpeg->oc->oformat = av_guess_format("avi", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.avi",basename); if (ffmpeg->oc->oformat) { ffmpeg->oc->video_codec_id = MY_CODEC_ID_FFV1; } } if (mystreq(codec_name, "mov")) { ffmpeg->oc->oformat = av_guess_format("mov", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.mov",basename); } if (mystreq(codec_name, "mp4")) { ffmpeg->oc->oformat = av_guess_format("mp4", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.mp4",basename); if (ffmpeg->oc->oformat) { ffmpeg->oc->video_codec_id = MY_CODEC_ID_H264; } } if (mystreq(codec_name, "mkv")) { ffmpeg->oc->oformat = av_guess_format("matroska", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.mkv",basename); if (ffmpeg->oc->oformat) { ffmpeg->oc->video_codec_id = MY_CODEC_ID_H264; } } if (mystreq(codec_name, "hevc")) { ffmpeg->oc->oformat = av_guess_format("mp4", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.mp4",basename); ffmpeg->oc->video_codec_id = MY_CODEC_ID_HEVC; } //Check for valid results if ((retcd < 0) || (retcd >= PATH_MAX)) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Error setting file name")); ffmpeg_free_context(ffmpeg); free(codec_name); return -1; } if (!ffmpeg->oc->oformat) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("codec option value %s is not supported"), codec_name); ffmpeg_free_context(ffmpeg); free(codec_name); return -1; } if (ffmpeg->oc->oformat->video_codec == MY_CODEC_ID_NONE) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not get the codec")); ffmpeg_free_context(ffmpeg); free(codec_name); return -1; } free(codec_name); return 0; } static int ffmpeg_encode_video(struct ffmpeg *ffmpeg) { #if ( MYFFVER >= 57041) //ffmpeg version 3.1 and after int retcd = 0; char errstr[128]; retcd = avcodec_send_frame(ffmpeg->ctx_codec, ffmpeg->picture); if (retcd < 0 ) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Error sending frame for encoding:%s"),errstr); return -1; } retcd = avcodec_receive_packet(ffmpeg->ctx_codec, ffmpeg->pkt); if (retcd == AVERROR(EAGAIN)) { //Buffered packet. Throw special return code av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(DBG, TYPE_ENCODER, NO_ERRNO ,_("Receive packet threw EAGAIN returning -2 code :%s"),errstr); ffmpeg_free_pkt(ffmpeg); return -2; } if (retcd < 0 ) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Error receiving encoded packet video:%s"),errstr); //Packet is freed upon failure of encoding return -1; } if (ffmpeg->preferred_codec == USER_CODEC_V4L2M2M) { if (ffmpeg_encode_nal(ffmpeg)) { // Throw special return code return -2; } } return 0; #elif ( MYFFVER > 54006) int retcd = 0; char errstr[128]; int got_packet_ptr; retcd = avcodec_encode_video2(ffmpeg->ctx_codec, ffmpeg->pkt, ffmpeg->picture, &got_packet_ptr); if (retcd < 0 ) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Error encoding video:%s"),errstr); //Packet is freed upon failure of encoding return -1; } if (got_packet_ptr == 0) { //Buffered packet. Throw special return code ffmpeg_free_pkt(ffmpeg); return -2; } /* This kills compiler warnings. Nal setting is only for recent ffmpeg versions*/ if (ffmpeg->preferred_codec == USER_CODEC_V4L2M2M) { if (ffmpeg_encode_nal(ffmpeg)) { // Throw special return code return -2; } } return 0; #else int retcd = 0; uint8_t *video_outbuf; int video_outbuf_size; video_outbuf_size = (ffmpeg->ctx_codec->width +16) * (ffmpeg->ctx_codec->height +16) * 1; video_outbuf = mymalloc(video_outbuf_size); retcd = avcodec_encode_video(ffmpeg->video_st->codec, video_outbuf, video_outbuf_size, ffmpeg->picture); if (retcd < 0 ) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Error encoding video")); ffmpeg_free_pkt(ffmpeg); return -1; } if (retcd == 0 ) { // No bytes encoded => buffered=>special handling ffmpeg_free_pkt(ffmpeg); return -2; } // Encoder did not provide metadata, set it up manually ffmpeg->pkt->size = retcd; ffmpeg->pkt->data = video_outbuf; if (ffmpeg->picture->key_frame == 1) { ffmpeg->pkt->flags |= AV_PKT_FLAG_KEY; } ffmpeg->pkt->pts = ffmpeg->picture->pts; ffmpeg->pkt->dts = ffmpeg->pkt->pts; free(video_outbuf); /* This kills compiler warnings. Nal setting is only for recent ffmpeg versions*/ if (ffmpeg->preferred_codec == USER_CODEC_V4L2M2M) { if (ffmpeg_encode_nal(ffmpeg)) { // Throw special return code return -2; } } return 0; #endif } static int ffmpeg_set_pts(struct ffmpeg *ffmpeg, const struct timeval *tv1) { int64_t pts_interval; if (ffmpeg->tlapse != TIMELAPSE_NONE) { ffmpeg->last_pts++; ffmpeg->picture->pts = ffmpeg->last_pts; } else { pts_interval = ((1000000L * (tv1->tv_sec - ffmpeg->start_time.tv_sec)) + tv1->tv_usec - ffmpeg->start_time.tv_usec); if (pts_interval < 0) { /* This can occur when we have pre-capture frames. Reset start time of video. */ ffmpeg_reset_movie_start_time(ffmpeg, tv1); pts_interval = 0; } if (ffmpeg->last_pts < 0) { // This is the very first frame, ensure PTS is zero ffmpeg->picture->pts = 0; } else ffmpeg->picture->pts = av_rescale_q(pts_interval,(AVRational){1, 1000000L},ffmpeg->video_st->time_base) + ffmpeg->base_pts; if (ffmpeg->test_mode == TRUE) { MOTION_LOG(INF, TYPE_ENCODER, NO_ERRNO ,_("PTS %"PRId64" Base PTS %"PRId64" ms interval %"PRId64" timebase %d-%d") ,ffmpeg->picture->pts,ffmpeg->base_pts,pts_interval ,ffmpeg->video_st->time_base.num,ffmpeg->video_st->time_base.den); } if (ffmpeg->picture->pts <= ffmpeg->last_pts) { //We have a problem with our motion loop timing and sending frames or the rounding into the PTS. if (ffmpeg->test_mode == TRUE) { MOTION_LOG(INF, TYPE_ENCODER, NO_ERRNO, _("BAD TIMING!! Frame skipped.")); } return -1; } ffmpeg->last_pts = ffmpeg->picture->pts; } return 0; } static int ffmpeg_set_pktpts(struct ffmpeg *ffmpeg, const struct timeval *tv1) { int64_t pts_interval; if (ffmpeg->tlapse != TIMELAPSE_NONE) { ffmpeg->last_pts++; ffmpeg->pkt->pts = ffmpeg->last_pts; } else { pts_interval = ((1000000L * (tv1->tv_sec - ffmpeg->start_time.tv_sec)) + tv1->tv_usec - ffmpeg->start_time.tv_usec); if (pts_interval < 0) { /* This can occur when we have pre-capture frames. Reset start time of video. */ ffmpeg_reset_movie_start_time(ffmpeg, tv1); pts_interval = 0; } ffmpeg->pkt->pts = av_rescale_q(pts_interval,(AVRational){1, 1000000L},ffmpeg->video_st->time_base) + ffmpeg->base_pts; if (ffmpeg->test_mode == TRUE) { MOTION_LOG(INF, TYPE_ENCODER, NO_ERRNO ,_("PTS %"PRId64" Base PTS %"PRId64" ms interval %"PRId64" timebase %d-%d Change %d") ,ffmpeg->pkt->pts ,ffmpeg->base_pts,pts_interval ,ffmpeg->video_st->time_base.num ,ffmpeg->video_st->time_base.den ,(ffmpeg->pkt->pts-ffmpeg->last_pts) ); } if (ffmpeg->pkt->pts <= ffmpeg->last_pts) { //We have a problem with our motion loop timing and sending frames or the rounding into the PTS. if (ffmpeg->test_mode == TRUE) { MOTION_LOG(INF, TYPE_ENCODER, NO_ERRNO, _("BAD TIMING!! Frame skipped.")); } return -1; } ffmpeg->last_pts = ffmpeg->pkt->pts; ffmpeg->pkt->dts=ffmpeg->pkt->pts; } return 0; } static int ffmpeg_set_quality(struct ffmpeg *ffmpeg) { ffmpeg->opts = 0; if (ffmpeg->quality > 100) { ffmpeg->quality = 100; } if (ffmpeg->ctx_codec->codec_id == MY_CODEC_ID_H264 || ffmpeg->ctx_codec->codec_id == MY_CODEC_ID_HEVC) { if (ffmpeg->quality <= 0) { ffmpeg->quality = 45; // default to 45% quality } av_dict_set(&ffmpeg->opts, "preset", "ultrafast", 0); av_dict_set(&ffmpeg->opts, "tune", "zerolatency", 0); /* This next if statement needs validation. Are mpeg4omx * and v4l2m2m even MY_CODEC_ID_H264 or MY_CODEC_ID_HEVC * such that it even would be possible to be part of this * if block to start with? */ if ((ffmpeg->preferred_codec == USER_CODEC_H264OMX) || (ffmpeg->preferred_codec == USER_CODEC_MPEG4OMX) || (ffmpeg->preferred_codec == USER_CODEC_V4L2M2M)) { // bit_rate = ffmpeg->width * ffmpeg->height * ffmpeg->fps * quality_factor ffmpeg->quality = (int)(((int64_t)ffmpeg->width * ffmpeg->height * ffmpeg->fps * ffmpeg->quality) >> 7); // Clip bit rate to min if (ffmpeg->quality < 4000) { // magic number ffmpeg->quality = 4000; } ffmpeg->ctx_codec->profile = FF_PROFILE_H264_HIGH; ffmpeg->ctx_codec->bit_rate = ffmpeg->quality; } else { // Control other H264 encoders quality via CRF char crf[10]; ffmpeg->quality = (int)(( (100-ffmpeg->quality) * 51)/100); snprintf(crf, 10, "%d", ffmpeg->quality); av_dict_set(&ffmpeg->opts, "crf", crf, 0); } } else { /* The selection of 8000 is a subjective number based upon viewing output files */ if (ffmpeg->quality > 0) { ffmpeg->quality =(int)(((100-ffmpeg->quality)*(100-ffmpeg->quality)*(100-ffmpeg->quality) * 8000) / 1000000) + 1; ffmpeg->ctx_codec->flags |= MY_CODEC_FLAG_QSCALE; ffmpeg->ctx_codec->global_quality=ffmpeg->quality; } } MOTION_LOG(INF, TYPE_ENCODER, NO_ERRNO ,_("%s codec vbr/crf/bit_rate: %d"), ffmpeg->codec->name, ffmpeg->quality); return 0; } struct blacklist_t { const char *codec_name; const char *reason; }; static const char *ffmpeg_codec_is_blacklisted(const char *codec_name) { static struct blacklist_t blacklisted_codec[] = { #if ( MYFFVER < 58029) /* h264_omx & ffmpeg combination locks up on Raspberry Pi. * Newer versions of ffmpeg allow zerocopy to be disabled to workaround * this issue. * To use h264_omx encoder on older versions of ffmpeg: * - disable input_zerocopy in ffmpeg omx.c:omx_encode_init function. * - remove the "h264_omx" from this blacklist. * More information: https://github.com/Motion-Project/motion/issues/433 */ {"h264_omx", "Codec causes lock up on your FFMpeg version"}, #endif #if ( MYFFVER < 57041) {"h264_v4l2m2m", "FFMpeg version is too old"}, #endif }; size_t i, i_mx; i_mx = (size_t)(sizeof(blacklisted_codec)/sizeof(blacklisted_codec[0])); for (i = 0; i < i_mx; i++) { if (mystreq(codec_name, blacklisted_codec[i].codec_name)) { return blacklisted_codec[i].reason; } } return NULL; } static int ffmpeg_set_codec_preferred(struct ffmpeg *ffmpeg) { size_t codec_name_len = strcspn(ffmpeg->codec_name, ":"); ffmpeg->codec = NULL; if (ffmpeg->codec_name[codec_name_len]) { const char *blacklist_reason = ffmpeg_codec_is_blacklisted(&ffmpeg->codec_name[codec_name_len+1]); if (blacklist_reason) { MOTION_LOG(WRN, TYPE_ENCODER, NO_ERRNO ,_("Preferred codec %s has been blacklisted: %s") ,&ffmpeg->codec_name[codec_name_len+1], blacklist_reason); } else { ffmpeg->codec = avcodec_find_encoder_by_name(&ffmpeg->codec_name[codec_name_len+1]); } } if (ffmpeg->codec == NULL) { ffmpeg->codec = avcodec_find_encoder(ffmpeg->oc->video_codec_id); } if (ffmpeg->codec == NULL) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Codec %s not found"), ffmpeg->codec_name); ffmpeg_free_context(ffmpeg); return -1; } if (mystreq(ffmpeg->codec->name, "h264_v4l2m2m")) { ffmpeg->preferred_codec = USER_CODEC_V4L2M2M; } else if (mystreq(ffmpeg->codec->name, "h264_omx")) { ffmpeg->preferred_codec = USER_CODEC_H264OMX; } else if (mystreq(ffmpeg->codec->name, "mpeg4_omx")) { ffmpeg->preferred_codec = USER_CODEC_MPEG4OMX; } else { ffmpeg->preferred_codec = USER_CODEC_DEFAULT; } if (ffmpeg->codec_name[codec_name_len]) { MOTION_LOG(NTC, TYPE_ENCODER, NO_ERRNO,_("Using codec %s"), ffmpeg->codec->name); } return 0; } static int ffmpeg_set_codec(struct ffmpeg *ffmpeg) { int retcd; char errstr[128]; int chkrate; retcd = ffmpeg_set_codec_preferred(ffmpeg); if (retcd != 0) { return retcd; } #if ( MYFFVER >= 57041) ffmpeg->video_st = avformat_new_stream(ffmpeg->oc, ffmpeg->codec); if (!ffmpeg->video_st) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not alloc stream")); ffmpeg_free_context(ffmpeg); return -1; } ffmpeg->ctx_codec = avcodec_alloc_context3(ffmpeg->codec); if (ffmpeg->ctx_codec == NULL) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Failed to allocate codec!")); ffmpeg_free_context(ffmpeg); return -1; } #else ffmpeg->video_st = avformat_new_stream(ffmpeg->oc, ffmpeg->codec); if (!ffmpeg->video_st) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not alloc stream")); ffmpeg_free_context(ffmpeg); return -1; } ffmpeg->ctx_codec = ffmpeg->video_st->codec; #endif if (ffmpeg->tlapse != TIMELAPSE_NONE) { ffmpeg->ctx_codec->gop_size = 1; } else { if (ffmpeg->fps <= 5) { ffmpeg->ctx_codec->gop_size = 1; } else if (ffmpeg->fps > 30) { ffmpeg->ctx_codec->gop_size = 15; } else { ffmpeg->ctx_codec->gop_size = (ffmpeg->fps / 2); } ffmpeg->gop_cnt = ffmpeg->ctx_codec->gop_size - 1; } /* For certain containers, setting the fps to very low numbers results in ** a very poor quality playback. We can set the FPS to a higher number and ** then let the PTS display the frames correctly. */ if ((ffmpeg->tlapse == TIMELAPSE_NONE) && (ffmpeg->fps <= 5)) { if (mystreq(ffmpeg->codec_name, "msmpeg4") || mystreq(ffmpeg->codec_name, "flv") || mystreq(ffmpeg->codec_name, "mov") || mystreq(ffmpeg->codec_name, "mp4") || mystreq(ffmpeg->codec_name, "hevc") || mystreq(ffmpeg->codec_name, "mpeg4")) { MOTION_LOG(NTC, TYPE_ENCODER, NO_ERRNO, _("Low fps. Encoding %d frames into a %d frames container."), ffmpeg->fps, 10); ffmpeg->fps = 10; } } ffmpeg->ctx_codec->codec_id = ffmpeg->codec->id; ffmpeg->ctx_codec->codec_type = AVMEDIA_TYPE_VIDEO; ffmpeg->ctx_codec->bit_rate = ffmpeg->bps; ffmpeg->ctx_codec->width = ffmpeg->width; ffmpeg->ctx_codec->height = ffmpeg->height; ffmpeg->ctx_codec->time_base.num = 1; ffmpeg->ctx_codec->time_base.den = ffmpeg->fps; if (ffmpeg->preferred_codec == USER_CODEC_V4L2M2M) { ffmpeg->ctx_codec->pix_fmt = AV_PIX_FMT_NV21; } else { ffmpeg->ctx_codec->pix_fmt = MY_PIX_FMT_YUV420P; } ffmpeg->ctx_codec->max_b_frames = 0; if (mystreq(ffmpeg->codec_name, "ffv1")) { ffmpeg->ctx_codec->strict_std_compliance = -2; ffmpeg->ctx_codec->level = 3; } ffmpeg->ctx_codec->flags |= MY_CODEC_FLAG_GLOBAL_HEADER; if (mystreq(ffmpeg->codec->name, "h264_omx") || mystreq(ffmpeg->codec->name, "mpeg4_omx")) { /* h264_omx & ffmpeg combination locks up on Raspberry Pi. * To use h264_omx encoder, we need to disable zerocopy. * More information: https://github.com/Motion-Project/motion/issues/433 */ av_dict_set(&ffmpeg->opts, "zerocopy", "0", 0); } retcd = ffmpeg_set_quality(ffmpeg); if (retcd < 0) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Unable to set quality")); return -1; } retcd = avcodec_open2(ffmpeg->ctx_codec, ffmpeg->codec, &ffmpeg->opts); if (retcd < 0) { if (ffmpeg->codec->supported_framerates) { const AVRational *fps = ffmpeg->codec->supported_framerates; while (fps->num) { MOTION_LOG(INF, TYPE_ENCODER, NO_ERRNO ,_("Reported FPS Supported %d/%d"), fps->num, fps->den); fps++; } } chkrate = 1; while ((chkrate < 36) && (retcd != 0)) { ffmpeg->ctx_codec->time_base.den = chkrate; retcd = avcodec_open2(ffmpeg->ctx_codec, ffmpeg->codec, &ffmpeg->opts); chkrate++; } if (retcd < 0) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not open codec %s"),errstr); av_dict_free(&ffmpeg->opts); ffmpeg_free_context(ffmpeg); return -1; } } av_dict_free(&ffmpeg->opts); return 0; } static int ffmpeg_set_stream(struct ffmpeg *ffmpeg) { #if ( MYFFVER >= 57041) int retcd; char errstr[128]; retcd = avcodec_parameters_from_context(ffmpeg->video_st->codecpar,ffmpeg->ctx_codec); if (retcd < 0) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Failed to copy decoder parameters!: %s"), errstr); ffmpeg_free_context(ffmpeg); return -1; } #endif ffmpeg->video_st->time_base = (AVRational){1, ffmpeg->fps}; return 0; } /*Special allocation of video buffer for v4l2m2m codec*/ static int ffmpeg_alloc_video_buffer(AVFrame *frame, int align) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format); int ret, i, padded_height; int plane_padding = FFMAX(16 + 16/*STRIDE_ALIGN*/, align); if (!desc) { return AVERROR(EINVAL); } if ((ret = av_image_check_size(frame->width, frame->height, 0, NULL)) < 0) { return ret; } if (!frame->linesize[0]) { if (align <= 0) { align = 32; /* STRIDE_ALIGN. Should be av_cpu_max_align() */ } for(i=1; i<=align; i+=i) { ret = av_image_fill_linesizes(frame->linesize, frame->format, FFALIGN(frame->width, i)); if (ret < 0) { return ret; } if (!(frame->linesize[0] & (align-1))) { break; } } for (i = 0; i < 4 && frame->linesize[i]; i++) { frame->linesize[i] = FFALIGN(frame->linesize[i], align); } } padded_height = FFALIGN(frame->height, 32); if ((ret = av_image_fill_pointers(frame->data, frame->format, padded_height, NULL, frame->linesize)) < 0) { return ret; } frame->buf[0] = av_buffer_alloc(ret + 4*plane_padding); if (!frame->buf[0]) { ret = AVERROR(ENOMEM); av_frame_unref(frame); return ret; } frame->buf[1] = av_buffer_alloc(ret + 4*plane_padding); if (!frame->buf[1]) { ret = AVERROR(ENOMEM); av_frame_unref(frame); return ret; } frame->data[0] = frame->buf[0]->data; frame->data[1] = frame->buf[1]->data; frame->data[2] = frame->data[1] + ((frame->width * padded_height) / 4); frame->extended_data = frame->data; return 0; } static int ffmpeg_set_picture(struct ffmpeg *ffmpeg) { int retcd; char errstr[128]; ffmpeg->picture = my_frame_alloc(); if (!ffmpeg->picture) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("could not alloc frame")); ffmpeg_free_context(ffmpeg); return -1; } /* Take care of variable bitrate setting. */ if (ffmpeg->quality) { ffmpeg->picture->quality = ffmpeg->quality; } ffmpeg->picture->linesize[0] = ffmpeg->ctx_codec->width; ffmpeg->picture->linesize[1] = ffmpeg->ctx_codec->width / 2; ffmpeg->picture->linesize[2] = ffmpeg->ctx_codec->width / 2; ffmpeg->picture->format = ffmpeg->ctx_codec->pix_fmt; ffmpeg->picture->width = ffmpeg->ctx_codec->width; ffmpeg->picture->height = ffmpeg->ctx_codec->height; if (ffmpeg->preferred_codec == USER_CODEC_V4L2M2M) { retcd = ffmpeg_alloc_video_buffer(ffmpeg->picture, 32); if (retcd) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("could not alloc buffers %s"), errstr); ffmpeg_free_context(ffmpeg); return -1; } } return 0; } static int ffmpeg_set_outputfile(struct ffmpeg *ffmpeg) { int retcd; char errstr[128]; #if ( MYFFVER < 58000) snprintf(ffmpeg->oc->filename, sizeof(ffmpeg->oc->filename), "%s", ffmpeg->filename); #endif /* Open the output file, if needed. */ if ((ffmpeg_timelapse_exists(ffmpeg->filename) == 0) || (ffmpeg->tlapse != TIMELAPSE_APPEND)) { if (!(ffmpeg->oc->oformat->flags & AVFMT_NOFILE)) { if (avio_open(&ffmpeg->oc->pb, ffmpeg->filename, MY_FLAG_WRITE) < 0) { if (errno == ENOENT) { if (mycreate_path(ffmpeg->filename) == -1) { ffmpeg_free_context(ffmpeg); return -1; } if (avio_open(&ffmpeg->oc->pb, ffmpeg->filename, MY_FLAG_WRITE) < 0) { MOTION_LOG(ERR, TYPE_ENCODER, SHOW_ERRNO ,_("error opening file %s"), ffmpeg->filename); ffmpeg_free_context(ffmpeg); return -1; } /* Permission denied */ } else if (errno == EACCES) { MOTION_LOG(ERR, TYPE_ENCODER, SHOW_ERRNO ,_("Permission denied. %s"),ffmpeg->filename); ffmpeg_free_context(ffmpeg); return -1; } else { MOTION_LOG(ERR, TYPE_ENCODER, SHOW_ERRNO ,_("Error opening file %s"), ffmpeg->filename); ffmpeg_free_context(ffmpeg); return -1; } } } /* Write the stream header, For the TIMELAPSE_APPEND * we write the data via standard file I/O so we close the * items here */ retcd = avformat_write_header(ffmpeg->oc, NULL); if (retcd < 0) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Could not write ffmpeg header %s"),errstr); ffmpeg_free_context(ffmpeg); return -1; } if (ffmpeg->tlapse == TIMELAPSE_APPEND) { av_write_trailer(ffmpeg->oc); avio_close(ffmpeg->oc->pb); } } return 0; } static int ffmpeg_flush_codec(struct ffmpeg *ffmpeg) { #if ( MYFFVER >= 57041) //ffmpeg version 3.1 and after int retcd; int recv_cd = 0; char errstr[128]; if (ffmpeg->passthrough) { return 0; } retcd = 0; recv_cd = 0; if (ffmpeg->tlapse == TIMELAPSE_NONE) { retcd = avcodec_send_frame(ffmpeg->ctx_codec, NULL); if (retcd < 0 ) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Error entering draining mode:%s"),errstr); return -1; } while (recv_cd != AVERROR_EOF) { ffmpeg->pkt = my_packet_alloc(ffmpeg->pkt); recv_cd = avcodec_receive_packet(ffmpeg->ctx_codec, ffmpeg->pkt); if (recv_cd != AVERROR_EOF) { if (recv_cd < 0) { av_strerror(recv_cd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Error draining codec:%s"),errstr); ffmpeg_free_pkt(ffmpeg); return -1; } // v4l2_m2m encoder uses pts 0 and size 0 to indicate AVERROR_EOF if ((ffmpeg->pkt->pts == 0) || (ffmpeg->pkt->size == 0)) { recv_cd = AVERROR_EOF; ffmpeg_free_pkt(ffmpeg); continue; } retcd = av_write_frame(ffmpeg->oc, ffmpeg->pkt); if (retcd < 0) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Error writing draining video frame")); return -1; } } ffmpeg_free_pkt(ffmpeg); } } return 0; #else /* Dummy to kill warnings. No draining in older ffmpeg versions */ if (ffmpeg) { return 0; } else { return 0; } #endif } static int ffmpeg_put_frame(struct ffmpeg *ffmpeg, const struct timeval *tv1) { int retcd; ffmpeg->pkt = my_packet_alloc(ffmpeg->pkt); retcd = ffmpeg_set_pts(ffmpeg, tv1); if (retcd < 0) { //If there is an error, it has already been reported. ffmpeg_free_pkt(ffmpeg); return 0; } retcd = ffmpeg_encode_video(ffmpeg); if (retcd != 0) { if (retcd != -2) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Error while encoding picture")); } ffmpeg_free_pkt(ffmpeg); return retcd; } if (ffmpeg->tlapse == TIMELAPSE_APPEND) { retcd = ffmpeg_timelapse_append(ffmpeg, ffmpeg->pkt); } else { retcd = av_write_frame(ffmpeg->oc, ffmpeg->pkt); } ffmpeg_free_pkt(ffmpeg); if (retcd < 0) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Error while writing video frame")); return -1; } return retcd; } static void ffmpeg_passthru_reset(struct ffmpeg *ffmpeg) { /* Reset the written flag at start of each event */ int indx; pthread_mutex_lock(&ffmpeg->rtsp_data->mutex_pktarray); for(indx = 0; indx < ffmpeg->rtsp_data->pktarray_size; indx++) { ffmpeg->rtsp_data->pktarray[indx].iswritten = FALSE; } pthread_mutex_unlock(&ffmpeg->rtsp_data->mutex_pktarray); } static void ffmpeg_passthru_write(struct ffmpeg *ffmpeg, int indx) { /* Write the packet in the buffer at indx to file */ char errstr[128]; int retcd; ffmpeg->pkt = my_packet_alloc(ffmpeg->pkt); ffmpeg->rtsp_data->pktarray[indx].iswritten = TRUE; retcd = my_copy_packet(ffmpeg->pkt, ffmpeg->rtsp_data->pktarray[indx].packet); if (retcd < 0) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(INF, TYPE_ENCODER, NO_ERRNO, _("av_copy_packet: %s"),errstr); ffmpeg_free_pkt(ffmpeg); return; } retcd = ffmpeg_set_pktpts(ffmpeg, &ffmpeg->rtsp_data->pktarray[indx].timestamp_tv); if (retcd < 0) { ffmpeg_free_pkt(ffmpeg); return; } ffmpeg->pkt->stream_index = 0; retcd = av_write_frame(ffmpeg->oc, ffmpeg->pkt); ffmpeg_free_pkt(ffmpeg); if (retcd < 0) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Error while writing video frame: %s"),errstr); return; } } static int ffmpeg_passthru_put(struct ffmpeg *ffmpeg, struct image_data *img_data) { int idnbr_image, idnbr_lastwritten, idnbr_stop, idnbr_firstkey; int indx, indx_lastwritten, indx_firstkey; if (ffmpeg->rtsp_data == NULL) { return -1; } if ((ffmpeg->rtsp_data->status == RTSP_NOTCONNECTED ) || (ffmpeg->rtsp_data->status == RTSP_RECONNECTING )) { return 0; } if (ffmpeg->high_resolution) { idnbr_image = img_data->idnbr_high; } else { idnbr_image = img_data->idnbr_norm; } pthread_mutex_lock(&ffmpeg->rtsp_data->mutex_pktarray); idnbr_lastwritten = 0; idnbr_firstkey = idnbr_image; idnbr_stop = 0; indx_lastwritten = -1; indx_firstkey = -1; for(indx = 0; indx < ffmpeg->rtsp_data->pktarray_size; indx++) { if ((ffmpeg->rtsp_data->pktarray[indx].iswritten) && (ffmpeg->rtsp_data->pktarray[indx].idnbr > idnbr_lastwritten)) { idnbr_lastwritten=ffmpeg->rtsp_data->pktarray[indx].idnbr; indx_lastwritten = indx; } if ((ffmpeg->rtsp_data->pktarray[indx].idnbr > idnbr_stop) && (ffmpeg->rtsp_data->pktarray[indx].idnbr <= idnbr_image)) { idnbr_stop=ffmpeg->rtsp_data->pktarray[indx].idnbr; } if ((ffmpeg->rtsp_data->pktarray[indx].iskey) && (ffmpeg->rtsp_data->pktarray[indx].idnbr <= idnbr_firstkey)) { idnbr_firstkey=ffmpeg->rtsp_data->pktarray[indx].idnbr; indx_firstkey = indx; } } if (idnbr_stop == 0) { pthread_mutex_unlock(&ffmpeg->rtsp_data->mutex_pktarray); return 0; } if (indx_lastwritten != -1) { indx = indx_lastwritten; } else if (indx_firstkey != -1) { indx = indx_firstkey; } else { indx = 0; } while (TRUE) { if ((!ffmpeg->rtsp_data->pktarray[indx].iswritten) && (ffmpeg->rtsp_data->pktarray[indx].packet->size > 0) && (ffmpeg->rtsp_data->pktarray[indx].idnbr > idnbr_lastwritten) && (ffmpeg->rtsp_data->pktarray[indx].idnbr <= idnbr_image)) { ffmpeg_passthru_write(ffmpeg, indx); } if (ffmpeg->rtsp_data->pktarray[indx].idnbr == idnbr_stop) { break; } indx++; if (indx == ffmpeg->rtsp_data->pktarray_size) { indx = 0; } } pthread_mutex_unlock(&ffmpeg->rtsp_data->mutex_pktarray); return 0; } static int ffmpeg_passthru_codec(struct ffmpeg *ffmpeg) { int retcd; AVStream *stream_in; if (ffmpeg->rtsp_data == NULL) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("RTSP context not available.")); return -1; } pthread_mutex_lock(&ffmpeg->rtsp_data->mutex_transfer); if ((ffmpeg->rtsp_data->status == RTSP_NOTCONNECTED ) || (ffmpeg->rtsp_data->status == RTSP_RECONNECTING )) { MOTION_LOG(NTC, TYPE_ENCODER, NO_ERRNO ,_("rtsp camera not ready for pass-through.")); pthread_mutex_unlock(&ffmpeg->rtsp_data->mutex_transfer); return -1; } if (mystrne(ffmpeg->codec_name, "mp4")) { MOTION_LOG(NTC, TYPE_ENCODER, NO_ERRNO ,_("pass-through mode enabled. Changing to MP4 container.")); ffmpeg->codec_name = "mp4"; } retcd = ffmpeg_get_oformat(ffmpeg); if (retcd < 0 ) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not get codec!")); pthread_mutex_unlock(&ffmpeg->rtsp_data->mutex_transfer); return -1; } #if ( MYFFVER >= 57041) stream_in = ffmpeg->rtsp_data->transfer_format->streams[0]; ffmpeg->oc->video_codec_id = stream_in->codecpar->codec_id; ffmpeg->video_st = avformat_new_stream(ffmpeg->oc, NULL); if (!ffmpeg->video_st) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not alloc stream")); pthread_mutex_unlock(&ffmpeg->rtsp_data->mutex_transfer); return -1; } retcd = avcodec_parameters_copy(ffmpeg->video_st->codecpar, stream_in->codecpar); if (retcd < 0) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Unable to copy codec parameters")); pthread_mutex_unlock(&ffmpeg->rtsp_data->mutex_transfer); return -1; } ffmpeg->video_st->codecpar->codec_tag = 0; #elif ( MYFFVER >= 55000) stream_in = ffmpeg->rtsp_data->transfer_format->streams[0]; ffmpeg->video_st = avformat_new_stream(ffmpeg->oc, stream_in->codec->codec); if (!ffmpeg->video_st) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not alloc stream")); pthread_mutex_unlock(&ffmpeg->rtsp_data->mutex_transfer); return -1; } retcd = avcodec_copy_context(ffmpeg->video_st->codec, stream_in->codec); if (retcd < 0) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Unable to copy codec parameters")); pthread_mutex_unlock(&ffmpeg->rtsp_data->mutex_transfer); return -1; } ffmpeg->video_st->codec->flags |= MY_CODEC_FLAG_GLOBAL_HEADER; ffmpeg->video_st->codec->codec_tag = 0; #else /* This is disabled in the util_check_passthrough but we need it here for compiling */ pthread_mutex_unlock(&ffmpeg->rtsp_data->mutex_transfer); MOTION_LOG(INF, TYPE_ENCODER, NO_ERRNO, _("Pass-through disabled. ffmpeg too old")); return -1; #endif ffmpeg->video_st->time_base = stream_in->time_base; pthread_mutex_unlock(&ffmpeg->rtsp_data->mutex_transfer); MOTION_LOG(INF, TYPE_ENCODER, NO_ERRNO, _("Pass-through stream opened")); return 0; } void ffmpeg_avcodec_log(void *ignoreme, int errno_flag, const char *fmt, va_list vl) { char buf[1024]; char *end; (void)ignoreme; (void)errno_flag; /* Valgrind occasionally reports use of uninitialized values in here when we interrupt * some rtsp functions. The offending value is either fmt or vl and seems to be from a * debug level of av functions. To address it we flatten the message after we know * the log level. Now we put the avcodec messages to INF level since their error * are not necessarily our errors. */ if (errno_flag <= AV_LOG_WARNING) { /* Flatten the message coming in from avcodec. */ vsnprintf(buf, sizeof(buf), fmt, vl); end = buf + strlen(buf); if (end > buf && end[-1] == '\n') { *--end = 0; } if (strstr(buf, "Will reconnect at") == NULL) { MOTION_LOG(INF, TYPE_ENCODER, NO_ERRNO, "%s", buf); } } } static void ffmpeg_put_pix_nv21(struct ffmpeg *ffmpeg, struct image_data *img_data) { unsigned char *image,*imagecr, *imagecb; int cr_len, x, y; if (ffmpeg->high_resolution) { image = img_data->image_high; } else { image = img_data->image_norm; } cr_len = ffmpeg->ctx_codec->width * ffmpeg->ctx_codec->height / 4; imagecr = image + (ffmpeg->ctx_codec->width * ffmpeg->ctx_codec->height); imagecb = image + (ffmpeg->ctx_codec->width * ffmpeg->ctx_codec->height) + cr_len; memcpy(ffmpeg->picture->data[0], image, ffmpeg->ctx_codec->width * ffmpeg->ctx_codec->height); for (y = 0; y < ffmpeg->ctx_codec->height; y++) { for (x = 0; x < ffmpeg->ctx_codec->width/4; x++) { ffmpeg->picture->data[1][y*ffmpeg->ctx_codec->width/2 + x*2] = *imagecb; ffmpeg->picture->data[1][y*ffmpeg->ctx_codec->width/2 + x*2 + 1] = *imagecr; imagecb++; imagecr++; } } } static void ffmpeg_put_pix_yuv420(struct ffmpeg *ffmpeg, struct image_data *img_data) { unsigned char *image; if (ffmpeg->high_resolution) { image = img_data->image_high; } else { image = img_data->image_norm; } // Usual setup for image pointers ffmpeg->picture->data[0] = image; ffmpeg->picture->data[1] = image + (ffmpeg->ctx_codec->width * ffmpeg->ctx_codec->height); ffmpeg->picture->data[2] = ffmpeg->picture->data[1] + ((ffmpeg->ctx_codec->width * ffmpeg->ctx_codec->height) / 4); } #endif /* HAVE_FFMPEG */ /**************************************************************************** **************************************************************************** ****************************************************************************/ void ffmpeg_global_init(void) { #ifdef HAVE_FFMPEG MOTION_LOG(NTC, TYPE_ENCODER, NO_ERRNO ,_("ffmpeg libavcodec version %d.%d.%d" " libavformat version %d.%d.%d") , LIBAVCODEC_VERSION_MAJOR, LIBAVCODEC_VERSION_MINOR, LIBAVCODEC_VERSION_MICRO , LIBAVFORMAT_VERSION_MAJOR, LIBAVFORMAT_VERSION_MINOR, LIBAVFORMAT_VERSION_MICRO); #if ( MYFFVER < 58000) /* TODO: Determine if this is even needed for older versions */ av_register_all(); avcodec_register_all(); #endif avformat_network_init(); avdevice_register_all(); av_log_set_callback((void *)ffmpeg_avcodec_log); #if ( MYFFVER < 58000) /* TODO: Determine if this is even needed for older versions */ int ret; ret = av_lockmgr_register(ffmpeg_lockmgr_cb); if (ret < 0) { MOTION_LOG(EMG, TYPE_ALL, SHOW_ERRNO, _("av_lockmgr_register failed (%d)"), ret); exit(1); } #endif #else /* No FFMPEG */ MOTION_LOG(NTC, TYPE_ENCODER, NO_ERRNO, _("No ffmpeg functionality included")); #endif /* HAVE_FFMPEG */ } void ffmpeg_global_deinit(void) { #ifdef HAVE_FFMPEG avformat_network_deinit(); #if ( MYFFVER < 58000) /* TODO Determine if this is even needed for old versions */ if (av_lockmgr_register(NULL) < 0) { MOTION_LOG(EMG, TYPE_ALL, SHOW_ERRNO ,_("av_lockmgr_register reset failed on cleanup")); } #endif #else /* No FFMPEG */ MOTION_LOG(NTC, TYPE_ENCODER, NO_ERRNO, _("No ffmpeg functionality included")); #endif /* HAVE_FFMPEG */ } int ffmpeg_open(struct ffmpeg *ffmpeg) { #ifdef HAVE_FFMPEG int retcd; ffmpeg->oc = avformat_alloc_context(); if (!ffmpeg->oc) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not allocate output context")); ffmpeg_free_context(ffmpeg); return -1; } if (ffmpeg->passthrough) { retcd = ffmpeg_passthru_codec(ffmpeg); if (retcd < 0 ) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not setup passthru!")); ffmpeg_free_context(ffmpeg); return -1; } ffmpeg_passthru_reset(ffmpeg); } else { retcd = ffmpeg_get_oformat(ffmpeg); if (retcd < 0 ) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not get codec!")); ffmpeg_free_context(ffmpeg); return -1; } retcd = ffmpeg_set_codec(ffmpeg); if (retcd < 0 ) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Failed to allocate codec!")); return -1; } retcd = ffmpeg_set_stream(ffmpeg); if (retcd < 0) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not set the stream")); return -1; } retcd = ffmpeg_set_picture(ffmpeg); if (retcd < 0) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not set the stream")); return -1; } } retcd = ffmpeg_set_outputfile(ffmpeg); if (retcd < 0) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not set the stream")); return -1; } return 0; #else /* No FFMPEG */ (void)ffmpeg; return -1; #endif /* HAVE_FFMPEG */ } void ffmpeg_close(struct ffmpeg *ffmpeg) { #ifdef HAVE_FFMPEG if (ffmpeg != NULL) { if (ffmpeg_flush_codec(ffmpeg) < 0) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Error flushing codec")); } if (ffmpeg->oc->pb != NULL) { if (ffmpeg->tlapse != TIMELAPSE_APPEND) { av_write_trailer(ffmpeg->oc); } if (!(ffmpeg->oc->oformat->flags & AVFMT_NOFILE)) { if (ffmpeg->tlapse != TIMELAPSE_APPEND) { avio_close(ffmpeg->oc->pb); } } } ffmpeg_free_context(ffmpeg); ffmpeg_free_nal(ffmpeg); } #else (void)ffmpeg; #endif // HAVE_FFMPEG } int ffmpeg_put_image(struct ffmpeg *ffmpeg, struct image_data *img_data, const struct timeval *tv1) { #ifdef HAVE_FFMPEG int retcd = 0; int cnt = 0; if (ffmpeg->passthrough) { retcd = ffmpeg_passthru_put(ffmpeg, img_data); return retcd; } if (ffmpeg->picture) { if (ffmpeg->preferred_codec == USER_CODEC_V4L2M2M) { ffmpeg_put_pix_nv21(ffmpeg, img_data); } else { ffmpeg_put_pix_yuv420(ffmpeg, img_data); } ffmpeg->gop_cnt ++; if (ffmpeg->gop_cnt == ffmpeg->ctx_codec->gop_size ) { ffmpeg->picture->pict_type = AV_PICTURE_TYPE_I; ffmpeg->picture->key_frame = 1; ffmpeg->gop_cnt = 0; } else { ffmpeg->picture->pict_type = AV_PICTURE_TYPE_P; ffmpeg->picture->key_frame = 0; } /* A return code of -2 is thrown by the put_frame * when a image is buffered. For timelapse, we absolutely * never want a frame buffered so we keep sending back the * the same pic until it flushes or fails in a different way */ retcd = ffmpeg_put_frame(ffmpeg, tv1); while ((retcd == -2) && (ffmpeg->tlapse != TIMELAPSE_NONE)) { retcd = ffmpeg_put_frame(ffmpeg, tv1); cnt++; if (cnt > 50) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Excessive attempts to clear buffered packet")); retcd = -1; } } //non timelapse buffered is ok if (retcd == -2) { retcd = 0; MOTION_LOG(DBG, TYPE_ENCODER, NO_ERRNO, _("Buffered packet")); } } return retcd; #else (void)ffmpeg; (void)img_data; (void)tv1; return 0; #endif // HAVE_FFMPEG } void ffmpeg_reset_movie_start_time(struct ffmpeg *ffmpeg, const struct timeval *tv1) { #ifdef HAVE_FFMPEG int64_t one_frame_interval = av_rescale_q(1,(AVRational){1, ffmpeg->fps},ffmpeg->video_st->time_base); if (one_frame_interval <= 0) { one_frame_interval = 1; } ffmpeg->base_pts = ffmpeg->last_pts + one_frame_interval; ffmpeg->start_time.tv_sec = tv1->tv_sec; ffmpeg->start_time.tv_usec = tv1->tv_usec; #else (void)ffmpeg; (void)tv1; #endif // HAVE_FFMPEG } motion-release-4.6.0/src/ffmpeg.h000066400000000000000000000064771452402535500166730ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * ffmpeg.h * Headers associated with functions in the ffmpeg.c module. */ #ifndef _INCLUDE_FFMPEG_H_ #define _INCLUDE_FFMPEG_H_ #include #include #include #include #include "config.h" struct image_data; /* forward declare for functions */ struct rtsp_context; enum TIMELAPSE_TYPE { TIMELAPSE_NONE, /* No timelapse, regular processing */ TIMELAPSE_APPEND, /* Use append version of timelapse */ TIMELAPSE_NEW /* Use create new file version of timelapse */ }; /* Enumeration of the user requested codecs that need special handling */ enum USER_CODEC { USER_CODEC_V4L2M2M, /* Requested codec for movie is h264_v4l2m2m */ USER_CODEC_H264OMX, /* Requested h264_omx */ USER_CODEC_MPEG4OMX, /* Requested mpeg4_omx */ USER_CODEC_DEFAULT /* All other default codecs */ }; #ifdef HAVE_FFMPEG struct ffmpeg { AVFormatContext *oc; AVStream *video_st; AVCodecContext *ctx_codec; my_AVCodec *codec; AVPacket *pkt; AVFrame *picture; /* contains default image pointers */ AVDictionary *opts; struct rtsp_context *rtsp_data; int width; int height; enum TIMELAPSE_TYPE tlapse; int fps; int bps; char *filename; int quality; const char *codec_name; int64_t last_pts; int64_t base_pts; int test_mode; int gop_cnt; struct timeval start_time; int high_resolution; int motion_images; int passthrough; enum USER_CODEC preferred_codec; char *nal_info; int nal_info_len; }; #else struct ffmpeg { struct rtsp_context *rtsp_data; int width; int height; enum TIMELAPSE_TYPE tlapse; int fps; int bps; char *filename; int quality; const char *codec_name; int64_t last_pts; int64_t base_pts; int test_mode; int gop_cnt; struct timeval start_time; int high_resolution; int motion_images; int passthrough; }; #endif // HAVE_FFMPEG void ffmpeg_global_init(void); void ffmpeg_global_deinit(void); void ffmpeg_avcodec_log(void *, int, const char *, va_list); int ffmpeg_open(struct ffmpeg *ffmpeg); int ffmpeg_put_image(struct ffmpeg *ffmpeg, struct image_data *img_data, const struct timeval *tv1); void ffmpeg_close(struct ffmpeg *ffmpeg); void ffmpeg_reset_movie_start_time(struct ffmpeg *ffmpeg, const struct timeval *tv1); #endif /* _INCLUDE_FFMPEG_H_ */ motion-release-4.6.0/src/jpegutils.c000066400000000000000000000555211452402535500174220ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * jpegutils.c: Some Utility programs for dealing with JPEG encoded images * * Copyright (C) 1999 Rainer Johanni * Copyright (C) 2001 pHilipp Zabel * Copyright (C) 2008 Angel Carpintero * * based on jdatasrc.c and jdatadst.c from the Independent * JPEG Group's software by Thomas G. Lane * */ /* * jpegutils.c * Purpose: * Decompress jpeg data into images for use in other parts of program. * Currently this module only decompresses and it is only called from * the vid_mjpegtoyuv420p function * Functional Prefixes * All functions within the module will use the prefix "jpgutl" for identification * Module Level Variables: * EOI_data Constant value to indicate the end of an image. * Module Level Structures: * jpgutl_error_mgr Used by the JPEG libraries as the error manager to catch/trap messages from library. * Static Functions: * The following functions are required by the JPEG library to decompress images. * jpgutl_init_source * jpgutl_fill_input_buffer * jpgutl_skip_data * jpgutl_term_source * jpgutl_buffer_src * jpgutl_error_exit * jpgutl_emit_message * Exposed Functions * jpgutl_decode_jpeg */ #include "motion.h" #include "config.h" #include "translate.h" #include "util.h" #include "logger.h" #include "jpegutils.h" #include "picture.h" /* For the prepare_exif */ #include /* This is a workaround regarding these defines. The config.h file defines * HAVE_STDLIB_H as 1 whereas the jpeglib.h just defines it without a value. * this causes massive warnings/error on mis-matched definitions. We do not * control either of these so we have to suffer through this workaround hack */ #if (HAVE_STDLIB_H == 1) #undef HAVE_STDLIB_H #define HAVE_STDLIB_H_ORIG 1 #endif #include #ifdef HAVE_STDLIB_H #ifdef HAVE_STDLIB_H_ORIG #undef HAVE_STDLIB_H #undef HAVE_STDLIB_H_ORIG #define HAVE_STDLIB_H 1 #else #undef HAVE_STDLIB_H #endif #endif #include #include static const uint8_t EOI_data[2] = { 0xFF, 0xD9 }; struct jpgutl_error_mgr { struct jpeg_error_mgr pub; /* "public" fields */ jmp_buf setjmp_buffer; /* For return to caller */ /* Original emit_message method. */ JMETHOD(void, original_emit_message, (j_common_ptr cinfo, int msg_level)); /* Was a corrupt-data warning seen. */ int warning_seen; }; /* These huffman tables are required by the old jpeg libs included with 14.04 */ static void add_huff_table(j_decompress_ptr dinfo, JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val) { /* Define a Huffman table */ int nsymbols, len; if (*htblptr == NULL) { *htblptr = jpeg_alloc_huff_table((j_common_ptr) dinfo); } /* Copy the number-of-symbols-of-each-code-length counts. */ memcpy((*htblptr)->bits, bits, sizeof((*htblptr)->bits)); /* * Validate the counts. We do this here mainly so we can copy the right * number of symbols from the val[] array, without risking marching off * the end of memory. jchuff.c will do a more thorough test later. */ nsymbols = 0; for (len = 1; len <= 16; len++) { nsymbols += bits[len]; } if (nsymbols < 1 || nsymbols > 256) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO, _("%s: Given jpeg buffer was too small")); } memcpy((*htblptr)->huffval, val, nsymbols * sizeof(UINT8)); } static void std_huff_tables (j_decompress_ptr dinfo) { /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ /* IMPORTANT: these are only valid for 8-bit data precision! */ static const UINT8 bits_dc_luminance[17] = { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; static const UINT8 val_dc_luminance[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static const UINT8 bits_dc_chrominance[17] = { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; static const UINT8 val_dc_chrominance[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static const UINT8 bits_ac_luminance[17] = { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; static const UINT8 val_ac_luminance[] = { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; static const UINT8 bits_ac_chrominance[17] = { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; static const UINT8 val_ac_chrominance[] = { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; add_huff_table(dinfo, &dinfo->dc_huff_tbl_ptrs[0], bits_dc_luminance, val_dc_luminance); add_huff_table(dinfo, &dinfo->ac_huff_tbl_ptrs[0], bits_ac_luminance, val_ac_luminance); add_huff_table(dinfo, &dinfo->dc_huff_tbl_ptrs[1], bits_dc_chrominance, val_dc_chrominance); add_huff_table(dinfo, &dinfo->ac_huff_tbl_ptrs[1], bits_ac_chrominance, val_ac_chrominance); } static void guarantee_huff_tables(j_decompress_ptr dinfo) { if ((dinfo->dc_huff_tbl_ptrs[0] == NULL) && (dinfo->dc_huff_tbl_ptrs[1] == NULL) && (dinfo->ac_huff_tbl_ptrs[0] == NULL) && (dinfo->ac_huff_tbl_ptrs[1] == NULL)) { std_huff_tables(dinfo); } } /* * Initialize source --- called by jpeg_read_header * before any data is actually read. */ static void jpgutl_init_source(j_decompress_ptr cinfo) { (void)cinfo; /* No work necessary here */ } /* * Fill the input buffer --- called whenever buffer is emptied. * * Should never be called since all data should be already provided. * Is nevertheless sometimes called - sets the input buffer to data * which is the JPEG EOI marker; * */ static boolean jpgutl_fill_input_buffer(j_decompress_ptr cinfo) { cinfo->src->next_input_byte = EOI_data; cinfo->src->bytes_in_buffer = 2; return TRUE; } /* * Skip data --- used to skip over a potentially large amount of * uninteresting data (such as an APPn marker). * */ static void jpgutl_skip_data(j_decompress_ptr cinfo, long num_bytes) { if (num_bytes > 0) { if (num_bytes > (long) cinfo->src->bytes_in_buffer) { num_bytes = (long) cinfo->src->bytes_in_buffer; } cinfo->src->next_input_byte += (size_t) num_bytes; cinfo->src->bytes_in_buffer -= (size_t) num_bytes; } } /* * Terminate source --- called by jpeg_finish_decompress * after all data has been read. Often a no-op. */ static void jpgutl_term_source(j_decompress_ptr cinfo) { (void)cinfo; /* No work necessary here */ } /* * The source object and input buffer are made permanent so that a series * of JPEG images can be read from the same buffer by calling jpgutl_buffer_src * only before the first one. (If we discarded the buffer at the end of * one image, we'd likely lose the start of the next one.) * This makes it unsafe to use this manager and a different source * manager serially with the same JPEG object. Caveat programmer. */ /** * jpgutl_buffer_src * Purpose: * Establish the input buffer source for the JPEG libary and associated helper functions. * Parameters: * cinfo The jpeg library compression/decompression information * buffer The buffer of JPEG data to decompress. * buffer_len The length of the buffer. * Return values: * None */ static void jpgutl_buffer_src(j_decompress_ptr cinfo, unsigned char *buffer, long buffer_len) { if (cinfo->src == NULL) { /* First time for this JPEG object? */ cinfo->src = (struct jpeg_source_mgr *) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, sizeof (struct jpeg_source_mgr)); } cinfo->src->init_source = jpgutl_init_source; cinfo->src->fill_input_buffer = jpgutl_fill_input_buffer; cinfo->src->skip_input_data = jpgutl_skip_data; cinfo->src->resync_to_restart = jpeg_resync_to_restart; /* Use default method */ cinfo->src->term_source = jpgutl_term_source; cinfo->src->bytes_in_buffer = buffer_len; cinfo->src->next_input_byte = (JOCTET *) buffer; } /** * jpgutl_error_exit * Purpose: * Exit routine for errors thrown by JPEG library. * Parameters: * cinfo The jpeg library compression/decompression information * Return values: * None */ static void jpgutl_error_exit(j_common_ptr cinfo) { char buffer[JMSG_LENGTH_MAX]; /* cinfo->err really points to a jpgutl_error_mgr struct, so coerce pointer. */ struct jpgutl_error_mgr *myerr = (struct jpgutl_error_mgr *) cinfo->err; /* * Always display the message. * We could postpone this until after returning, if we chose. */ (*cinfo->err->format_message) (cinfo, buffer); MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO, "%s", buffer); /* Return control to the setjmp point. */ longjmp (myerr->setjmp_buffer, 1); } /** * jpgutl_emit_message * Purpose: * Process the messages thrown by the JPEG library * Parameters: * cinfo The jpeg library compression/decompression information * msg_level Integer indicating the severity of the message. * Return values: * None */ static void jpgutl_emit_message(j_common_ptr cinfo, int msg_level) { char buffer[JMSG_LENGTH_MAX]; /* cinfo->err really points to a jpgutl_error_mgr struct, so coerce pointer. */ struct jpgutl_error_mgr *myerr = (struct jpgutl_error_mgr *) cinfo->err; /* * The JWRN_EXTRANEOUS_DATA is sent a lot without any particular negative effect. * There are some messages above zero but they are just informational and not something * that we are interested in. */ if ((cinfo->err->msg_code != JWRN_EXTRANEOUS_DATA) && (msg_level < 0) ) { myerr->warning_seen++ ; (*cinfo->err->format_message) (cinfo, buffer); MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO, "msg_level: %d, %s", msg_level, buffer); } } /* * The following declarations and 5 functions are jpeg related * functions used by put_jpeg_grey_memory and put_jpeg_yuv420p_memory. */ typedef struct { struct jpeg_destination_mgr pub; JOCTET *buf; size_t bufsize; size_t jpegsize; } mem_destination_mgr; typedef mem_destination_mgr *mem_dest_ptr; METHODDEF(void) init_destination(j_compress_ptr cinfo) { mem_dest_ptr dest = (mem_dest_ptr) cinfo->dest; dest->pub.next_output_byte = dest->buf; dest->pub.free_in_buffer = dest->bufsize; dest->jpegsize = 0; } METHODDEF(boolean) empty_output_buffer(j_compress_ptr cinfo) { mem_dest_ptr dest = (mem_dest_ptr) cinfo->dest; dest->pub.next_output_byte = dest->buf; dest->pub.free_in_buffer = dest->bufsize; return FALSE; ERREXIT(cinfo, JERR_BUFFER_SIZE); } METHODDEF(void) term_destination(j_compress_ptr cinfo) { mem_dest_ptr dest = (mem_dest_ptr) cinfo->dest; dest->jpegsize = dest->bufsize - dest->pub.free_in_buffer; } static GLOBAL(void) _jpeg_mem_dest(j_compress_ptr cinfo, JOCTET* buf, size_t bufsize) { mem_dest_ptr dest; if (cinfo->dest == NULL) { cinfo->dest = (struct jpeg_destination_mgr *) (*cinfo->mem->alloc_small)((j_common_ptr)cinfo, JPOOL_PERMANENT, sizeof(mem_destination_mgr)); } dest = (mem_dest_ptr) cinfo->dest; dest->pub.init_destination = init_destination; dest->pub.empty_output_buffer = empty_output_buffer; dest->pub.term_destination = term_destination; dest->buf = buf; dest->bufsize = bufsize; dest->jpegsize = 0; } static GLOBAL(int) _jpeg_mem_size(j_compress_ptr cinfo) { mem_dest_ptr dest = (mem_dest_ptr) cinfo->dest; return dest->jpegsize; } /* * put_jpeg_exif writes the EXIF APP1 chunk to the jpeg file. * It must be called after jpeg_start_compress() but before * any image data is written by jpeg_write_scanlines(). */ static void put_jpeg_exif(j_compress_ptr cinfo, const struct context *cnt , const struct timeval *tv1, const struct coord *box) { unsigned char *exif = NULL; unsigned exif_len = prepare_exif(&exif, cnt, tv1, box); if(exif_len > 0) { /* EXIF data lives in a JPEG APP1 marker */ jpeg_write_marker(cinfo, JPEG_APP0 + 1, exif, exif_len); free(exif); } } /** * jpgutl_decode_jpeg * Purpose: Decompress the jpeg data_in into the img_out buffer. * * Parameters: * jpeg_data_in The jpeg data sent in * jpeg_data_len The length of the jpeg data * width The width of the image * height The height of the image * img_out Pointer to the image output * * Return Values * Success 0, Failure -1 */ int jpgutl_decode_jpeg (unsigned char *jpeg_data_in, int jpeg_data_len , unsigned int width, unsigned int height, unsigned char *volatile img_out) { JSAMPARRAY line; /* Array of decomp data lines */ unsigned char *wline; /* Will point to line[0] */ unsigned int i; unsigned char *img_y, *img_cb, *img_cr; unsigned char offset_y; struct jpeg_decompress_struct dinfo; struct jpgutl_error_mgr jerr; /* We set up the normal JPEG error routines, then override error_exit. */ dinfo.err = jpeg_std_error (&jerr.pub); jerr.pub.error_exit = jpgutl_error_exit; /* Also hook the emit_message routine to note corrupt-data warnings. */ jerr.original_emit_message = jerr.pub.emit_message; jerr.pub.emit_message = jpgutl_emit_message; jerr.warning_seen = 0; jpeg_create_decompress (&dinfo); /* Establish the setjmp return context for jpgutl_error_exit to use. */ if (setjmp (jerr.setjmp_buffer)) { /* If we get here, the JPEG code has signaled an error. */ jpeg_destroy_decompress (&dinfo); return -1; } jpgutl_buffer_src (&dinfo, jpeg_data_in, jpeg_data_len); jpeg_read_header (&dinfo, TRUE); //420 sampling is the default for YCbCr so no need to override. dinfo.out_color_space = JCS_YCbCr; dinfo.dct_method = JDCT_DEFAULT; guarantee_huff_tables(&dinfo); /* Required by older versions of the jpeg libs */ jpeg_start_decompress (&dinfo); if ((dinfo.output_width == 0) || (dinfo.output_height == 0)) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO,_("Invalid JPEG image dimensions")); jpeg_destroy_decompress(&dinfo); return -1; } if ((dinfo.output_width != width) || (dinfo.output_height != height)) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO ,_("JPEG image size %dx%d, JPEG was %dx%d") ,width, height, dinfo.output_width, dinfo.output_height); jpeg_destroy_decompress(&dinfo); return -1; } img_y = img_out; img_cb = img_y + dinfo.output_width * dinfo.output_height; img_cr = img_cb + (dinfo.output_width * dinfo.output_height) / 4; /* Allocate space for one line. */ line = (*dinfo.mem->alloc_sarray)((j_common_ptr) &dinfo, JPOOL_IMAGE, dinfo.output_width * dinfo.output_components, 1); wline = line[0]; offset_y = 0; while (dinfo.output_scanline < dinfo.output_height) { jpeg_read_scanlines(&dinfo, line, 1); for (i = 0; i < (dinfo.output_width * 3); i += 3) { img_y[i / 3] = wline[i]; if (i & 1) { img_cb[(i / 3) / 2] = wline[i + 1]; img_cr[(i / 3) / 2] = wline[i + 2]; } } img_y += dinfo.output_width; if (offset_y++ & 1) { img_cb += dinfo.output_width / 2; img_cr += dinfo.output_width / 2; } } jpeg_finish_decompress(&dinfo); jpeg_destroy_decompress(&dinfo); /* * If there are too many warnings, this means that * only a partial image could be returned which would * trigger many false positive motion detections */ if (jerr.warning_seen > 2) { return -1; } return 0; } int jpgutl_put_yuv420p(unsigned char *dest_image, int image_size, unsigned char *input_image, int width , int height, int quality, struct context *cnt, struct timeval *tv1, struct coord *box) { int i, j, jpeg_image_size; JSAMPROW y[16],cb[16],cr[16]; // y[2][5] = color sample of row 2 and pixel column 5; (one plane) JSAMPARRAY data[3]; // t[0][2][5] = color sample 0 of row 2 and column 5 struct jpeg_compress_struct cinfo; struct jpgutl_error_mgr jerr; data[0] = y; data[1] = cb; data[2] = cr; cinfo.err = jpeg_std_error (&jerr.pub); jerr.pub.error_exit = jpgutl_error_exit; /* Also hook the emit_message routine to note corrupt-data warnings. */ jerr.original_emit_message = jerr.pub.emit_message; jerr.pub.emit_message = jpgutl_emit_message; jerr.warning_seen = 0; jpeg_create_compress(&cinfo); /* Establish the setjmp return context for jpgutl_error_exit to use. */ if (setjmp (jerr.setjmp_buffer)) { /* If we get here, the JPEG code has signaled an error. */ jpeg_destroy_compress (&cinfo); return -1; } cinfo.image_width = width; cinfo.image_height = height; cinfo.input_components = 3; jpeg_set_defaults(&cinfo); jpeg_set_colorspace(&cinfo, JCS_YCbCr); cinfo.raw_data_in = TRUE; // Supply downsampled data #if JPEG_LIB_VERSION >= 70 cinfo.do_fancy_downsampling = FALSE; // Fix segfault with v7 #endif cinfo.comp_info[0].h_samp_factor = 2; cinfo.comp_info[0].v_samp_factor = 2; cinfo.comp_info[1].h_samp_factor = 1; cinfo.comp_info[1].v_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1; jpeg_set_quality(&cinfo, quality, TRUE); cinfo.dct_method = JDCT_FASTEST; _jpeg_mem_dest(&cinfo, dest_image, image_size); // Data written to mem jpeg_start_compress(&cinfo, TRUE); put_jpeg_exif(&cinfo, cnt, tv1, box); /* If the image is not a multiple of 16, this overruns the buffers * we'll just pad those last bytes with zeros */ for (j = 0; j < height; j += 16) { for (i = 0; i < 16; i++) { if ((width * (i + j)) < (width * height)) { y[i] = input_image + width * (i + j); if (i % 2 == 0) { cb[i / 2] = input_image + width * height + width / 2 * ((i + j) /2); cr[i / 2] = input_image + width * height + width * height / 4 + width / 2 * ((i + j) / 2); } } else { y[i] = 0x00; cb[i] = 0x00; cr[i] = 0x00; } } jpeg_write_raw_data(&cinfo, data, 16); } jpeg_finish_compress(&cinfo); jpeg_image_size = _jpeg_mem_size(&cinfo); jpeg_destroy_compress(&cinfo); return jpeg_image_size; } int jpgutl_put_grey(unsigned char *dest_image, int image_size, unsigned char *input_image, int width , int height, int quality, struct context *cnt, struct timeval *tv1, struct coord *box) { int y, dest_image_size; JSAMPROW row_ptr[1]; struct jpeg_compress_struct cjpeg; struct jpgutl_error_mgr jerr; cjpeg.err = jpeg_std_error (&jerr.pub); jerr.pub.error_exit = jpgutl_error_exit; /* Also hook the emit_message routine to note corrupt-data warnings. */ jerr.original_emit_message = jerr.pub.emit_message; jerr.pub.emit_message = jpgutl_emit_message; jerr.warning_seen = 0; jpeg_create_compress(&cjpeg); /* Establish the setjmp return context for jpgutl_error_exit to use. */ if (setjmp (jerr.setjmp_buffer)) { /* If we get here, the JPEG code has signaled an error. */ jpeg_destroy_compress (&cjpeg); return -1; } cjpeg.image_width = width; cjpeg.image_height = height; cjpeg.input_components = 1; /* One colour component */ cjpeg.in_color_space = JCS_GRAYSCALE; jpeg_set_defaults(&cjpeg); jpeg_set_quality(&cjpeg, quality, TRUE); cjpeg.dct_method = JDCT_FASTEST; _jpeg_mem_dest(&cjpeg, dest_image, image_size); // Data written to mem jpeg_start_compress (&cjpeg, TRUE); put_jpeg_exif(&cjpeg, cnt, tv1, box); row_ptr[0] = input_image; for (y = 0; y < height; y++) { jpeg_write_scanlines(&cjpeg, row_ptr, 1); row_ptr[0] += width; } jpeg_finish_compress(&cjpeg); dest_image_size = _jpeg_mem_size(&cjpeg); jpeg_destroy_compress(&cjpeg); return dest_image_size; } motion-release-4.6.0/src/jpegutils.h000066400000000000000000000030661452402535500174240ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * jpegutils.h * Headers associated with functions in the jpegutils.c module. * Copyright (C) 1999 Rainer Johanni * Copyright (C) 2001 pHilipp Zabel * Copyright (C) 2008 Angel Carpintero */ #ifndef __JPEGUTILS_H__ #define __JPEGUTILS_H__ int jpgutl_decode_jpeg (unsigned char *jpeg_data_in, int jpeg_data_len , unsigned int width, unsigned int height, unsigned char *volatile img_out); int jpgutl_put_yuv420p(unsigned char *dest_image, int image_size, unsigned char *input_image, int width , int height, int quality, struct context *cnt, struct timeval *tv1, struct coord *box); int jpgutl_put_grey(unsigned char *dest_image, int image_size, unsigned char *input_image, int width , int height, int quality, struct context *cnt, struct timeval *tv1, struct coord *box); #endif motion-release-4.6.0/src/logger.c000066400000000000000000000213561452402535500166720ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * logger.c * * Logger for motion * * Copyright 2005, William M. Brack * Copyright 2008 by Angel Carpintero (motiondevelop@gmail.com) * */ #include "logger.h" /* already includes motion.h */ #include "util.h" #include static int log_mode = LOGMODE_SYSLOG; static FILE *logfile; static unsigned int log_level = LEVEL_DEFAULT; static unsigned int log_type = TYPE_DEFAULT; static const char *log_type_str[] = {NULL, "COR", "STR", "ENC", "NET", "DBL", "EVT", "TRK", "VID", "ALL"}; static const char *log_level_str[] = {"EMG", "ALR", "CRT", "ERR", "WRN", "NTC", "INF", "DBG", "ALL", NULL}; /** * get_log_type * * * Returns: index of log type or 0 if not valid type. */ int get_log_type(const char *type) { unsigned int i, ret = 0; unsigned int maxtype = sizeof(log_type_str)/sizeof(const char *); for (i = 1;i < maxtype; i++) { if (!strncasecmp(type, log_type_str[i], 3)) { ret = i; break; } } return ret; } /** * get_log_type_str * Gets string value for type log level. * * Returns: name of type log level. */ const char* get_log_type_str(unsigned int type) { return log_type_str[type]; } /** * set_log_type * Sets log type level. * * Returns: nothing. */ void set_log_type(unsigned int type) { log_type = type; //printf("set log type %d\n", type); } /** * get_log_level_str * Gets string value for log level. * * Returns: name of log level. */ const char* get_log_level_str(unsigned int level) { return log_level_str[level]; } /** * set_log_level * Sets log level. * * Returns nothing. */ void set_log_level(unsigned int level) { log_level = level; //printf("set log level %d\n", level); } /** * set_log_mode * Sets mode of logging, could be using syslog or files. * * Returns: nothing. */ void set_log_mode(int mode) { int prev_mode = log_mode; log_mode = mode; //printf("set log mode %d\n", mode); if (mode == LOGMODE_SYSLOG && prev_mode != LOGMODE_SYSLOG) { openlog("motion", LOG_PID, LOG_USER); } if (mode != LOGMODE_SYSLOG && prev_mode == LOGMODE_SYSLOG) { closelog(); } } /** * set_logfile * Sets logfile to be used instead of syslog. * * Returns: pointer to log file. */ FILE * set_logfile(const char *logfile_name) { /* Setup temporary to let log if myfopen fails */ set_log_mode(LOGMODE_SYSLOG); logfile = myfopen(logfile_name, "ae"); /* If logfile was opened correctly */ if (logfile) { set_log_mode(LOGMODE_FILE); } return logfile; } /** * str_time * * Return: string with human readable time */ static char *str_time(void) { //static char buffer[16]; // the month differs depending on the language. ex)LANG=ja_JP.UTF-8 static char buffer[18]; time_t now = 0; now = time(0); //strftime(buffer, 16, "%b %d %H:%M:%S", localtime(&now)); strftime(buffer, 18, "%b %d %H:%M:%S", localtime(&now)); return buffer; } /** * MOTION_LOG * * This routine is used for printing all informational, debug or error * messages produced by any of the other motion functions. It always * produces a message of the form "[n] {message}", and (if the param * 'errno_flag' is set) follows the message with the associated error * message from the library. * * Parameters: * * level logging level for the 'syslog' function * * type logging type. * * errno_flag if set, the log message should be followed by the * error message. * fmt the format string for producing the message * ap variable-length argument list * * Returns: * Nothing */ void motion_log(int level, unsigned int type, int errno_flag,int fncname, const char *fmt, ...) { int errno_save, n; char buf[1024]; char usrfmt[1024]; /* GNU-specific strerror_r() */ #if (!defined(XSI_STRERROR_R)) char msg_buf[100]; #endif va_list ap; int threadnr; static int flood_cnt = 0; static char flood_msg[1024]; char flood_repeats[1024]; /* Exit if level is greater than log_level */ if ((unsigned int)level > log_level) { return; } /* Exit if type is not equal to log_type and not TYPE_ALL */ if ((log_type != TYPE_ALL) && (type != log_type)) { return; } //printf("log_type %d, type %d level %d\n", log_type, type, level); threadnr = (unsigned long)pthread_getspecific(tls_key_threadnr); /* * First we save the current 'error' value. This is required because * the subsequent calls to vsnprintf could conceivably change it! */ errno_save = errno; char threadname[32]; util_threadname_get(threadname); /* * Prefix the message with the thread number and name, * log level string, log type string, and time. * e.g. [1:enc] [ERR] [ALL] [Apr 03 00:08:44] blah */ if (log_mode == LOGMODE_FILE) { n = snprintf(buf, sizeof(buf), "[%d:%s] [%s] [%s] [%s] ", threadnr, threadname, get_log_level_str(level), get_log_type_str(type), str_time()); } else { /* * Prefix the message with the thread number and name, * log level string and log type string. * e.g. [1:trk] [DBG] [ALL] blah */ n = snprintf(buf, sizeof(buf), "[%d:%s] [%s] [%s] ", threadnr, threadname, get_log_level_str(level), get_log_type_str(type)); } /* Prepend the format specifier for the function name */ if (fncname) { snprintf(usrfmt, sizeof (usrfmt),"%s: %s", "%s", fmt); } else { snprintf(usrfmt, sizeof (usrfmt),"%s",fmt); } /* Next add the user's message. */ va_start(ap, fmt); n += vsnprintf(buf + n, sizeof(buf) - n, usrfmt, ap); va_end(ap); buf[1023] = '\0'; /* If errno_flag is set, add on the library error message. */ if (errno_flag) { size_t buf_len = strlen(buf); // just knock off 10 characters if we're that close... if (buf_len + 10 > 1024) { buf[1024 - 10] = '\0'; buf_len = 1024 - 10; } strncat(buf, ": ", 1024 - buf_len); n += 2; /* * This is bad - apparently gcc/libc wants to use the non-standard GNU * version of strerror_r, which doesn't actually put the message into * my buffer :-(. I have put in a 'hack' to get around this. */ #if defined(XSI_STRERROR_R) /* XSI-compliant strerror_r() */ strerror_r(errno_save, buf + n, sizeof(buf) - n); /* 2 for the ': ' */ #else /* GNU-specific strerror_r() */ strncat(buf, strerror_r(errno_save, msg_buf, sizeof(msg_buf)), 1024 - strlen(buf)); #endif } if ((mystreq(buf,flood_msg)) && (flood_cnt <= 5000)) { flood_cnt++; } else { if (flood_cnt > 1) { snprintf(flood_repeats,1024,"[%d:%s] [%s] [%s] Above message repeats %d times", threadnr, threadname, get_log_level_str(level) , get_log_type_str(type), flood_cnt-1); switch (log_mode) { case LOGMODE_FILE: strncat(flood_repeats, "\n", 1024 - strlen(flood_repeats)); fputs(flood_repeats, logfile); fflush(logfile); break; case LOGMODE_SYSLOG: syslog(level, "%s", flood_repeats); strncat(flood_repeats, "\n", 1024 - strlen(flood_repeats)); fputs(flood_repeats, stderr); fflush(stderr); break; } } flood_cnt = 1; snprintf(flood_msg,1024,"%s",buf); switch (log_mode) { case LOGMODE_FILE: strncat(buf, "\n", 1024 - strlen(buf)); fputs(buf, logfile); fflush(logfile); break; case LOGMODE_SYSLOG: syslog(level, "%s", buf); strncat(buf, "\n", 1024 - strlen(buf)); fputs(buf, stderr); fflush(stderr); break; } } } motion-release-4.6.0/src/logger.h000066400000000000000000000065651452402535500167040ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * logger.h * Headers associated with functions in the logger.c module. * Copyright 2005, William M. Brack * Copyright 2008 by Angel Carpintero (motiondevelop@gmail.com) */ #ifndef _INCLUDE_LOGGER_H_ #define _INCLUDE_LOGGER_H_ #include "motion.h" #include /* Logging mode */ #define LOGMODE_NONE 0 /* No logging */ #define LOGMODE_FILE 1 /* Log messages to file */ #define LOGMODE_SYSLOG 2 /* Log messages to syslog */ #define NO_ERRNO 0 /* Flag to avoid how message associated to errno */ #define SHOW_ERRNO 1 /* Flag to show message associated to errno */ /* Log levels */ #define LOG_ALL 9 #define EMG LOG_EMERG /* syslog 0 motion 1 */ #define ALR LOG_ALERT /* syslog 1 motion 2 */ #define CRT LOG_CRIT /* syslog 2 motion 3 */ #define ERR LOG_ERR /* syslog 3 motion 4 */ #define WRN LOG_WARNING /* syslog 4 motion 5 */ #define NTC LOG_NOTICE /* syslog 5 motion 6 */ #define INF LOG_INFO /* syslog 6 motion 7 */ #define DBG LOG_DEBUG /* syslog 7 motion 8 */ #define ALL LOG_ALL /* syslog 8 motion 9 */ #define LEVEL_DEFAULT NTC /* syslog 5 motion 6 default */ #define SHOW_LEVEL_VALUE(x) (x+1) /* Log types */ #define TYPE_CORE 1 /* Core logs */ #define TYPE_STREAM 2 /* Stream logs */ #define TYPE_ENCODER 3 /* Encoder logs */ #define TYPE_NETCAM 4 /* Netcam logs */ #define TYPE_DB 5 /* Database logs */ #define TYPE_EVENTS 6 /* Events logs */ #define TYPE_TRACK 7 /* Track logs */ #define TYPE_VIDEO 8 /* V4L1/2 Bktr logs */ #define TYPE_ALL 9 /* All type logs */ #define TYPE_DEFAULT TYPE_ALL /* Default type */ #define TYPE_DEFAULT_STR "ALL" /* Default name logs */ #define MOTION_LOG(x, y, z, format, args...) motion_log(x, y, z, 1, format, __FUNCTION__, ##args) int get_log_type(const char* type); const char* get_log_type_str(unsigned int type); void set_log_type(unsigned int type); const char* get_log_level_str(unsigned int level); void set_log_level(unsigned int level); void set_log_mode(int mode); FILE * set_logfile(const char *logfile_name); void motion_log(int level, unsigned int type, int errno_flag,int fncname, const char *fmt, ...); #endif motion-release-4.6.0/src/mmalcam.c000066400000000000000000000351141452402535500170170ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * mmalcam.c * * Raspberry Pi camera module using MMAL API. * * Built upon functionality from the Raspberry Pi userland utility raspivid. * * Copyright 2013 by Nicholas Tuckett * */ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include "netcam.h" #include "rotate.h" #ifdef HAVE_MMAL #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wredundant-decls" #include "interface/vcos/vcos.h" #include "interface/mmal/mmal.h" #include "interface/mmal/mmal_buffer.h" #include "interface/mmal/mmal_port.h" #include "interface/mmal/util/mmal_util.h" #include "interface/mmal/util/mmal_util_params.h" #include "interface/mmal/util/mmal_default_components.h" #include "interface/mmal/util/mmal_connection.h" #include "raspicam/RaspiCamControl.h" #pragma GCC diagnostic pop #define MMALCAM_OK 0 #define MMALCAM_ERROR -1 #define MMAL_CAMERA_PREVIEW_PORT 0 #define MMAL_CAMERA_VIDEO_PORT 1 #define MMAL_CAMERA_CAPTURE_PORT 2 #define VIDEO_FRAME_RATE_NUM 30 #define VIDEO_FRAME_RATE_DEN 1 #define VIDEO_OUTPUT_BUFFERS_NUM 3 const int MAX_BITRATE = 30000000; // 30Mbits/s static void parse_camera_params(const char *params_str, RASPICAM_CAMERA_PARAMETERS *camera_params) { char *params_tok = alloca(strlen(params_str) + 1); strcpy(params_tok, params_str); char *next_param = strtok(params_tok, " "); while (next_param != NULL) { char *param_val = strtok(NULL, " "); if (raspicamcontrol_parse_cmdline(camera_params, next_param + 1, param_val) < 2) { next_param = param_val; } else { next_param = strtok(NULL, " "); } } } static void check_disable_port(MMAL_PORT_T *port) { if (port && port->is_enabled) { mmal_port_disable(port); } } static void camera_control_callback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) { (void)port; if (buffer->cmd != MMAL_EVENT_PARAMETER_CHANGED) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("Received unexpected camera control callback event, 0x%08x"), buffer->cmd); } mmal_buffer_header_release(buffer); } static void camera_buffer_callback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) { mmalcam_context_ptr mmalcam = (mmalcam_context_ptr) port->userdata; mmal_queue_put(mmalcam->camera_buffer_queue, buffer); } static void set_port_format(mmalcam_context_ptr mmalcam, MMAL_ES_FORMAT_T *format) { format->encoding = MMAL_ENCODING_OPAQUE; format->encoding_variant = MMAL_ENCODING_I420; format->es->video.width = mmalcam->width; format->es->video.height = mmalcam->height; format->es->video.crop.x = 0; format->es->video.crop.y = 0; format->es->video.crop.width = mmalcam->width; format->es->video.crop.height = mmalcam->height; } static void set_video_port_format(mmalcam_context_ptr mmalcam, MMAL_ES_FORMAT_T *format) { set_port_format(mmalcam, format); format->es->video.frame_rate.num = mmalcam->framerate; format->es->video.frame_rate.den = VIDEO_FRAME_RATE_DEN; if (mmalcam->framerate > 30) { /* The pi noir camera could not determine autoexpose at high frame rates */ MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO, _("A high frame rate can cause problems with exposure of images")); MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO, _("If autoexposure is not working, try a lower frame rate.")); } } static int create_camera_component(mmalcam_context_ptr mmalcam, const char *mmalcam_name) { MMAL_STATUS_T status; MMAL_COMPONENT_T *camera_component; MMAL_PORT_T *video_port = NULL; status = mmal_component_create(mmalcam_name, &camera_component); if (status != MMAL_SUCCESS) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("Failed to create MMAL camera component %s"), mmalcam_name); goto error; } if (camera_component->output_num == 0) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("MMAL camera %s doesn't have output ports"), mmalcam_name); goto error; } video_port = camera_component->output[MMAL_CAMERA_VIDEO_PORT]; status = mmal_port_enable(camera_component->control, camera_control_callback); if (status) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("Unable to enable control port : error %d"), status); goto error; } // set up the camera configuration { MMAL_PARAMETER_CAMERA_CONFIG_T cam_config = { { MMAL_PARAMETER_CAMERA_CONFIG, sizeof(cam_config) }, .max_stills_w = mmalcam->width, .max_stills_h = mmalcam->height, .stills_yuv422 = 0, .one_shot_stills = 0, .max_preview_video_w = mmalcam->width, .max_preview_video_h = mmalcam->height, .num_preview_video_frames = 3, .stills_capture_circular_buffer_height = 0, .fast_preview_resume = 0, .use_stc_timestamp = MMAL_PARAM_TIMESTAMP_MODE_RESET_STC }; mmal_port_parameter_set(camera_component->control, &cam_config.hdr); } set_video_port_format(mmalcam, video_port->format); video_port->format->encoding = MMAL_ENCODING_I420; // set buffer size for an aligned/padded frame video_port->buffer_size = VCOS_ALIGN_UP(mmalcam->width, 32) * VCOS_ALIGN_UP(mmalcam->height, 16) * 3 / 2; if (mmal_port_parameter_set_boolean(video_port, MMAL_PARAMETER_NO_IMAGE_PADDING, 1) != MMAL_SUCCESS) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO, _("MMAL no-padding setup failed")); } status = mmal_port_format_commit(video_port); if (status) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, _("camera video format couldn't be set")); goto error; } // Ensure there are enough buffers to avoid dropping frames if (video_port->buffer_num < VIDEO_OUTPUT_BUFFERS_NUM) { video_port->buffer_num = VIDEO_OUTPUT_BUFFERS_NUM; } status = mmal_component_enable(camera_component); if (status) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, _("camera component couldn't be enabled")); goto error; } raspicamcontrol_set_all_parameters(camera_component, mmalcam->camera_parameters); mmalcam->camera_component = camera_component; mmalcam->camera_capture_port = video_port; mmalcam->camera_capture_port->userdata = (struct MMAL_PORT_USERDATA_T*) mmalcam; MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, _("MMAL camera component created")); return MMALCAM_OK; error: if (mmalcam->camera_component != NULL ) { mmal_component_destroy(camera_component); mmalcam->camera_component = NULL; } return MMALCAM_ERROR; } static void destroy_camera_component(mmalcam_context_ptr mmalcam) { if (mmalcam->camera_component) { mmal_component_destroy(mmalcam->camera_component); mmalcam->camera_component = NULL; } } static int create_camera_buffer_structures(mmalcam_context_ptr mmalcam) { mmalcam->camera_buffer_pool = mmal_pool_create(mmalcam->camera_capture_port->buffer_num, mmalcam->camera_capture_port->buffer_size); if (mmalcam->camera_buffer_pool == NULL ) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, _("MMAL camera buffer pool creation failed")); return MMALCAM_ERROR; } mmalcam->camera_buffer_queue = mmal_queue_create(); if (mmalcam->camera_buffer_queue == NULL ) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, _("MMAL camera buffer queue creation failed")); return MMALCAM_ERROR; } return MMALCAM_OK; } static int send_pooled_buffers_to_port(MMAL_POOL_T *pool, MMAL_PORT_T *port) { int num = mmal_queue_length(pool->queue); int i; for (i = 0; i < num; i++) { MMAL_BUFFER_HEADER_T *buffer = mmal_queue_get(pool->queue); if (!buffer) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("Unable to get a required buffer %d from pool queue"), i); return MMALCAM_ERROR; } if (mmal_port_send_buffer(port, buffer) != MMAL_SUCCESS) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, _("Unable to send a buffer to port (%d)"), i); return MMALCAM_ERROR; } } return MMALCAM_OK; } static void destroy_camera_buffer_structures(mmalcam_context_ptr mmalcam) { if (mmalcam->camera_buffer_queue != NULL ) { mmal_queue_destroy(mmalcam->camera_buffer_queue); mmalcam->camera_buffer_queue = NULL; } if (mmalcam->camera_buffer_pool != NULL ) { mmal_pool_destroy(mmalcam->camera_buffer_pool); mmalcam->camera_buffer_pool = NULL; } } /** * mmalcam_start * * This routine is called from the main motion thread. It's job is * to open up the requested camera device via MMAL and do any required * initialization. * * Parameters: * * cnt Pointer to the motion context structure for this device. * * Returns: 0 on success * -1 on any failure */ int mmalcam_start(struct context *cnt) { mmalcam_context_ptr mmalcam; cnt->mmalcam = (mmalcam_context*) mymalloc(sizeof(struct mmalcam_context)); memset(cnt->mmalcam, 0, sizeof(mmalcam_context)); mmalcam = cnt->mmalcam; mmalcam->cnt = cnt; MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("MMAL Camera thread starting... for camera (%s) of %d x %d at %d fps") ,cnt->conf.mmalcam_name, cnt->conf.width, cnt->conf.height, cnt->conf.framerate); mmalcam->camera_parameters = (RASPICAM_CAMERA_PARAMETERS*)malloc(sizeof(RASPICAM_CAMERA_PARAMETERS)); if (mmalcam->camera_parameters == NULL) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, _("camera params couldn't be allocated")); return MMALCAM_ERROR; } raspicamcontrol_set_defaults(mmalcam->camera_parameters); mmalcam->width = cnt->conf.width; mmalcam->height = cnt->conf.height; mmalcam->framerate = cnt->conf.framerate; if (cnt->conf.mmalcam_params) { parse_camera_params(cnt->conf.mmalcam_params, mmalcam->camera_parameters); } cnt->imgs.width = mmalcam->width; cnt->imgs.height = mmalcam->height; cnt->imgs.size_norm = (mmalcam->width * mmalcam->height * 3) / 2; cnt->imgs.motionsize = mmalcam->width * mmalcam->height; int retval = create_camera_component(mmalcam, cnt->conf.mmalcam_name); if (retval == 0) { retval = create_camera_buffer_structures(mmalcam); } if (retval == 0) { if (mmal_port_enable(mmalcam->camera_capture_port, camera_buffer_callback)) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, _("MMAL camera capture port enabling failed")); retval = MMALCAM_ERROR; } } if (retval == 0) { if (mmal_port_parameter_set_boolean(mmalcam->camera_capture_port, MMAL_PARAMETER_CAPTURE, 1) != MMAL_SUCCESS) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, _("MMAL camera capture start failed")); retval = MMALCAM_ERROR; } } if (retval == 0) { retval = send_pooled_buffers_to_port(mmalcam->camera_buffer_pool, mmalcam->camera_capture_port); } return retval; } /** * mmalcam_cleanup * * This routine shuts down any MMAL resources, then releases any allocated data * within the mmalcam context and frees the context itself. * This function is also called from motion_init if first time connection * fails and we start retrying until we get a valid first frame from the * camera. * * Parameters: * * mmalcam Pointer to a mmalcam context * * Returns: Nothing. * */ void mmalcam_cleanup(struct mmalcam_context *mmalcam) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, _("MMAL Camera cleanup")); if (mmalcam != NULL ) { if (mmalcam->camera_component) { check_disable_port(mmalcam->camera_capture_port); mmal_component_disable(mmalcam->camera_component); destroy_camera_buffer_structures(mmalcam); destroy_camera_component(mmalcam); } if (mmalcam->camera_parameters) { free(mmalcam->camera_parameters); } free(mmalcam); } } /** * mmalcam_next * * This routine is called when the main 'motion' thread wants a new * frame of video. It fetches the most recent frame available from * the Pi camera already in YUV420P, and returns it to motion. * * Parameters: * cnt Pointer to the context for this thread * image Pointer to a buffer for the returned image * * Returns: Error code */ int mmalcam_next(struct context *cnt, struct image_data *img_data) { mmalcam_context_ptr mmalcam; if ((!cnt) || (!cnt->mmalcam)) { return NETCAM_FATAL_ERROR; } mmalcam = cnt->mmalcam; MMAL_BUFFER_HEADER_T *camera_buffer = mmal_queue_wait(mmalcam->camera_buffer_queue); if (camera_buffer->cmd == 0 && (camera_buffer->flags & MMAL_BUFFER_HEADER_FLAG_FRAME_END) && (int)camera_buffer->length >= cnt->imgs.size_norm) { mmal_buffer_header_mem_lock(camera_buffer); memcpy(img_data->image_norm, camera_buffer->data, cnt->imgs.size_norm); mmal_buffer_header_mem_unlock(camera_buffer); } else { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("cmd %d flags %08x size %d/%d at %08x, img_size=%d") ,camera_buffer->cmd, camera_buffer->flags, camera_buffer->length ,camera_buffer->alloc_size, camera_buffer->data, cnt->imgs.size_norm); } mmal_buffer_header_release(camera_buffer); if (mmalcam->camera_capture_port->is_enabled) { MMAL_STATUS_T status; MMAL_BUFFER_HEADER_T *new_buffer = mmal_queue_get(mmalcam->camera_buffer_pool->queue); if (new_buffer) { status = mmal_port_send_buffer(mmalcam->camera_capture_port, new_buffer); } if (!new_buffer || status != MMAL_SUCCESS) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("Unable to return a buffer to the camera video port")); } } rotate_map(cnt,img_data); return 0; } #endif motion-release-4.6.0/src/mmalcam.h000066400000000000000000000030301452402535500170140ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * mmalcam.h * Headers associated with functions in the mmalcam.c module. * Copyright 2013 by Nicholas Tuckett */ #ifndef MMALCAM_H_ #define MMALCAM_H_ typedef struct mmalcam_context *mmalcam_context_ptr; typedef struct mmalcam_context { struct context *cnt; /* pointer to parent motion context structure */ int width; int height; int framerate; struct MMAL_COMPONENT_T *camera_component; struct MMAL_PORT_T *camera_capture_port; struct MMAL_POOL_T *camera_buffer_pool; struct MMAL_QUEUE_T *camera_buffer_queue; struct raspicam_camera_parameters_s *camera_parameters; } mmalcam_context; int mmalcam_start(struct context *cnt); int mmalcam_next(struct context *cnt, struct image_data *img_data); void mmalcam_cleanup(struct mmalcam_context *mmalcam); #endif /* MMALCAM_H_ */ motion-release-4.6.0/src/mmx.h000066400000000000000000000313311452402535500162130ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * mmx.h * Copyright (C) 1997-2001 H. Dietz and R. Fisher */ #ifndef I386MMX_H #define I386MMX_H /* * The type of an value that fits in an MMX register (note that long * long constant values MUST be suffixed by LL and unsigned long long * values by ULL, lest they be truncated by the compiler) */ typedef union { long long q; /* Quadword (64-bit) value */ unsigned long long uq; /* Unsigned Quadword */ int d[2]; /* 2 Doubleword (32-bit) values */ unsigned int ud[2]; /* 2 Unsigned Doubleword */ short w[4]; /* 4 Word (16-bit) values */ unsigned short uw[4]; /* 4 Unsigned Word */ char b[8]; /* 8 Byte (8-bit) values */ unsigned char ub[8]; /* 8 Unsigned Byte */ float s[2]; /* Single-precision (32-bit) value */ } mmx_t; /* On an 8-byte (64-bit) boundary */ #define mmx_i2r(op,imm,reg) \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "i" (imm)) #define mmx_m2r(op,mem,reg) \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "m" (mem)) #define mmx_r2m(op,reg,mem) \ __asm__ __volatile__ (#op " %%" #reg ", %0" \ : "=m" (mem) \ : /* nothing */ ) #define mmx_r2r(op,regs,regd) \ __asm__ __volatile__ (#op " %" #regs ", %" #regd) #define emms() __asm__ __volatile__ ("emms") #define movd_m2r(var,reg) mmx_m2r (movd, var, reg) #define movd_r2m(reg,var) mmx_r2m (movd, reg, var) #define movd_r2r(regs,regd) mmx_r2r (movd, regs, regd) #define movq_m2r(var,reg) mmx_m2r (movq, var, reg) #define movq_r2m(reg,var) mmx_r2m (movq, reg, var) #define movq_r2r(regs,regd) mmx_r2r (movq, regs, regd) #define packssdw_m2r(var,reg) mmx_m2r (packssdw, var, reg) #define packssdw_r2r(regs,regd) mmx_r2r (packssdw, regs, regd) #define packsswb_m2r(var,reg) mmx_m2r (packsswb, var, reg) #define packsswb_r2r(regs,regd) mmx_r2r (packsswb, regs, regd) #define packuswb_m2r(var,reg) mmx_m2r (packuswb, var, reg) #define packuswb_r2r(regs,regd) mmx_r2r (packuswb, regs, regd) #define paddb_m2r(var,reg) mmx_m2r (paddb, var, reg) #define paddb_r2r(regs,regd) mmx_r2r (paddb, regs, regd) #define paddd_m2r(var,reg) mmx_m2r (paddd, var, reg) #define paddd_r2r(regs,regd) mmx_r2r (paddd, regs, regd) #define paddw_m2r(var,reg) mmx_m2r (paddw, var, reg) #define paddw_r2r(regs,regd) mmx_r2r (paddw, regs, regd) #define paddsb_m2r(var,reg) mmx_m2r (paddsb, var, reg) #define paddsb_r2r(regs,regd) mmx_r2r (paddsb, regs, regd) #define paddsw_m2r(var,reg) mmx_m2r (paddsw, var, reg) #define paddsw_r2r(regs,regd) mmx_r2r (paddsw, regs, regd) #define paddusb_m2r(var,reg) mmx_m2r (paddusb, var, reg) #define paddusb_r2r(regs,regd) mmx_r2r (paddusb, regs, regd) #define paddusw_m2r(var,reg) mmx_m2r (paddusw, var, reg) #define paddusw_r2r(regs,regd) mmx_r2r (paddusw, regs, regd) #define pand_m2r(var,reg) mmx_m2r (pand, var, reg) #define pand_r2r(regs,regd) mmx_r2r (pand, regs, regd) #define pandn_m2r(var,reg) mmx_m2r (pandn, var, reg) #define pandn_r2r(regs,regd) mmx_r2r (pandn, regs, regd) #define pcmpeqb_m2r(var,reg) mmx_m2r (pcmpeqb, var, reg) #define pcmpeqb_r2r(regs,regd) mmx_r2r (pcmpeqb, regs, regd) #define pcmpeqd_m2r(var,reg) mmx_m2r (pcmpeqd, var, reg) #define pcmpeqd_r2r(regs,regd) mmx_r2r (pcmpeqd, regs, regd) #define pcmpeqw_m2r(var,reg) mmx_m2r (pcmpeqw, var, reg) #define pcmpeqw_r2r(regs,regd) mmx_r2r (pcmpeqw, regs, regd) #define pcmpgtb_m2r(var,reg) mmx_m2r (pcmpgtb, var, reg) #define pcmpgtb_r2r(regs,regd) mmx_r2r (pcmpgtb, regs, regd) #define pcmpgtd_m2r(var,reg) mmx_m2r (pcmpgtd, var, reg) #define pcmpgtd_r2r(regs,regd) mmx_r2r (pcmpgtd, regs, regd) #define pcmpgtw_m2r(var,reg) mmx_m2r (pcmpgtw, var, reg) #define pcmpgtw_r2r(regs,regd) mmx_r2r (pcmpgtw, regs, regd) #define pmaddwd_m2r(var,reg) mmx_m2r (pmaddwd, var, reg) #define pmaddwd_r2r(regs,regd) mmx_r2r (pmaddwd, regs, regd) #define pmulhw_m2r(var,reg) mmx_m2r (pmulhw, var, reg) #define pmulhw_r2r(regs,regd) mmx_r2r (pmulhw, regs, regd) #define pmullw_m2r(var,reg) mmx_m2r (pmullw, var, reg) #define pmullw_r2r(regs,regd) mmx_r2r (pmullw, regs, regd) #define por_m2r(var,reg) mmx_m2r (por, var, reg) #define por_r2r(regs,regd) mmx_r2r (por, regs, regd) #define pslld_i2r(imm,reg) mmx_i2r (pslld, imm, reg) #define pslld_m2r(var,reg) mmx_m2r (pslld, var, reg) #define pslld_r2r(regs,regd) mmx_r2r (pslld, regs, regd) #define psllq_i2r(imm,reg) mmx_i2r (psllq, imm, reg) #define psllq_m2r(var,reg) mmx_m2r (psllq, var, reg) #define psllq_r2r(regs,regd) mmx_r2r (psllq, regs, regd) #define psllw_i2r(imm,reg) mmx_i2r (psllw, imm, reg) #define psllw_m2r(var,reg) mmx_m2r (psllw, var, reg) #define psllw_r2r(regs,regd) mmx_r2r (psllw, regs, regd) #define psrad_i2r(imm,reg) mmx_i2r (psrad, imm, reg) #define psrad_m2r(var,reg) mmx_m2r (psrad, var, reg) #define psrad_r2r(regs,regd) mmx_r2r (psrad, regs, regd) #define psraw_i2r(imm,reg) mmx_i2r (psraw, imm, reg) #define psraw_m2r(var,reg) mmx_m2r (psraw, var, reg) #define psraw_r2r(regs,regd) mmx_r2r (psraw, regs, regd) #define psrld_i2r(imm,reg) mmx_i2r (psrld, imm, reg) #define psrld_m2r(var,reg) mmx_m2r (psrld, var, reg) #define psrld_r2r(regs,regd) mmx_r2r (psrld, regs, regd) #define psrlq_i2r(imm,reg) mmx_i2r (psrlq, imm, reg) #define psrlq_m2r(var,reg) mmx_m2r (psrlq, var, reg) #define psrlq_r2r(regs,regd) mmx_r2r (psrlq, regs, regd) #define psrlw_i2r(imm,reg) mmx_i2r (psrlw, imm, reg) #define psrlw_m2r(var,reg) mmx_m2r (psrlw, var, reg) #define psrlw_r2r(regs,regd) mmx_r2r (psrlw, regs, regd) #define psubb_m2r(var,reg) mmx_m2r (psubb, var, reg) #define psubb_r2r(regs,regd) mmx_r2r (psubb, regs, regd) #define psubd_m2r(var,reg) mmx_m2r (psubd, var, reg) #define psubd_r2r(regs,regd) mmx_r2r (psubd, regs, regd) #define psubw_m2r(var,reg) mmx_m2r (psubw, var, reg) #define psubw_r2r(regs,regd) mmx_r2r (psubw, regs, regd) #define psubsb_m2r(var,reg) mmx_m2r (psubsb, var, reg) #define psubsb_r2r(regs,regd) mmx_r2r (psubsb, regs, regd) #define psubsw_m2r(var,reg) mmx_m2r (psubsw, var, reg) #define psubsw_r2r(regs,regd) mmx_r2r (psubsw, regs, regd) #define psubusb_m2r(var,reg) mmx_m2r (psubusb, var, reg) #define psubusb_r2r(regs,regd) mmx_r2r (psubusb, regs, regd) #define psubusw_m2r(var,reg) mmx_m2r (psubusw, var, reg) #define psubusw_r2r(regs,regd) mmx_r2r (psubusw, regs, regd) #define punpckhbw_m2r(var,reg) mmx_m2r (punpckhbw, var, reg) #define punpckhbw_r2r(regs,regd) mmx_r2r (punpckhbw, regs, regd) #define punpckhdq_m2r(var,reg) mmx_m2r (punpckhdq, var, reg) #define punpckhdq_r2r(regs,regd) mmx_r2r (punpckhdq, regs, regd) #define punpckhwd_m2r(var,reg) mmx_m2r (punpckhwd, var, reg) #define punpckhwd_r2r(regs,regd) mmx_r2r (punpckhwd, regs, regd) #define punpcklbw_m2r(var,reg) mmx_m2r (punpcklbw, var, reg) #define punpcklbw_r2r(regs,regd) mmx_r2r (punpcklbw, regs, regd) #define punpckldq_m2r(var,reg) mmx_m2r (punpckldq, var, reg) #define punpckldq_r2r(regs,regd) mmx_r2r (punpckldq, regs, regd) #define punpcklwd_m2r(var,reg) mmx_m2r (punpcklwd, var, reg) #define punpcklwd_r2r(regs,regd) mmx_r2r (punpcklwd, regs, regd) #define pxor_m2r(var,reg) mmx_m2r (pxor, var, reg) #define pxor_r2r(regs,regd) mmx_r2r (pxor, regs, regd) /* 3DNOW extensions */ #define pavgusb_m2r(var,reg) mmx_m2r (pavgusb, var, reg) #define pavgusb_r2r(regs,regd) mmx_r2r (pavgusb, regs, regd) /* AMD MMX extensions - also available in intel SSE */ #define mmx_m2ri(op,mem,reg,imm) \ __asm__ __volatile__ (#op " %1, %0, %%" #reg \ : /* nothing */ \ : "X" (mem), "X" (imm)) #define mmx_r2ri(op,regs,regd,imm) \ __asm__ __volatile__ (#op " %0, %%" #regs ", %%" #regd \ : /* nothing */ \ : "X" (imm)) #define mmx_fetch(mem,hint) \ __asm__ __volatile__ ("prefetch" #hint " %0" \ : /* nothing */ \ : "X" (mem)) #define maskmovq(regs,maskreg) mmx_r2ri (maskmovq, regs, maskreg) #define movntq_r2m(mmreg,var) mmx_r2m (movntq, mmreg, var) #define pavgb_m2r(var,reg) mmx_m2r (pavgb, var, reg) #define pavgb_r2r(regs,regd) mmx_r2r (pavgb, regs, regd) #define pavgw_m2r(var,reg) mmx_m2r (pavgw, var, reg) #define pavgw_r2r(regs,regd) mmx_r2r (pavgw, regs, regd) #define pextrw_r2r(mmreg,reg,imm) mmx_r2ri (pextrw, mmreg, reg, imm) #define pinsrw_r2r(reg,mmreg,imm) mmx_r2ri (pinsrw, reg, mmreg, imm) #define pmaxsw_m2r(var,reg) mmx_m2r (pmaxsw, var, reg) #define pmaxsw_r2r(regs,regd) mmx_r2r (pmaxsw, regs, regd) #define pmaxub_m2r(var,reg) mmx_m2r (pmaxub, var, reg) #define pmaxub_r2r(regs,regd) mmx_r2r (pmaxub, regs, regd) #define pminsw_m2r(var,reg) mmx_m2r (pminsw, var, reg) #define pminsw_r2r(regs,regd) mmx_r2r (pminsw, regs, regd) #define pminub_m2r(var,reg) mmx_m2r (pminub, var, reg) #define pminub_r2r(regs,regd) mmx_r2r (pminub, regs, regd) #define pmovmskb(mmreg,reg) \ __asm__ __volatile__ ("movmskps %" #mmreg ", %" #reg) #define pmulhuw_m2r(var,reg) mmx_m2r (pmulhuw, var, reg) #define pmulhuw_r2r(regs,regd) mmx_r2r (pmulhuw, regs, regd) #define prefetcht0(mem) mmx_fetch (mem, t0) #define prefetcht1(mem) mmx_fetch (mem, t1) #define prefetcht2(mem) mmx_fetch (mem, t2) #define prefetchnta(mem) mmx_fetch (mem, nta) #define psadbw_m2r(var,reg) mmx_m2r (psadbw, var, reg) #define psadbw_r2r(regs,regd) mmx_r2r (psadbw, regs, regd) #define pshufw_m2r(var,reg,imm) mmx_m2ri(pshufw, var, reg, imm) #define pshufw_r2r(regs,regd,imm) mmx_r2ri(pshufw, regs, regd, imm) #define sfence() __asm__ __volatile__ ("sfence\n\t") /* SSE2 */ #define pshufhw_m2r(var,reg,imm) mmx_m2ri(pshufhw, var, reg, imm) #define pshufhw_r2r(regs,regd,imm) mmx_r2ri(pshufhw, regs, regd, imm) #define pshuflw_m2r(var,reg,imm) mmx_m2ri(pshuflw, var, reg, imm) #define pshuflw_r2r(regs,regd,imm) mmx_r2ri(pshuflw, regs, regd, imm) #define pshufd_r2r(regs,regd,imm) mmx_r2ri(pshufd, regs, regd, imm) #define movdqa_m2r(var,reg) mmx_m2r (movdqa, var, reg) #define movdqa_r2m(reg,var) mmx_r2m (movdqa, reg, var) #define movdqa_r2r(regs,regd) mmx_r2r (movdqa, regs, regd) #define movdqu_m2r(var,reg) mmx_m2r (movdqu, var, reg) #define movdqu_r2m(reg,var) mmx_r2m (movdqu, reg, var) #define movdqu_r2r(regs,regd) mmx_r2r (movdqu, regs, regd) #define pmullw_r2m(reg,var) mmx_r2m (pmullw, reg, var) #define pslldq_i2r(imm,reg) mmx_i2r (pslldq, imm, reg) #define psrldq_i2r(imm,reg) mmx_i2r (psrldq, imm, reg) #define punpcklqdq_r2r(regs,regd) mmx_r2r (punpcklqdq, regs, regd) #define punpckhqdq_r2r(regs,regd) mmx_r2r (punpckhqdq, regs, regd) #endif /* I386MMX_H */ motion-release-4.6.0/src/motion.c000066400000000000000000003674751452402535500167370ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* motion.c * * Detect changes in a video stream. * Copyright 2000 by Jeroen Vreeken (pe1rxq@amsat.org) * */ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include "ffmpeg.h" #include "netcam.h" #include "netcam_rtsp.h" #include "video_common.h" #include "video_v4l2.h" #include "video_loopback.h" #include "conf.h" #include "alg.h" #include "track.h" #include "event.h" #include "picture.h" #include "rotate.h" #include "webu.h" #include "draw.h" #include "dbse.h" /** * tls_key_threadnr * * TLS key for storing thread number in thread-local storage. */ pthread_key_t tls_key_threadnr; /** * global_lock * * Protects any global variables (like 'threads_running') during updates, * to prevent problems with multiple threads updating at the same time. */ //pthread_mutex_t global_lock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t global_lock; /** * cnt_list * * List of context structures, one for each main Motion thread. */ struct context **cnt_list = NULL; /** * threads_running * * Keeps track of number of Motion threads currently running. Also used * by 'main' to know when all threads have exited. */ volatile int threads_running = 0; /* Set this when we want main to end or restart */ volatile unsigned int finish = 0; /* Log file used instead of stderr and syslog */ FILE *ptr_logfile = NULL; /** * restart * * Differentiates between a quit and a restart. When all threads have * finished running, 'main' checks if 'restart' is true and if so starts * up again (instead of just quitting). */ unsigned int restart = 0; /** * image_ring_resize * * This routine is called from motion_loop to resize the image precapture ringbuffer * NOTE: This function clears all images in the old ring buffer * Parameters: * * cnt Pointer to the motion context structure * new_size The new size of the ring buffer * * Returns: nothing */ static void image_ring_resize(struct context *cnt, int new_size) { /* * Only resize if : * Not in an event and * decreasing at last position in new buffer * increasing at last position in old buffer * e.g. at end of smallest buffer */ if (cnt->event_nr != cnt->prev_event) { int smallest; if (new_size < cnt->imgs.image_ring_size) { /* Decreasing */ smallest = new_size; } else { /* Increasing */ smallest = cnt->imgs.image_ring_size; } if (cnt->imgs.image_ring_in == smallest - 1 || smallest == 0) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Resizing pre_capture buffer to %d items"), new_size); /* Create memory for new ring buffer */ struct image_data *tmp; tmp = mymalloc(new_size * sizeof(struct image_data)); /* * Copy all information from old to new * Smallest is 0 at initial init */ if (smallest > 0) { memcpy(tmp, cnt->imgs.image_ring, sizeof(struct image_data) * smallest); } /* In the new buffers, allocate image memory */ { int i; for(i = smallest; i < new_size; i++) { tmp[i].image_norm = mymalloc(cnt->imgs.size_norm); memset(tmp[i].image_norm, 0x80, cnt->imgs.size_norm); /* initialize to grey */ if (cnt->imgs.size_high > 0) { tmp[i].image_high = mymalloc(cnt->imgs.size_high); memset(tmp[i].image_high, 0x80, cnt->imgs.size_high); } } } /* Free the old ring */ free(cnt->imgs.image_ring); /* Point to the new ring */ cnt->imgs.image_ring = tmp; cnt->current_image = NULL; cnt->imgs.image_ring_size = new_size; cnt->imgs.image_ring_in = 0; cnt->imgs.image_ring_out = 0; } } } /** * image_ring_destroy * * This routine is called when we want to free the ring * * Parameters: * * cnt Pointer to the motion context structure * * Returns: nothing */ static void image_ring_destroy(struct context *cnt) { int i; /* Exit if don't have any ring */ if (cnt->imgs.image_ring == NULL) { return; } /* Free all image buffers */ for (i = 0; i < cnt->imgs.image_ring_size; i++) { free(cnt->imgs.image_ring[i].image_norm); if (cnt->imgs.size_high >0 ) { free(cnt->imgs.image_ring[i].image_high); } } /* Free the ring */ free(cnt->imgs.image_ring); cnt->imgs.image_ring = NULL; cnt->current_image = NULL; cnt->imgs.image_ring_size = 0; } /** * image_save_as_preview * * This routine is called when we detect motion and want to save an image in the preview buffer * * Parameters: * * cnt Pointer to the motion context structure * img Pointer to the image_data structure we want to set as preview image * * Returns: nothing */ static void image_save_as_preview(struct context *cnt, struct image_data *img) { void *image_norm, *image_high; /* Save our pointers to our memory locations for images*/ image_norm = cnt->imgs.preview_image.image_norm; image_high = cnt->imgs.preview_image.image_high; /* Copy over the meta data from the img into preview */ memcpy(&cnt->imgs.preview_image, img, sizeof(struct image_data)); /* Restore the pointers to the memory locations for images*/ cnt->imgs.preview_image.image_norm = image_norm; cnt->imgs.preview_image.image_high = image_high; /* Copy the actual images for norm and high */ memcpy(cnt->imgs.preview_image.image_norm, img->image_norm, cnt->imgs.size_norm); if (cnt->imgs.size_high > 0) { memcpy(cnt->imgs.preview_image.image_high, img->image_high, cnt->imgs.size_high); } /* * If we set output_all to yes and during the event * there is no image with motion, diffs is 0, we are not going to save the preview event */ if (cnt->imgs.preview_image.diffs == 0) { cnt->imgs.preview_image.diffs = 1; } /* draw locate box here when mode = LOCATE_PREVIEW */ if (cnt->locate_motion_mode == LOCATE_PREVIEW) { if (cnt->locate_motion_style == LOCATE_BOX) { alg_draw_location(&img->location, &cnt->imgs, cnt->imgs.width, cnt->imgs.preview_image.image_norm, LOCATE_BOX, LOCATE_NORMAL, cnt->process_thisframe); } else if (cnt->locate_motion_style == LOCATE_REDBOX) { alg_draw_red_location(&img->location, &cnt->imgs, cnt->imgs.width, cnt->imgs.preview_image.image_norm, LOCATE_REDBOX, LOCATE_NORMAL, cnt->process_thisframe); } else if (cnt->locate_motion_style == LOCATE_CROSS) { alg_draw_location(&img->location, &cnt->imgs, cnt->imgs.width, cnt->imgs.preview_image.image_norm, LOCATE_CROSS, LOCATE_NORMAL, cnt->process_thisframe); } else if (cnt->locate_motion_style == LOCATE_REDCROSS) { alg_draw_red_location(&img->location, &cnt->imgs, cnt->imgs.width, cnt->imgs.preview_image.image_norm, LOCATE_REDCROSS, LOCATE_NORMAL, cnt->process_thisframe); } } } /** * context_init * * Initializes a context struct with the default values for all the * variables. * * Parameters: * * cnt - the context struct to destroy * * Returns: nothing */ static void context_init(struct context *cnt) { /* * We first clear the entire structure to zero, then fill in any * values which have non-zero default values. Note that this * assumes that a NULL address pointer has a value of binary 0 * (this is also assumed at other places within the code, i.e. * there are instances of "if (ptr)"). Just for possible future * changes to this assumption, any pointers which are intended * to be initialised to NULL are listed within a comment. */ memset(cnt, 0, sizeof(struct context)); cnt->noise = 255; cnt->lastrate = 25; memcpy(&cnt->track, &track_template, sizeof(struct trackoptions)); cnt->pipe = -1; cnt->mpipe = -1; cnt->vdev = NULL; /*Init to NULL to check loading parms vs web updates*/ cnt->netcam = NULL; cnt->rtsp = NULL; cnt->rtsp_high = NULL; } /** * context_destroy * * Destroys a context struct by freeing allocated memory, calling the * appropriate cleanup functions and finally freeing the struct itself. * * Parameters: * * cnt - the context struct to destroy * * Returns: nothing */ static void context_destroy(struct context *cnt) { unsigned int j; /* Free memory allocated for config parameters */ for (j = 0; config_params[j].param_name != NULL; j++) { if (config_params[j].copy == copy_string ) { void **val; val = (void *)((char *)cnt+(int)config_params[j].conf_value); if (*val) { free(*val); *val = NULL; } } } free(cnt); } /** * sig_handler * * Our SIGNAL-Handler. We need this to handle alarms and external signals. */ static void sig_handler(int signo) { int i; /*The FALLTHROUGH is a special comment required by compiler. Do not edit it*/ switch(signo) { case SIGALRM: /* * Somebody (maybe we ourself) wants us to make a snapshot * This feature triggers snapshots on ALL threads that have * snapshot_interval different from 0. */ if (cnt_list) { i = -1; while (cnt_list[++i]) { if (cnt_list[i]->conf.snapshot_interval) { cnt_list[i]->snapshot = 1; } } } break; case SIGUSR1: /* Trigger the end of a event */ if (cnt_list) { i = -1; while (cnt_list[++i]) { cnt_list[i]->event_stop = TRUE; } } break; case SIGHUP: restart = 1; /* * Fall through, as the value of 'restart' is the only difference * between SIGHUP and the ones below. */ /*FALLTHROUGH*/ case SIGINT: /*FALLTHROUGH*/ case SIGQUIT: /*FALLTHROUGH*/ case SIGTERM: /* * Somebody wants us to quit! We should finish the actual * movie and end up! */ MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Received signal %d."), signo); if (cnt_list) { i = -1; while (cnt_list[++i]) { cnt_list[i]->webcontrol_finish = TRUE; cnt_list[i]->event_stop = TRUE; cnt_list[i]->finish = 1; /* * Don't restart thread when it ends, * all threads restarts if global restart is set */ cnt_list[i]->restart = 0; } } /* * Set flag we want to quit main check threads loop * if restart is set (above) we start up again */ finish = 1; break; case SIGVTALRM: printf("SIGVTALRM went off\n"); break; } } /** * sigchild_handler * * This function is a POSIX compliant replacement of the commonly used * signal(SIGCHLD, SIG_IGN). */ static void sigchild_handler(int signo) { (void)signo; #ifdef WNOHANG while (waitpid(-1, NULL, WNOHANG) > 0) { continue; } #endif /* WNOHANG */ return; } /** * setup_signals * Attaches handlers to a number of signals that Motion need to catch. */ static void setup_signals(void) { /* * Setup signals and do some initialization. 1 in the call to * 'motion_startup' means that Motion will become a daemon if so has been * requested, and argc and argc are necessary for reading the command * line options. */ struct sigaction sig_handler_action; struct sigaction sigchild_action; #ifdef SA_NOCLDWAIT sigchild_action.sa_flags = SA_NOCLDWAIT; #else sigchild_action.sa_flags = 0; #endif sigchild_action.sa_handler = sigchild_handler; sigemptyset(&sigchild_action.sa_mask); #ifdef SA_RESTART sig_handler_action.sa_flags = SA_RESTART; #else sig_handler_action.sa_flags = 0; #endif sig_handler_action.sa_handler = sig_handler; sigemptyset(&sig_handler_action.sa_mask); /* Enable automatic zombie reaping */ sigaction(SIGCHLD, &sigchild_action, NULL); sigaction(SIGPIPE, &sigchild_action, NULL); sigaction(SIGALRM, &sig_handler_action, NULL); sigaction(SIGHUP, &sig_handler_action, NULL); sigaction(SIGINT, &sig_handler_action, NULL); sigaction(SIGQUIT, &sig_handler_action, NULL); sigaction(SIGTERM, &sig_handler_action, NULL); sigaction(SIGUSR1, &sig_handler_action, NULL); /* use SIGVTALRM as a way to break out of the ioctl, don't restart */ sig_handler_action.sa_flags = 0; sigaction(SIGVTALRM, &sig_handler_action, NULL); } /** * motion_remove_pid * This function remove the process id file ( pid file ) before motion exit. */ void motion_remove_pid(void) { if ((cnt_list[0]->conf.pid_file) && (restart == 0)) { if (!unlink(cnt_list[0]->conf.pid_file)) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Removed process id file (pid file).")); } else { MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO, _("Error removing pid file")); } } if (ptr_logfile) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Closing logfile (%s)."), cnt_list[0]->conf.log_file); myfclose(ptr_logfile); set_log_mode(LOGMODE_NONE); ptr_logfile = NULL; } } /** * motion_detected * * Called from 'motion_loop' when motion is detected * Can be called when no motion if emulate_motion is set! * * Parameters: * * cnt - current thread's context struct * dev - video device file descriptor * img - pointer to the captured image_data with detected motion */ static void motion_detected(struct context *cnt, int dev, struct image_data *img) { struct config *conf = &cnt->conf; struct images *imgs = &cnt->imgs; struct coord *location = &img->location; struct tm event_tm; int indx; /* Draw location */ if (cnt->locate_motion_mode == LOCATE_ON) { if (cnt->locate_motion_style == LOCATE_BOX) { alg_draw_location(location, imgs, imgs->width, img->image_norm, LOCATE_BOX, LOCATE_BOTH, cnt->process_thisframe); } else if (cnt->locate_motion_style == LOCATE_REDBOX) { alg_draw_red_location(location, imgs, imgs->width, img->image_norm, LOCATE_REDBOX, LOCATE_BOTH, cnt->process_thisframe); } else if (cnt->locate_motion_style == LOCATE_CROSS) { alg_draw_location(location, imgs, imgs->width, img->image_norm, LOCATE_CROSS, LOCATE_BOTH, cnt->process_thisframe); } else if (cnt->locate_motion_style == LOCATE_REDCROSS) { alg_draw_red_location(location, imgs, imgs->width, img->image_norm, LOCATE_REDCROSS, LOCATE_BOTH, cnt->process_thisframe); } } /* Calculate how centric motion is if configured preview center*/ if (cnt->new_img & NEWIMG_CENTER) { unsigned int distX = abs((imgs->width / 2) - location->x); unsigned int distY = abs((imgs->height / 2) - location->y); img->cent_dist = distX * distX + distY * distY; } /* Do things only if we have got minimum_motion_frames */ if (img->flags & IMAGE_TRIGGER) { /* Take action if this is a new event and we have a trigger image */ if (cnt->event_nr != cnt->prev_event) { /* * Reset prev_event number to current event and save event time * in both time_t and struct tm format. */ cnt->prev_event = cnt->event_nr; cnt->event_tv = img->timestamp_tv; localtime_r(&cnt->event_tv.tv_sec, &event_tm); sprintf(cnt->eventid,"%05d",cnt->camera_id); strftime(cnt->eventid+5, 15,"%Y%m%d%H%M%S", &event_tm); /* * Since this is a new event we create the event_text_string used for * the %C conversion specifier. We may already need it for * on_motion_detected_commend so it must be done now. */ mystrftime(cnt, cnt->text_event_string, sizeof(cnt->text_event_string), cnt->conf.text_event, &img->timestamp_tv, NULL, 0); MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO , _("Motion detected - starting event %d.") , cnt->event_nr); /* EVENT_FIRSTMOTION triggers on_event_start_command and event_ffmpeg_newfile */ indx = cnt->imgs.image_ring_out-1; do { indx++; if (indx == cnt->imgs.image_ring_size) { indx = 0; } if ((cnt->imgs.image_ring[indx].flags & (IMAGE_SAVE | IMAGE_SAVED)) == IMAGE_SAVE) { event(cnt, EVENT_FIRSTMOTION, img, NULL, NULL, &cnt->imgs.image_ring[indx].timestamp_tv); indx = cnt->imgs.image_ring_in; } } while (indx != cnt->imgs.image_ring_in); /* always save first motion frame as preview-shot, may be changed to an other one later */ if (cnt->new_img & (NEWIMG_FIRST | NEWIMG_BEST | NEWIMG_CENTER)) { image_save_as_preview(cnt, img); } /* Save first motion frame */ if (cnt->new_img & NEWIMG_FIRST) { event(cnt, EVENT_IMAGE_PREVIEW, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); } } /* EVENT_MOTION triggers event_beep and on_motion_detected_command */ event(cnt, EVENT_MOTION, NULL, NULL, NULL, &img->timestamp_tv); } /* Limit framerate */ if (img->shot < conf->framerate) { /* * If config option stream_motion is enabled, send the latest motion detected image * to the stream but only if it is not the first shot within a second. This is to * avoid double frames since we already have sent a frame to the stream. * We also disable this in setup_mode. */ if (conf->stream_motion && !conf->setup_mode && img->shot != 1) { event(cnt, EVENT_STREAM, img, NULL, NULL, &img->timestamp_tv); } /* * Save motion jpeg, if configured * Output the image_out (motion) picture. */ if (conf->picture_output_motion) { event(cnt, EVENT_IMAGEM_DETECTED, NULL, NULL, NULL, &img->timestamp_tv); } } /* if track enabled and auto track on */ if (cnt->track.type && cnt->track.active) { cnt->moved = track_move(cnt, dev, location, imgs, 0); } } /** * process_image_ring * * Called from 'motion_loop' to save images / send images to movie * * Parameters: * * cnt - current thread's context struct */ static void process_image_ring(struct context *cnt) { /* * We are going to send an event, in the events there is still * some code that use cnt->current_image * so set it temporary to our image */ struct image_data *saved_current_image = cnt->current_image; /* If image is flaged to be saved and not saved yet, process it */ do { /* Check if we should save/send this image, breakout if not */ assert(cnt->imgs.image_ring_out < cnt->imgs.image_ring_size); if ((cnt->imgs.image_ring[cnt->imgs.image_ring_out].flags & (IMAGE_SAVE | IMAGE_SAVED)) != IMAGE_SAVE) { break; } /* Set inte global context that we are working with this image */ cnt->current_image = &cnt->imgs.image_ring[cnt->imgs.image_ring_out]; if (cnt->imgs.image_ring[cnt->imgs.image_ring_out].shot < cnt->conf.framerate) { if (cnt_list[0]->log_level >= DBG) { char tmp[32]; const char *t; if (cnt->imgs.image_ring[cnt->imgs.image_ring_out].flags & IMAGE_TRIGGER) { t = "Trigger"; } else if (cnt->imgs.image_ring[cnt->imgs.image_ring_out].flags & IMAGE_MOTION) { t = "Motion"; } else if (cnt->imgs.image_ring[cnt->imgs.image_ring_out].flags & IMAGE_PRECAP) { t = "Precap"; } else if (cnt->imgs.image_ring[cnt->imgs.image_ring_out].flags & IMAGE_POSTCAP) { t = "Postcap"; } else { t = "Other"; } mystrftime(cnt, tmp, sizeof(tmp), "%H:%M:%S-%q" , &cnt->imgs.image_ring[cnt->imgs.image_ring_out].timestamp_tv , NULL, 0); draw_text(cnt->imgs.image_ring[cnt->imgs.image_ring_out].image_norm , cnt->imgs.width, cnt->imgs.height, 10 , 20, tmp, cnt->text_scale); draw_text(cnt->imgs.image_ring[cnt->imgs.image_ring_out].image_norm , cnt->imgs.width, cnt->imgs.height, 10 , 20 + (10*cnt->text_scale), t, cnt->text_scale); } /* Output the picture to jpegs and ffmpeg */ event(cnt, EVENT_IMAGE_DETECTED, &cnt->imgs.image_ring[cnt->imgs.image_ring_out], NULL, NULL, &cnt->imgs.image_ring[cnt->imgs.image_ring_out].timestamp_tv); /* * Check if we must add any "filler" frames into movie to keep up fps * Only if we are recording videos ( ffmpeg or extenal pipe ) * While the overall elapsed time might be correct, if there are * many duplicated frames, say 10 fps, 5 duplicated, the video will * look like it is frozen every second for half a second. */ if (!cnt->conf.movie_duplicate_frames) { /* don't duplicate frames */ } else if ((cnt->imgs.image_ring[cnt->imgs.image_ring_out].shot == 0) && (cnt->ffmpeg_output || (cnt->conf.movie_extpipe_use && cnt->extpipe))) { /* * movie_last_shoot is -1 when file is created, * we don't know how many frames there is in first sec */ if (cnt->movie_last_shot >= 0) { if (cnt_list[0]->log_level >= DBG) { int frames = cnt->movie_fps - (cnt->movie_last_shot + 1); if (frames > 0) { char tmp[25]; MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO ,_("Added %d fillerframes into movie"), frames); sprintf(tmp, "Fillerframes %d", frames); draw_text(cnt->imgs.image_ring[cnt->imgs.image_ring_out].image_norm, cnt->imgs.width, cnt->imgs.height, 10, 40, tmp, cnt->text_scale); } } /* Check how many frames it was last sec */ while ((cnt->movie_last_shot + 1) < cnt->movie_fps) { /* Add a filler frame into encoder */ event(cnt, EVENT_FFMPEG_PUT, &cnt->imgs.image_ring[cnt->imgs.image_ring_out], NULL, NULL, &cnt->imgs.image_ring[cnt->imgs.image_ring_out].timestamp_tv); cnt->movie_last_shot++; } } cnt->movie_last_shot = 0; } else if (cnt->imgs.image_ring[cnt->imgs.image_ring_out].shot != (cnt->movie_last_shot + 1)) { /* We are out of sync! Propably we got motion - no motion - motion */ cnt->movie_last_shot = -1; } /* * Save last shot added to movie * only when we not are within first sec */ if (cnt->movie_last_shot >= 0) { cnt->movie_last_shot = cnt->imgs.image_ring[cnt->imgs.image_ring_out].shot; } } /* Mark the image as saved */ cnt->imgs.image_ring[cnt->imgs.image_ring_out].flags |= IMAGE_SAVED; /* Store it as a preview image, only if it has motion */ if (cnt->imgs.image_ring[cnt->imgs.image_ring_out].flags & IMAGE_MOTION) { /* Check for most significant preview-shot when picture_output=best */ if (cnt->new_img & NEWIMG_BEST) { if (cnt->imgs.image_ring[cnt->imgs.image_ring_out].diffs > cnt->imgs.preview_image.diffs) { image_save_as_preview(cnt, &cnt->imgs.image_ring[cnt->imgs.image_ring_out]); } } /* Check for most significant preview-shot when picture_output=center */ if (cnt->new_img & NEWIMG_CENTER) { if (cnt->imgs.image_ring[cnt->imgs.image_ring_out].cent_dist < cnt->imgs.preview_image.cent_dist) { image_save_as_preview(cnt, &cnt->imgs.image_ring[cnt->imgs.image_ring_out]); } } } /* Increment to image after last sended */ if (++cnt->imgs.image_ring_out >= cnt->imgs.image_ring_size) { cnt->imgs.image_ring_out = 0; } /* loop until out and in is same e.g. buffer empty */ } while (cnt->imgs.image_ring_out != cnt->imgs.image_ring_in); /* restore global context values */ cnt->current_image = saved_current_image; } static int init_camera_type(struct context *cnt) { cnt->camera_type = CAMERA_TYPE_UNKNOWN; #ifdef HAVE_MMAL if (cnt->conf.mmalcam_name) { cnt->camera_type = CAMERA_TYPE_MMAL; return 0; } #endif // HAVE_MMAL if (cnt->conf.netcam_url) { if ((strncmp(cnt->conf.netcam_url,"mjpeg",5) == 0) || (strncmp(cnt->conf.netcam_url,"ftp" ,3) == 0) || (strncmp(cnt->conf.netcam_url,"mjpg" ,4) == 0) || (strncmp(cnt->conf.netcam_url,"jpeg" ,4) == 0)) { cnt->camera_type = CAMERA_TYPE_NETCAM; } else { cnt->camera_type = CAMERA_TYPE_RTSP; } return 0; } #ifdef HAVE_BKTR if (strncmp(cnt->conf.video_device,"/dev/bktr",9) == 0) { cnt->camera_type = CAMERA_TYPE_BKTR; return 0; } #endif // HAVE_BKTR #ifdef HAVE_V4L2 if (cnt->conf.video_device) { cnt->camera_type = CAMERA_TYPE_V4L2; return 0; } #endif // HAVE_V4L2 MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO , _("Unable to determine camera type (MMAL, Netcam, V4L2, BKTR)")); return -1; } static void init_mask_privacy(struct context *cnt) { int indxrow, indxcol; int start_cr, offset_cb, start_cb; int y_index, uv_index; int indx_img, indx_max; /* Counter and max for norm/high */ int indx_width, indx_height; unsigned char *img_temp, *img_temp_uv; FILE *picture; /* Load the privacy file if any */ cnt->imgs.mask_privacy = NULL; cnt->imgs.mask_privacy_uv = NULL; cnt->imgs.mask_privacy_high = NULL; cnt->imgs.mask_privacy_high_uv = NULL; if (cnt->conf.mask_privacy) { if ((picture = myfopen(cnt->conf.mask_privacy, "re"))) { MOTION_LOG(INF, TYPE_ALL, NO_ERRNO, _("Opening privacy mask file")); /* * NOTE: The mask is expected to have the output dimensions. I.e., the mask * applies to the already rotated image, not the capture image. Thus, use * width and height from imgs. */ cnt->imgs.mask_privacy = get_pgm(picture, cnt->imgs.width, cnt->imgs.height); /* We only need the "or" mask for the U & V chrominance area. */ cnt->imgs.mask_privacy_uv = mymalloc((cnt->imgs.height * cnt->imgs.width) / 2); if (cnt->imgs.size_high > 0) { MOTION_LOG(INF, TYPE_ALL, NO_ERRNO ,_("Opening high resolution privacy mask file")); rewind(picture); cnt->imgs.mask_privacy_high = get_pgm(picture, cnt->imgs.width_high, cnt->imgs.height_high); cnt->imgs.mask_privacy_high_uv = mymalloc((cnt->imgs.height_high * cnt->imgs.width_high) / 2); } myfclose(picture); } else { MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO ,_("Error opening mask file %s"), cnt->conf.mask_privacy); /* Try to write an empty mask file to make it easier for the user to edit it */ put_fixed_mask(cnt, cnt->conf.mask_privacy); } if (!cnt->imgs.mask_privacy) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Failed to read mask privacy image. Mask privacy feature disabled.")); } else { MOTION_LOG(INF, TYPE_ALL, NO_ERRNO ,_("Mask privacy file \"%s\" loaded."), cnt->conf.mask_privacy); indx_img = 1; indx_max = 1; if (cnt->imgs.size_high > 0) { indx_max = 2; } while (indx_img <= indx_max) { if (indx_img == 1) { start_cr = (cnt->imgs.height * cnt->imgs.width); offset_cb = ((cnt->imgs.height * cnt->imgs.width)/4); start_cb = start_cr + offset_cb; indx_width = cnt->imgs.width; indx_height = cnt->imgs.height; img_temp = cnt->imgs.mask_privacy; img_temp_uv = cnt->imgs.mask_privacy_uv; } else { start_cr = (cnt->imgs.height_high * cnt->imgs.width_high); offset_cb = ((cnt->imgs.height_high * cnt->imgs.width_high)/4); start_cb = start_cr + offset_cb; indx_width = cnt->imgs.width_high; indx_height = cnt->imgs.height_high; img_temp = cnt->imgs.mask_privacy_high; img_temp_uv = cnt->imgs.mask_privacy_high_uv; } for (indxrow = 0; indxrow < indx_height; indxrow++) { for (indxcol = 0; indxcol < indx_width; indxcol++) { y_index = indxcol + (indxrow * indx_width); if (img_temp[y_index] == 0xff) { if ((indxcol % 2 == 0) && (indxrow % 2 == 0) ) { uv_index = (indxcol/2) + ((indxrow * indx_width)/4); img_temp[start_cr + uv_index] = 0xff; img_temp[start_cb + uv_index] = 0xff; img_temp_uv[uv_index] = 0x00; img_temp_uv[offset_cb + uv_index] = 0x00; } } else { img_temp[y_index] = 0x00; if ((indxcol % 2 == 0) && (indxrow % 2 == 0) ) { uv_index = (indxcol/2) + ((indxrow * indx_width)/4); img_temp[start_cr + uv_index] = 0x00; img_temp[start_cb + uv_index] = 0x00; img_temp_uv[uv_index] = 0x80; img_temp_uv[offset_cb + uv_index] = 0x80; } } } } indx_img++; } } } } static void init_text_scale(struct context *cnt) { /* Consider that web interface may change conf values at any moment. * The below can put two sections in the image so make sure that after * scaling does not occupy more than 1/4 of image (10 pixels * 2 lines) */ cnt->text_scale = cnt->conf.text_scale; if (cnt->text_scale <= 0) { cnt->text_scale = 1; } if ((cnt->text_scale * 10 * 2) > (cnt->imgs.width / 4)) { cnt->text_scale = (cnt->imgs.width / (4 * 10 * 2)); if (cnt->text_scale <= 0) { cnt->text_scale = 1; } MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("Invalid text scale. Adjusted to %d"), cnt->text_scale); } if ((cnt->text_scale * 10 * 2) > (cnt->imgs.height / 4)) { cnt->text_scale = (cnt->imgs.height / (4 * 10 * 2)); if (cnt->text_scale <= 0) { cnt->text_scale = 1; } MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("Invalid text scale. Adjusted to %d"), cnt->text_scale); } /* If we had to modify the scale, change conf so we don't get another message */ cnt->conf.text_scale = cnt->text_scale; } static void mot_stream_init(struct context *cnt) { /* The image buffers are allocated in event_stream_put if needed*/ pthread_mutex_init(&cnt->mutex_stream, NULL); cnt->imgs.substream_image = NULL; cnt->stream_norm.jpeg_size = 0; cnt->stream_norm.jpeg_data = NULL; cnt->stream_norm.cnct_count = 0; cnt->stream_sub.jpeg_size = 0; cnt->stream_sub.jpeg_data = NULL; cnt->stream_sub.cnct_count = 0; cnt->stream_motion.jpeg_size = 0; cnt->stream_motion.jpeg_data = NULL; cnt->stream_motion.cnct_count = 0; cnt->stream_source.jpeg_size = 0; cnt->stream_source.jpeg_data = NULL; cnt->stream_source.cnct_count = 0; } static void mot_stream_deinit(struct context *cnt) { /* Need to check whether buffers were allocated since init * function defers the allocations to event_stream_put */ pthread_mutex_destroy(&cnt->mutex_stream); if (cnt->imgs.substream_image != NULL) { free(cnt->imgs.substream_image); cnt->imgs.substream_image = NULL; } if (cnt->stream_norm.jpeg_data != NULL) { free(cnt->stream_norm.jpeg_data); cnt->stream_norm.jpeg_data = NULL; } if (cnt->stream_sub.jpeg_data != NULL) { free(cnt->stream_sub.jpeg_data); cnt->stream_sub.jpeg_data = NULL; } if (cnt->stream_motion.jpeg_data != NULL) { free(cnt->stream_motion.jpeg_data); cnt->stream_motion.jpeg_data = NULL; } if (cnt->stream_source.jpeg_data != NULL) { free(cnt->stream_source.jpeg_data); cnt->stream_source.jpeg_data = NULL; } } /** * motion_init * * This routine is called from motion_loop (the main thread of the program) to do * all of the initialization required before starting the actual run. * * Parameters: * * cnt Pointer to the motion context structure * * Returns: 0 OK * -1 Fatal error, open loopback error * -2 Fatal error, open SQL database error * -3 Fatal error, image dimensions are not modulo 8 */ static int motion_init(struct context *cnt) { FILE *picture; int indx, retcd; util_threadname_set("ml",cnt->threadnr,cnt->conf.camera_name); /* Store thread number in TLS. */ pthread_setspecific(tls_key_threadnr, (void *)((unsigned long)cnt->threadnr)); gettimeofday(&cnt->current_tv, NULL); cnt->smartmask_speed = 0; /* * We initialize cnt->event_nr to 1 and cnt->prev_event to 0 (not really needed) so * that certain code below does not run until motion has been detected the first time */ cnt->event_nr = 1; cnt->prev_event = 0; cnt->lightswitch_framecounter = 0; cnt->detecting_motion = 0; cnt->event_user = FALSE; cnt->event_stop = FALSE; /* Make sure to default the high res to zero */ cnt->imgs.width_high = 0; cnt->imgs.height_high = 0; cnt->imgs.size_high = 0; cnt->movie_passthrough = cnt->conf.movie_passthrough; /* Pause may have been set via command line. If so, keep that value*/ if (cnt->pause == 0) { cnt->pause = cnt->conf.pause; } MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Camera %d started: motion detection %s"), cnt->camera_id, cnt->pause ? _("Disabled"):_("Enabled")); if (!cnt->conf.target_dir) { cnt->conf.target_dir = mystrdup("."); } if (init_camera_type(cnt) != 0 ) { return -3; } if ((cnt->camera_type != CAMERA_TYPE_RTSP) && (cnt->movie_passthrough)) { MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO,_("Pass-through processing disabled.")); cnt->movie_passthrough = FALSE; } if ((cnt->conf.height == 0) || (cnt->conf.width == 0)) { MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("Invalid configuration dimensions %dx%d"),cnt->conf.height,cnt->conf.width); cnt->conf.height = DEF_HEIGHT; cnt->conf.width = DEF_WIDTH; MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("Using default dimensions %dx%d"),cnt->conf.height,cnt->conf.width); } if (cnt->conf.width % 8) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Image width (%d) requested is not modulo 8."), cnt->conf.width); cnt->conf.width = cnt->conf.width - (cnt->conf.width % 8) + 8; MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Adjusting width to next higher multiple of 8 (%d)."), cnt->conf.width); } if (cnt->conf.height % 8) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Image height (%d) requested is not modulo 8."), cnt->conf.height); cnt->conf.height = cnt->conf.height - (cnt->conf.height % 8) + 8; MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Adjusting height to next higher multiple of 8 (%d)."), cnt->conf.height); } if (cnt->conf.width < 64) { cnt->conf.width = 64; } if (cnt->conf.height < 64) { cnt->conf.height = 64; } /* set the device settings */ cnt->video_dev = vid_start(cnt); /* * We failed to get an initial image from a camera * So we need to guess height and width based on the config * file options. */ if (cnt->video_dev == -1) { MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("Could not fetch initial image from camera ")); MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("Motion continues using width and height from config file(s)")); cnt->imgs.width = cnt->conf.width; cnt->imgs.height = cnt->conf.height; cnt->imgs.size_norm = cnt->conf.width * cnt->conf.height * 3 / 2; cnt->imgs.motionsize = cnt->conf.width * cnt->conf.height; } else if (cnt->video_dev == -2) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Could not fetch initial image from camera ")); MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Motion only supports width and height modulo 8")); return -3; } /* Revalidate we got a valid image size */ if ((cnt->imgs.width % 8) || (cnt->imgs.height % 8)) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Image width (%d) or height(%d) requested is not modulo 8.") ,cnt->imgs.width, cnt->imgs.height); return -3; } if ((cnt->imgs.width < 64) || (cnt->imgs.height < 64)) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Motion only supports width and height greater than or equal to 64 %dx%d") ,cnt->imgs.width, cnt->imgs.height); return -3; } /* Substream size notification*/ if ((cnt->imgs.width % 16) || (cnt->imgs.height % 16)) { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("Substream not available. Image sizes not modulo 16.")); } /* We set size_high here so that it can be used in the retry function to determine whether * we need to break and reallocate buffers */ cnt->imgs.size_high = (cnt->imgs.width_high * cnt->imgs.height_high * 3) / 2; image_ring_resize(cnt, 1); /* Create a initial precapture ring buffer with 1 frame */ cnt->imgs.ref = mymalloc(cnt->imgs.size_norm); cnt->imgs.img_motion.image_norm = mymalloc(cnt->imgs.size_norm); /* contains the moving objects of ref. frame */ cnt->imgs.ref_dyn = mymalloc(cnt->imgs.motionsize * sizeof(*cnt->imgs.ref_dyn)); cnt->imgs.image_virgin.image_norm = mymalloc(cnt->imgs.size_norm); cnt->imgs.image_vprvcy.image_norm = mymalloc(cnt->imgs.size_norm); cnt->imgs.smartmask = mymalloc(cnt->imgs.motionsize); cnt->imgs.smartmask_final = mymalloc(cnt->imgs.motionsize); cnt->imgs.smartmask_buffer = mymalloc(cnt->imgs.motionsize * sizeof(*cnt->imgs.smartmask_buffer)); cnt->imgs.labels = mymalloc(cnt->imgs.motionsize * sizeof(*cnt->imgs.labels)); cnt->imgs.labelsize = mymalloc((cnt->imgs.motionsize/2+1) * sizeof(*cnt->imgs.labelsize)); cnt->imgs.preview_image.image_norm = mymalloc(cnt->imgs.size_norm); cnt->imgs.common_buffer = mymalloc(3 * cnt->imgs.width * cnt->imgs.height); if (cnt->imgs.size_high > 0) { cnt->imgs.image_virgin.image_high = mymalloc(cnt->imgs.size_high); cnt->imgs.preview_image.image_high = mymalloc(cnt->imgs.size_high); } mot_stream_init(cnt); /* Set output picture type */ if (mystreq(cnt->conf.picture_type, "ppm")) { cnt->imgs.picture_type = IMAGE_TYPE_PPM; } else if (mystreq(cnt->conf.picture_type, "grey")) { cnt->imgs.picture_type = IMAGE_TYPE_GREY; } else if (mystreq(cnt->conf.picture_type, "webp")) { #ifdef HAVE_WEBP cnt->imgs.picture_type = IMAGE_TYPE_WEBP; #else /* Fallback to jpeg if webp was selected in the config file, but the support for it was not compiled in */ MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("webp image format is not available, failing back to jpeg")); cnt->imgs.picture_type = IMAGE_TYPE_JPEG; #endif /* HAVE_WEBP */ } else { cnt->imgs.picture_type = IMAGE_TYPE_JPEG; } /* * Now is a good time to init rotation data. Since vid_start has been * called, we know that we have imgs.width and imgs.height. When capturing * from a V4L device, these are copied from the corresponding conf values * in vid_start. When capturing from a netcam, they get set in netcam_start, * which is called from vid_start. * * rotate_init will set cap_width and cap_height in cnt->rotate_data. */ rotate_init(cnt); /* rotate_deinit is called in main */ init_text_scale(cnt); /*Initialize and validate the text_scale */ /* Capture first image, or we will get an alarm on start */ if (cnt->video_dev >= 0) { int i; for (i = 0; i < 5; i++) { if (vid_next(cnt, &cnt->imgs.image_virgin) == 0) { break; } SLEEP(2, 0); } if (i >= 5) { memset(cnt->imgs.image_virgin.image_norm, 0x80, cnt->imgs.size_norm); /* initialize to grey */ draw_text(cnt->imgs.image_virgin.image_norm, cnt->imgs.width, cnt->imgs.height, 10, 20, "Error capturing first image", cnt->text_scale); MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO, _("Error capturing first image")); } } cnt->current_image = &cnt->imgs.image_ring[cnt->imgs.image_ring_in]; /* create a reference frame */ alg_update_reference_frame(cnt, RESET_REF_FRAME); #if defined(HAVE_V4L2) && !defined(BSD) /* open video loopback devices if enabled */ if (cnt->conf.video_pipe) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Opening video loopback device for normal pictures")); /* vid_startpipe should get the output dimensions */ cnt->pipe = vlp_startpipe(cnt->conf.video_pipe, cnt->imgs.width, cnt->imgs.height); if (cnt->pipe < 0) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Failed to open video loopback for normal pictures")); return -1; } } if (cnt->conf.video_pipe_motion) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Opening video loopback device for motion pictures")); /* vid_startpipe should get the output dimensions */ cnt->mpipe = vlp_startpipe(cnt->conf.video_pipe_motion, cnt->imgs.width, cnt->imgs.height); if (cnt->mpipe < 0) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Failed to open video loopback for motion pictures")); return -1; } } #endif /* HAVE_V4L2 && !BSD */ retcd = dbse_init(cnt); if (retcd != 0) { return retcd; } /* Load the mask file if any */ if (cnt->conf.mask_file) { if ((picture = myfopen(cnt->conf.mask_file, "re"))) { /* * NOTE: The mask is expected to have the output dimensions. I.e., the mask * applies to the already rotated image, not the capture image. Thus, use * width and height from imgs. */ cnt->imgs.mask = get_pgm(picture, cnt->imgs.width, cnt->imgs.height); myfclose(picture); } else { MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO ,_("Error opening mask file %s") ,cnt->conf.mask_file); /* * Try to write an empty mask file to make it easier * for the user to edit it */ put_fixed_mask(cnt, cnt->conf.mask_file); } if (!cnt->imgs.mask) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Failed to read mask image. Mask feature disabled.")); } else { MOTION_LOG(INF, TYPE_ALL, NO_ERRNO ,_("Maskfile \"%s\" loaded.") ,cnt->conf.mask_file); } } else { cnt->imgs.mask = NULL; } init_mask_privacy(cnt); /* Always initialize smart_mask - someone could turn it on later... */ memset(cnt->imgs.smartmask, 0, cnt->imgs.motionsize); memset(cnt->imgs.smartmask_final, 255, cnt->imgs.motionsize); memset(cnt->imgs.smartmask_buffer, 0, cnt->imgs.motionsize * sizeof(*cnt->imgs.smartmask_buffer)); /* Set noise level */ cnt->noise = cnt->conf.noise_level; /* Set threshold value */ cnt->threshold = cnt->conf.threshold; if (cnt->conf.threshold_maximum > cnt->conf.threshold ) { cnt->threshold_maximum = cnt->conf.threshold_maximum; } else { cnt->threshold_maximum = (cnt->imgs.height * cnt->imgs.width * 3) / 2; } /* Prevent first few frames from triggering motion... */ cnt->moved = 8; /* Work out expected frame rate based on config setting */ if (cnt->conf.framerate < 2) { cnt->conf.framerate = 2; } /* 2 sec startup delay so FPS is calculated correct */ cnt->startup_frames = (cnt->conf.framerate * 2) + cnt->conf.pre_capture + cnt->conf.minimum_motion_frames; cnt->required_frame_time = 1000000L / cnt->conf.framerate; cnt->frame_delay = cnt->required_frame_time; /* * Reserve enough space for a 10 second timing history buffer. Note that, * if there is any problem on the allocation, mymalloc does not return. */ cnt->rolling_average_data = NULL; cnt->rolling_average_limit = 10 * cnt->conf.framerate; cnt->rolling_average_data = mymalloc(sizeof(cnt->rolling_average_data) * cnt->rolling_average_limit); /* Preset history buffer with expected frame rate */ for (indx = 0; indx < cnt->rolling_average_limit; indx++) { cnt->rolling_average_data[indx] = cnt->required_frame_time; } cnt->track_posx = 0; cnt->track_posy = 0; if (cnt->track.type) { cnt->moved = track_center(cnt, cnt->video_dev, 0, 0, 0); } /* Initialize area detection */ cnt->area_minx[0] = cnt->area_minx[3] = cnt->area_minx[6] = 0; cnt->area_miny[0] = cnt->area_miny[1] = cnt->area_miny[2] = 0; cnt->area_minx[1] = cnt->area_minx[4] = cnt->area_minx[7] = cnt->imgs.width / 3; cnt->area_maxx[0] = cnt->area_maxx[3] = cnt->area_maxx[6] = cnt->imgs.width / 3; cnt->area_minx[2] = cnt->area_minx[5] = cnt->area_minx[8] = cnt->imgs.width / 3 * 2; cnt->area_maxx[1] = cnt->area_maxx[4] = cnt->area_maxx[7] = cnt->imgs.width / 3 * 2; cnt->area_miny[3] = cnt->area_miny[4] = cnt->area_miny[5] = cnt->imgs.height / 3; cnt->area_maxy[0] = cnt->area_maxy[1] = cnt->area_maxy[2] = cnt->imgs.height / 3; cnt->area_miny[6] = cnt->area_miny[7] = cnt->area_miny[8] = cnt->imgs.height / 3 * 2; cnt->area_maxy[3] = cnt->area_maxy[4] = cnt->area_maxy[5] = cnt->imgs.height / 3 * 2; cnt->area_maxx[2] = cnt->area_maxx[5] = cnt->area_maxx[8] = cnt->imgs.width; cnt->area_maxy[6] = cnt->area_maxy[7] = cnt->area_maxy[8] = cnt->imgs.height; cnt->areadetect_eventnbr = 0; cnt->timenow = 0; cnt->timebefore = 0; cnt->rate_limit = 0; cnt->last_tv.tv_sec = 0; cnt->last_tv.tv_usec = 0; cnt->lastframe_tv = cnt->last_tv; cnt->event_tv = cnt->last_tv; cnt->movie_tv = cnt->last_tv; cnt->lostconnection_tv = cnt->last_tv; cnt->lastframe_tv = cnt->last_tv; cnt->minimum_frame_time_downcounter = cnt->conf.minimum_frame_time; cnt->get_image = 1; cnt->olddiffs = 0; cnt->smartmask_ratio = 0; cnt->smartmask_count = 20; cnt->previous_diffs = 0; cnt->previous_location_x = 0; cnt->previous_location_y = 0; cnt->time_last_frame = 1; cnt->time_current_frame = 0; cnt->smartmask_lastrate = 0; cnt->passflag = 0; //only purpose to flag first frame /*If multiple cameras then we must set the pass flag for * context zero since it is just the master and will * not be set as a camera loop occurs */ if (cnt_list[1] != NULL) { cnt_list[0]->passflag = 1; } cnt->rolling_frame = 0; if (cnt->conf.emulate_motion) { MOTION_LOG(INF, TYPE_ALL, NO_ERRNO, _("Emulating motion")); } return 0; } /** * motion_cleanup * * This routine is called from motion_loop when thread ends to * cleanup all memory etc. that motion_init did. * * Parameters: * * cnt Pointer to the motion context structure * * Returns: nothing */ static void motion_cleanup(struct context *cnt) { event(cnt, EVENT_TIMELAPSEEND, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); if (cnt->event_nr == cnt->prev_event) { /* run only if event active; else, may overwrite last event's data */ event(cnt, EVENT_ENDMOTION, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); cnt->event_nr++; } mot_stream_deinit(cnt); if (cnt->video_dev >= 0) { vid_close(cnt); cnt->video_dev = -1; } free(cnt->imgs.img_motion.image_norm); cnt->imgs.img_motion.image_norm = NULL; free(cnt->imgs.ref); cnt->imgs.ref = NULL; free(cnt->imgs.ref_dyn); cnt->imgs.ref_dyn = NULL; free(cnt->imgs.image_virgin.image_norm); cnt->imgs.image_virgin.image_norm = NULL; free(cnt->imgs.image_vprvcy.image_norm); cnt->imgs.image_vprvcy.image_norm = NULL; free(cnt->imgs.labels); cnt->imgs.labels = NULL; free(cnt->imgs.labelsize); cnt->imgs.labelsize = NULL; free(cnt->imgs.smartmask); cnt->imgs.smartmask = NULL; free(cnt->imgs.smartmask_final); cnt->imgs.smartmask_final = NULL; free(cnt->imgs.smartmask_buffer); cnt->imgs.smartmask_buffer = NULL; if (cnt->imgs.mask) { free(cnt->imgs.mask); cnt->imgs.mask = NULL; } if (cnt->imgs.mask_privacy) { free(cnt->imgs.mask_privacy); cnt->imgs.mask_privacy = NULL; } if (cnt->imgs.mask_privacy_uv) { free(cnt->imgs.mask_privacy_uv); cnt->imgs.mask_privacy_uv = NULL; } if (cnt->imgs.mask_privacy_high) { free(cnt->imgs.mask_privacy_high); cnt->imgs.mask_privacy_high = NULL; } if (cnt->imgs.mask_privacy_high_uv) { free(cnt->imgs.mask_privacy_high_uv); cnt->imgs.mask_privacy_high_uv = NULL; } free(cnt->imgs.common_buffer); cnt->imgs.common_buffer = NULL; free(cnt->imgs.preview_image.image_norm); cnt->imgs.preview_image.image_norm = NULL; if (cnt->imgs.image_virgin.image_high != NULL) { free(cnt->imgs.image_virgin.image_high); cnt->imgs.image_virgin.image_high = NULL; } if (cnt->imgs.preview_image.image_high != NULL) { free(cnt->imgs.preview_image.image_high); cnt->imgs.preview_image.image_high = NULL; } image_ring_destroy(cnt); /* Cleanup the precapture ring buffer */ rotate_deinit(cnt); /* cleanup image rotation data */ if (cnt->pipe != -1) { close(cnt->pipe); cnt->pipe = -1; } if (cnt->mpipe != -1) { close(cnt->mpipe); cnt->mpipe = -1; } if (cnt->rolling_average_data != NULL) { free(cnt->rolling_average_data); cnt->rolling_average_data = NULL; } dbse_deinit(cnt); } static void mlp_mask_privacy(struct context *cnt) { if (cnt->imgs.mask_privacy == NULL) { return; } /* * This function uses long operations to process 4 (32 bit) or 8 (64 bit) * bytes at a time, providing a significant boost in performance. * Then a trailer loop takes care of any remaining bytes. */ unsigned char *image; const unsigned char *mask; const unsigned char *maskuv; int index_y; int index_crcb; int increment; int indx_img; /* Counter for how many images we need to apply the mask to */ int indx_max; /* 1 if we are only doing norm, 2 if we are doing both norm and high */ indx_img = 1; indx_max = 1; if (cnt->imgs.size_high > 0) { indx_max = 2; } increment = sizeof(unsigned long); while (indx_img <= indx_max) { if (indx_img == 1) { /* Normal Resolution */ index_y = cnt->imgs.height * cnt->imgs.width; image = cnt->current_image->image_norm; mask = cnt->imgs.mask_privacy; index_crcb = cnt->imgs.size_norm - index_y; maskuv = cnt->imgs.mask_privacy_uv; } else { /* High Resolution */ index_y = cnt->imgs.height_high * cnt->imgs.width_high; image = cnt->current_image->image_high; mask = cnt->imgs.mask_privacy_high; index_crcb = cnt->imgs.size_high - index_y; maskuv = cnt->imgs.mask_privacy_high_uv; } while (index_y >= increment) { *((unsigned long *)image) &= *((unsigned long *)mask); image += increment; mask += increment; index_y -= increment; } while (--index_y >= 0) { *(image++) &= *(mask++); } /* Mask chrominance. */ while (index_crcb >= increment) { index_crcb -= increment; /* * Replace the masked bytes with 0x080. This is done using two masks: * the normal privacy mask is used to clear the masked bits, the * "or" privacy mask is used to write 0x80. The benefit of that method * is that we process 4 or 8 bytes in just two operations. */ *((unsigned long *)image) &= *((unsigned long *)mask); mask += increment; *((unsigned long *)image) |= *((unsigned long *)maskuv); maskuv += increment; image += increment; } while (--index_crcb >= 0) { if (*(mask++) == 0x00) { *image = 0x80; // Mask last remaining bytes. } image += 1; } indx_img++; } } static void mlp_areadetect(struct context *cnt) { int i, j, z = 0; /* * Simple hack to recognize motion in a specific area * Do we need a new coversion specifier as well?? */ if ((cnt->conf.area_detect) && (cnt->event_nr != cnt->areadetect_eventnbr) && (cnt->current_image->flags & IMAGE_TRIGGER)) { j = strlen(cnt->conf.area_detect); for (i = 0; i < j; i++) { z = cnt->conf.area_detect[i] - 49; /* characters are stored as ascii 48-57 (0-9) */ if ((z >= 0) && (z < 9)) { if (cnt->current_image->location.x > cnt->area_minx[z] && cnt->current_image->location.x < cnt->area_maxx[z] && cnt->current_image->location.y > cnt->area_miny[z] && cnt->current_image->location.y < cnt->area_maxy[z]) { event(cnt, EVENT_AREA_DETECTED, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); cnt->areadetect_eventnbr = cnt->event_nr; /* Fire script only once per event */ MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO ,_("Motion in area %d detected."), z + 1); break; } } } } } static void mlp_prepare(struct context *cnt) { int frame_buffer_size; struct timeval tv1; /***** MOTION LOOP - PREPARE FOR NEW FRAME SECTION *****/ cnt->watchdog = cnt->conf.watchdog_tmo; /* Get current time and preserver last time for frame interval calc. */ /* This may be better at the end of the loop or moving the part in * the end doing elapsed time calc in here */ cnt->timebefore = cnt->timenow; gettimeofday(&tv1, NULL); cnt->timenow = tv1.tv_usec + 1000000L * tv1.tv_sec; /* * Calculate detection rate limit. Above 5fps we limit the detection * rate to 3fps to reduce load at higher framerates. */ cnt->process_thisframe = 0; cnt->rate_limit++; if (cnt->rate_limit >= (cnt->lastrate / 3)) { cnt->rate_limit = 0; cnt->process_thisframe = 1; } /* * Since we don't have sanity checks done when options are set, * this sanity check must go in the main loop :(, before pre_captures * are attempted. */ if (cnt->conf.minimum_motion_frames < 1) { cnt->conf.minimum_motion_frames = 1; } if (cnt->conf.pre_capture < 0) { cnt->conf.pre_capture = 0; } /* * Check if our buffer is still the right size * If pre_capture or minimum_motion_frames has been changed * via the http remote control we need to re-size the ring buffer */ frame_buffer_size = cnt->conf.pre_capture + cnt->conf.minimum_motion_frames; if (cnt->imgs.image_ring_size != frame_buffer_size) { image_ring_resize(cnt, frame_buffer_size); } /* Get time for current frame */ gettimeofday(&cnt->current_tv, NULL); /* * If we have started on a new second we reset the shots variable * lastrate is updated to be the number of the last frame. last rate * is used as the ffmpeg framerate when motion is detected. */ if (cnt->lastframe_tv.tv_sec != cnt->current_tv.tv_sec) { cnt->lastrate = cnt->shots + 1; cnt->shots = -1; cnt->lastframe_tv = cnt->current_tv; if (cnt->conf.minimum_frame_time) { cnt->minimum_frame_time_downcounter--; if (cnt->minimum_frame_time_downcounter == 0) { cnt->get_image = 1; } } else { cnt->get_image = 1; } } /* Increase the shots variable for each frame captured within this second */ cnt->shots++; if (cnt->startup_frames > 0) { cnt->startup_frames--; } } static void mlp_resetimages(struct context *cnt) { struct image_data *old_image; if (cnt->conf.minimum_frame_time) { cnt->minimum_frame_time_downcounter = cnt->conf.minimum_frame_time; cnt->get_image = 0; } /* ring_buffer_in is pointing to current pos, update before put in a new image */ if (++cnt->imgs.image_ring_in >= cnt->imgs.image_ring_size) { cnt->imgs.image_ring_in = 0; } /* Check if we have filled the ring buffer, throw away last image */ if (cnt->imgs.image_ring_in == cnt->imgs.image_ring_out) { if (++cnt->imgs.image_ring_out >= cnt->imgs.image_ring_size) { cnt->imgs.image_ring_out = 0; } } /* cnt->current_image points to position in ring where to store image, diffs etc. */ old_image = cnt->current_image; cnt->current_image = &cnt->imgs.image_ring[cnt->imgs.image_ring_in]; /* Init/clear current_image */ if (cnt->process_thisframe) { /* set diffs to 0 now, will be written after we calculated diffs in new image */ cnt->current_image->diffs = 0; /* Set flags to 0 */ cnt->current_image->flags = 0; cnt->current_image->cent_dist = 0; /* Clear location data */ memset(&cnt->current_image->location, 0, sizeof(cnt->current_image->location)); cnt->current_image->total_labels = 0; } else if (cnt->current_image && old_image) { /* not processing this frame: save some important values for next image */ cnt->current_image->diffs = old_image->diffs; cnt->current_image->timestamp_tv = old_image->timestamp_tv; cnt->current_image->shot = old_image->shot; cnt->current_image->cent_dist = old_image->cent_dist; cnt->current_image->flags = old_image->flags & (~IMAGE_SAVED); cnt->current_image->location = old_image->location; cnt->current_image->total_labels = old_image->total_labels; } /* Store time with pre_captured image */ cnt->current_image->timestamp_tv = cnt->current_tv; /* Store shot number with pre_captured image */ cnt->current_image->shot = cnt->shots; } static int mlp_retry(struct context *cnt) { int size_high, height, width; if (cnt->video_dev < 0 && cnt->current_tv.tv_sec % 10 == 0 && cnt->shots == 0) { MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("Retrying until successful connection with camera")); width = cnt->imgs.width; height = cnt->imgs.height; cnt->video_dev = vid_start(cnt); if (cnt->video_dev < 0) { return 0; } MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Camera has become available.")); if ((cnt->imgs.width % 8) || (cnt->imgs.height % 8)) { MOTION_LOG(CRT, TYPE_ALL, NO_ERRNO , _("Restarting Motion.\n" "Image width (%d) or height(%d) requested is not modulo 8.") ,cnt->imgs.width, cnt->imgs.height); return 1; } if ((cnt->imgs.width < 64) || (cnt->imgs.height < 64)) { MOTION_LOG(CRT, TYPE_ALL, NO_ERRNO , _("Restarting Motion.\n" "Motion only supports width and height greater than or equal to 64 %dx%d") ,cnt->imgs.width, cnt->imgs.height); return 1; } if (cnt->imgs.width != width || cnt->imgs.height != height) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO , _("Restarting Motion.\n" "Height or width has changed on camera.")); return 1; } /* * For high res, we check the size of buffer to determine whether to break out * the init_motion function allocated the buffer for high using the cnt->imgs.size_high * and the vid_start ONLY re-populates the height/width so we can check the size here. */ size_high = (cnt->imgs.width_high * cnt->imgs.height_high * 3) / 2; if (cnt->imgs.size_high != size_high) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO , _("Restarting Motion.\n" "High resolution has changed on camera.")); return 1; } } return 0; } static int mlp_capture(struct context *cnt) { const char *tmpin; char tmpout[80]; int vid_return_code = 0; /* Return code used when calling vid_next */ struct timeval tv1; /***** MOTION LOOP - IMAGE CAPTURE SECTION *****/ /* * Fetch next frame from camera * If vid_next returns 0 all is well and we got a new picture * Any non zero value is an error. * 0 = OK, valid picture * <0 = fatal error - leave the thread by breaking out of the main loop * >0 = non fatal error - copy last image or show grey image with message */ if (cnt->video_dev >= 0) { vid_return_code = vid_next(cnt, cnt->current_image); } else { vid_return_code = 1; /* Non fatal error */ } // VALID PICTURE if (vid_return_code == 0) { cnt->lost_connection = 0; cnt->lostconnection_tv.tv_sec = 0; cnt->lostconnection_tv.tv_usec = 0; /* If all is well reset missing_frame_counter */ if (cnt->missing_frame_counter >= MISSING_FRAMES_TIMEOUT * cnt->conf.framerate) { /* If we previously logged starting a grey image, now log video re-start */ MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Video signal re-acquired")); // event for re-acquired video signal can be called here event(cnt, EVENT_CAMERA_FOUND, NULL, NULL, NULL, NULL); } cnt->missing_frame_counter = 0; /* * Save the newly captured still virgin image to a buffer * which we will not alter with text and location graphics */ memcpy(cnt->imgs.image_virgin.image_norm, cnt->current_image->image_norm, cnt->imgs.size_norm); mlp_mask_privacy(cnt); memcpy(cnt->imgs.image_vprvcy.image_norm, cnt->current_image->image_norm, cnt->imgs.size_norm); /* * If the camera is a netcam we let the camera decide the pace. * Otherwise we will keep on adding duplicate frames. * By resetting the timer the framerate becomes maximum the rate * of the Netcam. */ if (cnt->conf.netcam_url) { gettimeofday(&tv1, NULL); cnt->timenow = tv1.tv_usec + 1000000L * tv1.tv_sec; } // FATAL ERROR - leave the thread by breaking out of the main loop } else if (vid_return_code < 0) { /* Fatal error - Close video device */ MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Video device fatal error - Closing video device")); vid_close(cnt); /* * Use virgin image, if we are not able to open it again next loop * a gray image with message is applied * flag lost_connection */ memcpy(cnt->current_image->image_norm, cnt->imgs.image_virgin.image_norm, cnt->imgs.size_norm); cnt->lost_connection = 1; /* NO FATAL ERROR - * copy last image or show grey image with message * flag on lost_connection if : * vid_return_code == NETCAM_RESTART_ERROR * cnt->video_dev < 0 * cnt->missing_frame_counter > (MISSING_FRAMES_TIMEOUT * cnt->conf.framerate) */ } else { //MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, "vid_return_code %d",vid_return_code); /* * Netcams that change dimensions while Motion is running will * require that Motion restarts to reinitialize all the many * buffers inside Motion. It will be a mess to try and recover any * other way */ if (vid_return_code == NETCAM_RESTART_ERROR) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Restarting Motion thread to reinitialize all " "image buffers")); /* * Break out of main loop terminating thread * watchdog will start us again * Set lost_connection flag on */ cnt->lost_connection = 1; return 1; } /* * First missed frame - store timestamp * Don't reset time when thread restarts */ if (cnt->lostconnection_tv.tv_sec == 0) { cnt->lostconnection_tv = cnt->current_tv; } /* * Increase missing_frame_counter * The first MISSING_FRAMES_TIMEOUT seconds we copy previous virgin image * After MISSING_FRAMES_TIMEOUT seconds we put a grey error image in the buffer * If we still have not yet received the initial image from a camera * we go straight for the grey error image. */ ++cnt->missing_frame_counter; if (cnt->video_dev >= 0 && cnt->missing_frame_counter < (MISSING_FRAMES_TIMEOUT * cnt->conf.framerate)) { memcpy(cnt->current_image->image_norm, cnt->imgs.image_vprvcy.image_norm, cnt->imgs.size_norm); } else { cnt->lost_connection = 1; if (cnt->video_dev >= 0) { tmpin = "CONNECTION TO CAMERA LOST\\nSINCE %Y-%m-%d %T"; } else { tmpin = "UNABLE TO OPEN VIDEO DEVICE\\nSINCE %Y-%m-%d %T"; } memset(cnt->current_image->image_norm, 0x80, cnt->imgs.size_norm); mystrftime(cnt, tmpout, sizeof(tmpout), tmpin , &cnt->lostconnection_tv, NULL, 0); draw_text(cnt->current_image->image_norm, cnt->imgs.width, cnt->imgs.height, 10, 20 * cnt->text_scale, tmpout, cnt->text_scale); /* Write error message only once */ if (cnt->missing_frame_counter == MISSING_FRAMES_TIMEOUT * cnt->conf.framerate) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Video signal lost - Adding grey image")); // Event for lost video signal can be called from here event(cnt, EVENT_CAMERA_LOST, NULL, NULL, NULL , &cnt->lostconnection_tv); } /* * If we don't get a valid frame for a long time, try to close/reopen device * Only try this when a device is open */ if ((cnt->video_dev > 0) && (cnt->missing_frame_counter == (MISSING_FRAMES_TIMEOUT * 4) * cnt->conf.framerate)) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Video signal still lost - " "Trying to close video device")); vid_close(cnt); } } } return 0; } static void mlp_detection(struct context *cnt) { /***** MOTION LOOP - MOTION DETECTION SECTION *****/ /* * The actual motion detection takes place in the following * diffs is the number of pixels detected as changed * Make a differences picture in image_out * * alg_diff_standard is the slower full feature motion detection algorithm * alg_diff first calls a fast detection algorithm which only looks at a * fraction of the pixels. If this detects possible motion alg_diff_standard * is called. */ if (cnt->process_thisframe) { if (cnt->threshold && !cnt->pause) { /* * If we've already detected motion and we want to see if there's * still motion, don't bother trying the fast one first. IF there's * motion, the alg_diff will trigger alg_diff_standard * anyway */ if (cnt->detecting_motion || cnt->conf.setup_mode) { cnt->current_image->diffs = alg_diff_standard(cnt, cnt->imgs.image_vprvcy.image_norm); } else { cnt->current_image->diffs = alg_diff(cnt, cnt->imgs.image_vprvcy.image_norm); } /* Lightswitch feature - has light intensity changed? * This can happen due to change of light conditions or due to a sudden change of the camera * sensitivity. If alg_lightswitch detects lightswitch we suspend motion detection the next * 'lightswitch_frames' frames to allow the camera to settle. * Don't check if we have lost connection, we detect "Lost signal" frame as lightswitch */ if (cnt->conf.lightswitch_percent >= 1 && !cnt->lost_connection) { if (alg_lightswitch(cnt, cnt->current_image->diffs)) { MOTION_LOG(INF, TYPE_ALL, NO_ERRNO, _("Lightswitch detected")); if (cnt->conf.lightswitch_frames < 1) { cnt->conf.lightswitch_frames = 1; } else if (cnt->conf.lightswitch_frames > 1000) { cnt->conf.lightswitch_frames = 1000; } if (cnt->moved < (unsigned int)cnt->conf.lightswitch_frames) { cnt->moved = (unsigned int)cnt->conf.lightswitch_frames; } cnt->current_image->diffs = 0; alg_update_reference_frame(cnt, RESET_REF_FRAME); } } /* * Switchfilter feature tries to detect a change in the video signal * from one camera to the next. This is normally used in the Round * Robin feature. The algorithm is not very safe. * The algorithm takes a little time so we only call it when needed * ie. when feature is enabled and diffs>threshold. * We do not suspend motion detection like we did for lightswitch * because with Round Robin this is controlled by roundrobin_skip. */ if (cnt->conf.roundrobin_switchfilter && cnt->current_image->diffs > cnt->threshold) { cnt->current_image->diffs = alg_switchfilter(cnt, cnt->current_image->diffs, cnt->current_image->image_norm); if ((cnt->current_image->diffs <= cnt->threshold) || (cnt->current_image->diffs > cnt->threshold_maximum)) { cnt->current_image->diffs = 0; MOTION_LOG(INF, TYPE_ALL, NO_ERRNO, _("Switchfilter detected")); } } /* * Despeckle feature * First we run (as given by the despeckle_filter option iterations * of erode and dilate algorithms. * Finally we run the labelling feature. * All this is done in the alg_despeckle code. */ cnt->current_image->total_labels = 0; cnt->imgs.largest_label = 0; cnt->olddiffs = 0; if (cnt->conf.despeckle_filter && cnt->current_image->diffs > 0) { cnt->olddiffs = cnt->current_image->diffs; cnt->current_image->diffs = alg_despeckle(cnt, cnt->olddiffs); } else if (cnt->imgs.labelsize_max) { cnt->imgs.labelsize_max = 0; /* Disable labeling if enabled */ } } else if (!cnt->conf.setup_mode) { cnt->current_image->diffs = 0; } } //TODO: This section needs investigation for purpose, cause and effect /* Manipulate smart_mask sensitivity (only every smartmask_ratio seconds) */ if ((cnt->smartmask_speed && (cnt->event_nr != cnt->prev_event)) && (!--cnt->smartmask_count)) { alg_tune_smartmask(cnt); cnt->smartmask_count = cnt->smartmask_ratio; } /* * cnt->moved is set by the tracking code when camera has been asked to move. * When camera is moving we do not want motion to detect motion or we will * get our camera chasing itself like crazy and we will get motion detected * which is not really motion. So we pretend there is no motion by setting * cnt->diffs = 0. * We also pretend to have a moving camera when we start Motion and when light * switch has been detected to allow camera to settle. */ if (cnt->moved) { cnt->moved--; cnt->current_image->diffs = 0; } } static void mlp_tuning(struct context *cnt) { /***** MOTION LOOP - TUNING SECTION *****/ /* * If noise tuning was selected, do it now. but only when * no frames have been recorded and only once per second */ if ((cnt->conf.noise_tune && cnt->shots == 0) && (!cnt->detecting_motion && (cnt->current_image->diffs <= cnt->threshold))) { alg_noise_tune(cnt, cnt->imgs.image_vprvcy.image_norm); } /* * If we are not noise tuning lets make sure that remote controlled * changes of noise_level are used. */ if (cnt->process_thisframe) { /* * threshold tuning if enabled * if we are not threshold tuning lets make sure that remote controlled * changes of threshold are used. */ if (cnt->conf.threshold_tune) { alg_threshold_tune(cnt, cnt->current_image->diffs, cnt->detecting_motion); } /* * If motion is detected (cnt->current_image->diffs > cnt->threshold) and before we add text to the pictures * we find the center and size coordinates of the motion to be used for text overlays and later * for adding the locate rectangle */ if ((cnt->current_image->diffs > cnt->threshold) && (cnt->current_image->diffs < cnt->threshold_maximum)) { alg_locate_center_size(&cnt->imgs , cnt->imgs.width , cnt->imgs.height , &cnt->current_image->location); } /* * Update reference frame. * micro-lighswitch: trying to auto-detect lightswitch events. * frontdoor illumination. Updates are rate-limited to 3 per second at * framerates above 5fps to save CPU resources and to keep sensitivity * at a constant level. */ if ((cnt->current_image->diffs > cnt->threshold) && (cnt->current_image->diffs < cnt->threshold_maximum) && (cnt->conf.lightswitch_percent >= 1) && (cnt->lightswitch_framecounter < (cnt->lastrate * 2)) && /* two seconds window only */ /* number of changed pixels almost the same in two consecutive frames and */ ((abs(cnt->previous_diffs - cnt->current_image->diffs)) < (cnt->previous_diffs / 15)) && /* center of motion in about the same place ? */ ((abs(cnt->current_image->location.x - cnt->previous_location_x)) <= (cnt->imgs.width / 150)) && ((abs(cnt->current_image->location.y - cnt->previous_location_y)) <= (cnt->imgs.height / 150))) { alg_update_reference_frame(cnt, RESET_REF_FRAME); cnt->current_image->diffs = 0; cnt->lightswitch_framecounter = 0; MOTION_LOG(INF, TYPE_ALL, NO_ERRNO, _("micro-lightswitch!")); } else { alg_update_reference_frame(cnt, UPDATE_REF_FRAME); } cnt->previous_diffs = cnt->current_image->diffs; cnt->previous_location_x = cnt->current_image->location.x; cnt->previous_location_y = cnt->current_image->location.y; } } static void mlp_overlay(struct context *cnt) { char tmp[PATH_MAX]; /***** MOTION LOOP - TEXT AND GRAPHICS OVERLAY SECTION *****/ /* * Some overlays on top of the motion image * Note that these now modifies the cnt->imgs.out so this buffer * can no longer be used for motion detection features until next * picture frame is captured. */ /* Smartmask overlay */ if (cnt->smartmask_speed && (cnt->conf.picture_output_motion || cnt->conf.movie_output_motion || cnt->conf.setup_mode || (cnt->stream_motion.cnct_count > 0))) { overlay_smartmask(cnt, cnt->imgs.img_motion.image_norm); } /* Largest labels overlay */ if (cnt->imgs.largest_label && (cnt->conf.picture_output_motion || cnt->conf.movie_output_motion || cnt->conf.setup_mode || (cnt->stream_motion.cnct_count > 0))) { overlay_largest_label(cnt, cnt->imgs.img_motion.image_norm); } /* Fixed mask overlay */ if (cnt->imgs.mask && (cnt->conf.picture_output_motion || cnt->conf.movie_output_motion || cnt->conf.setup_mode || (cnt->stream_motion.cnct_count > 0))) { overlay_fixed_mask(cnt, cnt->imgs.img_motion.image_norm); } /* Add changed pixels in upper right corner of the pictures */ if (cnt->conf.text_changes) { if (!cnt->pause) { sprintf(tmp, "%d", cnt->current_image->diffs); } else { sprintf(tmp, "-"); } draw_text(cnt->current_image->image_norm, cnt->imgs.width, cnt->imgs.height, cnt->imgs.width - 10, 10, tmp, cnt->text_scale); } /* * Add changed pixels to motion-images (for stream) in setup_mode * and always overlay smartmask (not only when motion is detected) */ if (cnt->conf.setup_mode || (cnt->stream_motion.cnct_count > 0)) { sprintf(tmp, "D:%5d L:%3d N:%3d", cnt->current_image->diffs, cnt->current_image->total_labels, cnt->noise); draw_text(cnt->imgs.img_motion.image_norm, cnt->imgs.width, cnt->imgs.height, cnt->imgs.width - 10, cnt->imgs.height - (30 * cnt->text_scale), tmp, cnt->text_scale); sprintf(tmp, "THREAD %d SETUP", cnt->threadnr); draw_text(cnt->imgs.img_motion.image_norm, cnt->imgs.width, cnt->imgs.height, cnt->imgs.width - 10, cnt->imgs.height - (10 * cnt->text_scale), tmp, cnt->text_scale); } /* Add text in lower left corner of the pictures */ if (cnt->conf.text_left) { mystrftime(cnt, tmp, sizeof(tmp), cnt->conf.text_left, &cnt->current_image->timestamp_tv, NULL, 0); draw_text(cnt->current_image->image_norm, cnt->imgs.width, cnt->imgs.height, 10, cnt->imgs.height - (10 * cnt->text_scale), tmp, cnt->text_scale); } /* Add text in lower right corner of the pictures */ if (cnt->conf.text_right) { mystrftime(cnt, tmp, sizeof(tmp), cnt->conf.text_right, &cnt->current_image->timestamp_tv, NULL, 0); draw_text(cnt->current_image->image_norm, cnt->imgs.width, cnt->imgs.height, cnt->imgs.width - 10, cnt->imgs.height - (10 * cnt->text_scale), tmp, cnt->text_scale); } } static void mlp_actions(struct context *cnt) { int indx; /***** MOTION LOOP - ACTIONS AND EVENT CONTROL SECTION *****/ if ((cnt->current_image->diffs > cnt->threshold) && (cnt->current_image->diffs < cnt->threshold_maximum)) { /* flag this image, it have motion */ cnt->current_image->flags |= IMAGE_MOTION; cnt->lightswitch_framecounter++; /* micro lightswitch */ } else { cnt->lightswitch_framecounter = 0; } /* * If motion has been detected we take action and start saving * pictures and movies etc by calling motion_detected(). * Is emulate_motion enabled we always call motion_detected() * If post_capture is enabled we also take care of this in the this * code section. */ if ((cnt->conf.emulate_motion || cnt->event_user) && (cnt->startup_frames == 0)) { /* If we were previously detecting motion, started a movie, then got * no motion then we reset the start movie time so that we do not * get a pause in the movie. */ if ( (cnt->detecting_motion == 0) && (cnt->ffmpeg_output != NULL) ) { ffmpeg_reset_movie_start_time(cnt->ffmpeg_output, &cnt->current_image->timestamp_tv); } cnt->detecting_motion = 1; if (cnt->conf.post_capture > 0) { /* Setup the postcap counter */ cnt->postcap = cnt->conf.post_capture; // MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, "(Em) Init post capture %d", cnt->postcap); } cnt->current_image->flags |= (IMAGE_TRIGGER | IMAGE_SAVE); /* Mark all images in image_ring to be saved */ for (indx = 0; indx < cnt->imgs.image_ring_size; indx++) { cnt->imgs.image_ring[indx].flags |= IMAGE_SAVE; } motion_detected(cnt, cnt->video_dev, cnt->current_image); } else if ((cnt->current_image->flags & IMAGE_MOTION) && (cnt->startup_frames == 0)) { /* * Did we detect motion (like the cat just walked in :) )? * If so, ensure the motion is sustained if minimum_motion_frames */ /* Count how many frames with motion there is in the last minimum_motion_frames in precap buffer */ int frame_count = 0; int pos = cnt->imgs.image_ring_in; for (indx = 0; indx < cnt->conf.minimum_motion_frames; indx++) { if (cnt->imgs.image_ring[pos].flags & IMAGE_MOTION) { frame_count++; } if (pos == 0) { pos = cnt->imgs.image_ring_size-1; } else { pos--; } } if (frame_count >= cnt->conf.minimum_motion_frames) { cnt->current_image->flags |= (IMAGE_TRIGGER | IMAGE_SAVE); /* If we were previously detecting motion, started a movie, then got * no motion then we reset the start movie time so that we do not * get a pause in the movie. */ if ( (cnt->detecting_motion == 0) && (cnt->ffmpeg_output != NULL) ) { ffmpeg_reset_movie_start_time(cnt->ffmpeg_output, &cnt->current_image->timestamp_tv); } cnt->detecting_motion = 1; /* Setup the postcap counter */ cnt->postcap = cnt->conf.post_capture; //MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, "Setup post capture %d", cnt->postcap); /* Mark all images in image_ring to be saved */ for (indx = 0; indx < cnt->imgs.image_ring_size; indx++) { cnt->imgs.image_ring[indx].flags |= IMAGE_SAVE; } } else if (cnt->postcap > 0) { /* we have motion in this frame, but not enought frames for trigger. Check postcap */ cnt->current_image->flags |= (IMAGE_POSTCAP | IMAGE_SAVE); cnt->postcap--; //MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, "post capture %d", cnt->postcap); } else { cnt->current_image->flags |= IMAGE_PRECAP; } /* Always call motion_detected when we have a motion image */ motion_detected(cnt, cnt->video_dev, cnt->current_image); } else if (cnt->postcap > 0) { /* No motion, doing postcap */ cnt->current_image->flags |= (IMAGE_POSTCAP | IMAGE_SAVE); cnt->postcap--; //MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, "post capture %d", cnt->postcap); } else { /* Done with postcap, so just have the image in the precap buffer */ cnt->current_image->flags |= IMAGE_PRECAP; /* gapless movie feature */ if ((cnt->conf.event_gap == 0) && (cnt->detecting_motion == 1)) { cnt->event_stop = TRUE; } cnt->detecting_motion = 0; } /* Update last frame saved time, so we can end event after gap time */ if (cnt->current_image->flags & IMAGE_SAVE) { cnt->last_tv = cnt->current_image->timestamp_tv; } mlp_areadetect(cnt); process_image_ring(cnt); /* Check event gap */ if ((cnt->conf.event_gap > 0) && ((cnt->current_tv.tv_sec - cnt->last_tv.tv_sec) >= cnt->conf.event_gap )) { cnt->event_stop = TRUE; } /* Note that event_stop can be set elsewhere in code as well */ if ( cnt->event_stop ) { if (cnt->event_nr == cnt->prev_event) { /* When prev_event = event_nr, there is currently * an event occurring so trigger ending events */ /* Save preview_shot here at the end of event */ if (cnt->imgs.preview_image.diffs) { /* Do not save if it was saved at start */ if (!(cnt->new_img & NEWIMG_FIRST)) { event(cnt, EVENT_IMAGE_PREVIEW, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); } cnt->imgs.preview_image.diffs = 0; } event(cnt, EVENT_ENDMOTION, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); if (cnt->track.type) { cnt->moved = track_center(cnt, cnt->video_dev, 0, 0, 0); } MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("End of event %d"), cnt->event_nr); /* Reset vars for next event and increment to next event number */ cnt->postcap = 0; cnt->lightswitch_framecounter = 0; cnt->text_event_string[0] = '\0'; cnt->event_nr++; } cnt->event_stop = FALSE; cnt->event_user = FALSE; } /* Check for movie length. If we are in post capture processing, then * we just let the current movie finish with that. Otherwise we close * and set up for the next movie file */ if ((cnt->conf.movie_max_time > 0) && (cnt->event_nr == cnt->prev_event) && (cnt->current_image->timestamp_tv.tv_sec - cnt->movie_tv.tv_sec >= cnt->conf.movie_max_time) && ( !(cnt->current_image->flags & IMAGE_POSTCAP)) && ( !(cnt->current_image->flags & IMAGE_PRECAP))) { event(cnt, EVENT_MOVIE_END, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); event(cnt, EVENT_MOVIE_START, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); } } static void mlp_setupmode(struct context *cnt) { /***** MOTION LOOP - SETUP MODE CONSOLE OUTPUT SECTION *****/ /* If CAMERA_VERBOSE enabled output some numbers to console */ if (cnt->conf.setup_mode) { char msg[1024] = "\0"; char part[100]; if (cnt->conf.despeckle_filter) { snprintf(part, 99, _("Raw changes: %5d - changes after '%s': %5d"), cnt->olddiffs, cnt->conf.despeckle_filter, cnt->current_image->diffs); strcat(msg, part); if (strchr(cnt->conf.despeckle_filter, 'l')) { snprintf(part, 99,_(" - labels: %3d"), cnt->current_image->total_labels); strcat(msg, part); } } else { snprintf(part, 99,_("Changes: %5d"), cnt->current_image->diffs); strcat(msg, part); } if (cnt->conf.noise_tune) { snprintf(part, 99,_(" - noise level: %2d"), cnt->noise); strcat(msg, part); } if (cnt->conf.threshold_tune) { snprintf(part, 99, _(" - threshold: %d"), cnt->threshold); strcat(msg, part); } MOTION_LOG(INF, TYPE_ALL, NO_ERRNO, "%s", msg); } } static void mlp_snapshot(struct context *cnt) { /***** MOTION LOOP - SNAPSHOT FEATURE SECTION *****/ /* * Did we get triggered to make a snapshot from control http? Then shoot a snap * If snapshot_interval is not zero and time since epoch MOD snapshot_interval = 0 then snap * We actually allow the time to run over the interval in case we have a delay * from slow camera. * Note: Negative value means SIGALRM snaps are enabled * httpd-control snaps are always enabled. */ /* time_current_frame is used both for snapshot and timelapse features */ cnt->time_current_frame = cnt->current_tv.tv_sec; if ((cnt->conf.snapshot_interval > 0 && cnt->shots == 0 && cnt->time_current_frame % cnt->conf.snapshot_interval <= cnt->time_last_frame % cnt->conf.snapshot_interval) || cnt->snapshot) { event(cnt, EVENT_IMAGE_SNAPSHOT, cnt->current_image, NULL, NULL, &cnt->current_image->timestamp_tv); cnt->snapshot = 0; } } static void mlp_timelapse(struct context *cnt) { struct tm timestamp_tm; if (cnt->conf.timelapse_interval) { localtime_r(&cnt->current_image->timestamp_tv.tv_sec, ×tamp_tm); /* * Check to see if we should start a new timelapse file. We start one when * we are on the first shot, and and the seconds are zero. We must use the seconds * to prevent the timelapse file from getting reset multiple times during the minute. */ if (timestamp_tm.tm_min == 0 && (cnt->time_current_frame % 60 < cnt->time_last_frame % 60) && cnt->shots == 0) { if (mystrceq(cnt->conf.timelapse_mode, "manual")) { ;/* No action */ /* If we are daily, raise timelapseend event at midnight */ } else if (mystrceq(cnt->conf.timelapse_mode, "daily")) { if (timestamp_tm.tm_hour == 0) { event(cnt, EVENT_TIMELAPSEEND, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); } /* handle the hourly case */ } else if (mystrceq(cnt->conf.timelapse_mode, "hourly")) { event(cnt, EVENT_TIMELAPSEEND, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); /* If we are weekly-sunday, raise timelapseend event at midnight on sunday */ } else if (mystrceq(cnt->conf.timelapse_mode, "weekly-sunday")) { if (timestamp_tm.tm_wday == 0 && timestamp_tm.tm_hour == 0) { event(cnt, EVENT_TIMELAPSEEND, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); } /* If we are weekly-monday, raise timelapseend event at midnight on monday */ } else if (mystrceq(cnt->conf.timelapse_mode, "weekly-monday")) { if (timestamp_tm.tm_wday == 1 && timestamp_tm.tm_hour == 0) { event(cnt, EVENT_TIMELAPSEEND, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); } /* If we are monthly, raise timelapseend event at midnight on first day of month */ } else if (mystrceq(cnt->conf.timelapse_mode, "monthly")) { if (timestamp_tm.tm_mday == 1 && timestamp_tm.tm_hour == 0) { event(cnt, EVENT_TIMELAPSEEND, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); } /* If invalid we report in syslog once and continue in manual mode */ } else { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Invalid timelapse_mode argument '%s'"), cnt->conf.timelapse_mode); MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("%:s Defaulting to manual timelapse mode")); conf_cmdparse(&cnt, (char *)"ffmpeg_timelapse_mode",(char *)"manual"); } } /* * If ffmpeg timelapse is enabled and time since epoch MOD ffmpeg_timelaps = 0 * add a timelapse frame to the timelapse movie. */ if (cnt->shots == 0 && cnt->time_current_frame % cnt->conf.timelapse_interval <= cnt->time_last_frame % cnt->conf.timelapse_interval) { event(cnt, EVENT_TIMELAPSE, cnt->current_image, NULL, NULL, &cnt->current_image->timestamp_tv); } } else if (cnt->ffmpeg_timelapse) { /* * If timelapse movie is in progress but conf.timelapse_interval is zero then close timelapse file * This is an important feature that allows manual roll-over of timelapse file using the http * remote control via a cron job. */ event(cnt, EVENT_TIMELAPSEEND, NULL, NULL, NULL, &cnt->current_image->timestamp_tv); } cnt->time_last_frame = cnt->time_current_frame; } static void mlp_loopback(struct context *cnt) { /* * Feed last image and motion image to video device pipes and the stream clients * In setup mode we send the special setup mode image to both stream and vloopback pipe * In normal mode we feed the latest image to vloopback device and we send * the image to the stream. We always send the first image in a second to the stream. * Other image are sent only when the config option stream_motion is off * The result is that with stream_motion on the stream stream is normally at the minimal * 1 frame per second but the minute motion is detected the motion_detected() function * sends all detected pictures to the stream except the 1st per second which is already sent. */ if (cnt->conf.setup_mode) { event(cnt, EVENT_IMAGE, &cnt->imgs.img_motion, NULL, &cnt->pipe, &cnt->current_image->timestamp_tv); event(cnt, EVENT_STREAM, &cnt->imgs.img_motion, NULL, NULL, &cnt->current_image->timestamp_tv); } else { event(cnt, EVENT_IMAGE, cnt->current_image, NULL, &cnt->pipe, &cnt->current_image->timestamp_tv); if (!cnt->conf.stream_motion || cnt->shots == 1) { event(cnt, EVENT_STREAM, cnt->current_image, NULL, NULL, &cnt->current_image->timestamp_tv); } } event(cnt, EVENT_IMAGEM, &cnt->imgs.img_motion, NULL, &cnt->mpipe, &cnt->current_image->timestamp_tv); } static void mlp_parmsupdate(struct context *cnt) { /***** MOTION LOOP - ONCE PER SECOND PARAMETER UPDATE SECTION *****/ /* Check for some config parameter changes but only every second */ if (cnt->shots != 0) { return; } init_text_scale(cnt); /* Initialize and validate text_scale */ if (mystrceq(cnt->conf.picture_output, "on")) { cnt->new_img = NEWIMG_ON; } else if (mystrceq(cnt->conf.picture_output, "first")) { cnt->new_img = NEWIMG_FIRST; } else if (mystrceq(cnt->conf.picture_output, "best")) { cnt->new_img = NEWIMG_BEST; } else if (mystrceq(cnt->conf.picture_output, "center")) { cnt->new_img = NEWIMG_CENTER; } else { cnt->new_img = NEWIMG_OFF; } if (mystrceq(cnt->conf.locate_motion_mode, "on")) { cnt->locate_motion_mode = LOCATE_ON; } else if (mystrceq(cnt->conf.locate_motion_mode, "preview")) { cnt->locate_motion_mode = LOCATE_PREVIEW; } else { cnt->locate_motion_mode = LOCATE_OFF; } if (mystrceq(cnt->conf.locate_motion_style, "box")) { cnt->locate_motion_style = LOCATE_BOX; } else if (mystrceq(cnt->conf.locate_motion_style, "redbox")) { cnt->locate_motion_style = LOCATE_REDBOX; } else if (mystrceq(cnt->conf.locate_motion_style, "cross")) { cnt->locate_motion_style = LOCATE_CROSS; } else if (mystrceq(cnt->conf.locate_motion_style, "redcross")) { cnt->locate_motion_style = LOCATE_REDCROSS; } else { cnt->locate_motion_style = LOCATE_BOX; } /* Sanity check for smart_mask_speed, silly value disables smart mask */ if (cnt->conf.smart_mask_speed < 0 || cnt->conf.smart_mask_speed > 10) { cnt->conf.smart_mask_speed = 0; } /* Has someone changed smart_mask_speed or framerate? */ if (cnt->conf.smart_mask_speed != cnt->smartmask_speed || cnt->smartmask_lastrate != cnt->lastrate) { if (cnt->conf.smart_mask_speed == 0) { memset(cnt->imgs.smartmask, 0, cnt->imgs.motionsize); memset(cnt->imgs.smartmask_final, 255, cnt->imgs.motionsize); } cnt->smartmask_lastrate = cnt->lastrate; cnt->smartmask_speed = cnt->conf.smart_mask_speed; /* * Decay delay - based on smart_mask_speed (framerate independent) * This is always 5*smartmask_speed seconds */ cnt->smartmask_ratio = 5 * cnt->lastrate * (11 - cnt->smartmask_speed); } dbse_sqlmask_update(cnt); } static void mlp_frametiming(struct context *cnt) { int indx; struct timeval tv2; unsigned long int elapsedtime; //TODO: Need to evaluate logic for needing this. long int delay_time_nsec; /***** MOTION LOOP - FRAMERATE TIMING AND SLEEPING SECTION *****/ /* * Work out expected frame rate based on config setting which may * have changed from http-control */ if (cnt->conf.framerate) { cnt->required_frame_time = 1000000L / cnt->conf.framerate; } else { cnt->required_frame_time = 0; } /* Get latest time to calculate time taken to process video data */ gettimeofday(&tv2, NULL); elapsedtime = (tv2.tv_usec + 1000000L * tv2.tv_sec) - cnt->timenow; /* * Update history buffer but ignore first pass as timebefore * variable will be inaccurate */ if (cnt->passflag) { cnt->rolling_average_data[cnt->rolling_frame] = cnt->timenow - cnt->timebefore; } else { cnt->passflag = 1; } cnt->rolling_frame++; if (cnt->rolling_frame >= cnt->rolling_average_limit) { cnt->rolling_frame = 0; } /* Calculate 10 second average and use deviation in delay calculation */ cnt->rolling_average = 0L; for (indx = 0; indx < cnt->rolling_average_limit; indx++) { cnt->rolling_average += cnt->rolling_average_data[indx]; } cnt->rolling_average /= cnt->rolling_average_limit; cnt->frame_delay = cnt->required_frame_time - elapsedtime - (cnt->rolling_average - cnt->required_frame_time); if (cnt->frame_delay > 0) { /* Apply delay to meet frame time */ if (cnt->frame_delay > cnt->required_frame_time) { cnt->frame_delay = cnt->required_frame_time; } /* Delay time in nanoseconds for SLEEP */ delay_time_nsec = cnt->frame_delay * 1000; if (delay_time_nsec > 999999999) { delay_time_nsec = 999999999; } /* SLEEP as defined in motion.h A safe sleep using nanosleep */ SLEEP(0, delay_time_nsec); } } /** * motion_loop * * Thread function for the motion handling threads. * */ static void *motion_loop(void *arg) { struct context *cnt = arg; if (motion_init(cnt) == 0) { while (!cnt->finish || cnt->event_stop) { mlp_prepare(cnt); if (cnt->get_image) { mlp_resetimages(cnt); if (mlp_retry(cnt) == 1) { break; } if (mlp_capture(cnt) == 1) { break; } mlp_detection(cnt); mlp_tuning(cnt); mlp_overlay(cnt); mlp_actions(cnt); mlp_setupmode(cnt); } mlp_snapshot(cnt); mlp_timelapse(cnt); mlp_loopback(cnt); mlp_parmsupdate(cnt); mlp_frametiming(cnt); } } cnt->lost_connection = 1; MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Thread exiting")); motion_cleanup(cnt); pthread_mutex_lock(&global_lock); threads_running--; pthread_mutex_unlock(&global_lock); cnt->running = 0; cnt->finish = 0; pthread_exit(NULL); } /** * become_daemon * * Turns Motion into a daemon through forking. The parent process (i.e. the * one initially calling this function) will exit inside this function, while * control will be returned to the child process. Standard input/output are * released properly, and the current directory is set to / in order to not * lock up any file system. * * Parameters: * * cnt - current thread's context struct * * Returns: nothing */ static void become_daemon(void) { int i; struct sigaction sig_ign_action; /* Setup sig_ign_action */ #ifdef SA_RESTART sig_ign_action.sa_flags = SA_RESTART; #else sig_ign_action.sa_flags = 0; #endif sig_ign_action.sa_handler = SIG_IGN; sigemptyset(&sig_ign_action.sa_mask); /* fork */ if (fork()) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Motion going to daemon mode")); exit(0); } /* * Changing dir to root enables people to unmount a disk * without having to stop Motion */ if (chdir("/")) { MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO, _("Could not change directory")); } #if (defined(BSD) && !defined(__APPLE__)) setpgrp(0, getpid()); #else setpgrp(); #endif if ((i = open("/dev/tty", O_RDWR|O_CLOEXEC)) >= 0) { ioctl(i, TIOCNOTTY, NULL); close(i); } setsid(); i = open("/dev/null", O_RDONLY|O_CLOEXEC); if (i != -1) { dup2(i, STDIN_FILENO); close(i); } i = open("/dev/null", O_WRONLY|O_CLOEXEC); if (i != -1) { dup2(i, STDOUT_FILENO); dup2(i, STDERR_FILENO); close(i); } sigaction(SIGTTOU, &sig_ign_action, NULL); sigaction(SIGTTIN, &sig_ign_action, NULL); sigaction(SIGTSTP, &sig_ign_action, NULL); } static void pid_write(void) { FILE *pidf = NULL; if (cnt_list[0]->conf.pid_file) { pidf = myfopen(cnt_list[0]->conf.pid_file, "w+e"); if (pidf) { (void)fprintf(pidf, "%d\n", getpid()); myfclose(pidf); MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Created process id file %s. Process ID is %d") ,cnt_list[0]->conf.pid_file, getpid()); } else { MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO ,_("Cannot create process id file (pid file) %s") , cnt_list[0]->conf.pid_file); } } } static void cntlist_create(int argc, char *argv[]) { /* * cnt_list is an array of pointers to the context structures cnt for each thread. * First we reserve room for a pointer to thread 0's context structure * and a NULL pointer which indicates that end of the array of pointers to * thread context structures. */ cnt_list = mymalloc(sizeof(struct context *) * 2); /* Now we reserve room for thread 0's context structure and let cnt_list[0] point to it */ cnt_list[0] = mymalloc(sizeof(struct context)); /* Populate context structure with start/default values */ context_init(cnt_list[0]); /* Initialize some static and global string variables */ gethostname (cnt_list[0]->hostname, PATH_MAX); cnt_list[0]->hostname[PATH_MAX-1] = '\0'; /* end of variables */ /* cnt_list[1] pointing to zero indicates no more thread context structures - they get added later */ cnt_list[1] = NULL; /* * Command line arguments are being pointed to from cnt_list[0] and we call conf_load which loads * the config options from motion.conf, thread config files and the command line. */ cnt_list[0]->conf.argv = argv; cnt_list[0]->conf.argc = argc; cnt_list = conf_load(cnt_list); } static void motion_shutdown(void) { int indx; motion_remove_pid(); webu_stop(cnt_list); indx = -1; while (cnt_list[++indx]) { context_destroy(cnt_list[indx]); } free(cnt_list); cnt_list = NULL; vid_mutex_destroy(); } static void motion_camera_ids(void) { /* Set the camera id's on the context. They must be unique */ int indx, indx2, invalid_ids; /* Set defaults */ indx = 0; while (cnt_list[indx] != NULL) { if (cnt_list[indx]->conf.camera_id > 0) { cnt_list[indx]->camera_id = cnt_list[indx]->conf.camera_id; } else { cnt_list[indx]->camera_id = indx; } indx++; } invalid_ids = FALSE; indx = 0; while (cnt_list[indx] != NULL) { if (cnt_list[indx]->camera_id > 32000) { invalid_ids = TRUE; } indx2 = indx + 1; while (cnt_list[indx2] != NULL) { if (cnt_list[indx]->camera_id == cnt_list[indx2]->camera_id) { invalid_ids = TRUE; } indx2++; } indx++; } if (invalid_ids) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Camara IDs are not unique or have values over 32,000. Falling back to thread numbers")); indx = 0; while (cnt_list[indx] != NULL) { cnt_list[indx]->camera_id = indx; indx++; } } } static void motion_ntc(void) { #ifdef HAVE_V4L2 MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,_("v4l2 : available")); #else MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,_("v4l2 : not available")); #endif #ifdef HAVE_BKTR MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,_("bktr : available")); #else MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,_("bktr : not available")); #endif #ifdef HAVE_WEBP MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,_("webp : available")); #else MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,_("webp : not available")); #endif #ifdef HAVE_MMAL MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,_("mmal : available")); #else MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,_("mmal : not available")); #endif #ifdef HAVE_FFMPEG MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,_("ffmpeg : available")); #else MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,_("ffmpeg : not available")); #endif #ifdef HAVE_MYSQL MOTION_LOG(DBG, TYPE_DB, NO_ERRNO,_("mysql : available")); #else MOTION_LOG(DBG, TYPE_DB, NO_ERRNO,_("mysql : not available")); #endif #ifdef HAVE_MARIADB MOTION_LOG(DBG, TYPE_DB, NO_ERRNO,_("MariaDB: available")); #else MOTION_LOG(DBG, TYPE_DB, NO_ERRNO,_("MariaDB: not available")); #endif #ifdef HAVE_SQLITE3 MOTION_LOG(DBG, TYPE_DB, NO_ERRNO,_("sqlite3: available")); #else MOTION_LOG(DBG, TYPE_DB, NO_ERRNO,_("sqlite3: not available")); #endif #ifdef HAVE_PGSQL MOTION_LOG(DBG, TYPE_DB, NO_ERRNO,_("pgsql : available")); #else MOTION_LOG(DBG, TYPE_DB, NO_ERRNO,_("pgsql : not available")); #endif #ifdef HAVE_GETTEXT MOTION_LOG(DBG, TYPE_DB, NO_ERRNO,_("nls : available")); #else MOTION_LOG(DBG, TYPE_DB, NO_ERRNO,_("nls : not available")); #endif } /** * motion_startup * * Responsible for initializing stuff when Motion starts up or is restarted, * including daemon initialization and creating the context struct list. * * Parameters: * * daemonize - non-zero to do daemon init (if the config parameters says so), * or 0 to skip it * argc - size of argv * argv - command-line options, passed initially from 'main' * * Returns: nothing */ static void motion_startup(int daemonize, int argc, char *argv[]) { /* Initialize our global mutex */ pthread_mutex_init(&global_lock, NULL); /* * Create the list of context structures and load the * configuration. */ cntlist_create(argc, argv); if ((cnt_list[0]->conf.log_level > ALL) || (cnt_list[0]->conf.log_level == 0)) { cnt_list[0]->conf.log_level = LEVEL_DEFAULT; cnt_list[0]->log_level = cnt_list[0]->conf.log_level; MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Using default log level (%s) (%d)") ,get_log_level_str(cnt_list[0]->log_level) ,SHOW_LEVEL_VALUE(cnt_list[0]->log_level)); } else { cnt_list[0]->log_level = cnt_list[0]->conf.log_level - 1; // Let's make syslog compatible } if ((cnt_list[0]->conf.log_file) && (strncmp(cnt_list[0]->conf.log_file, "syslog", 6))) { set_log_mode(LOGMODE_FILE); ptr_logfile = set_logfile(cnt_list[0]->conf.log_file); if (ptr_logfile) { set_log_mode(LOGMODE_SYSLOG); MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Logging to file (%s)"),cnt_list[0]->conf.log_file); set_log_mode(LOGMODE_FILE); } else { MOTION_LOG(EMG, TYPE_ALL, SHOW_ERRNO ,_("Exit motion, cannot create log file %s") ,cnt_list[0]->conf.log_file); exit(0); } } else { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Logging to syslog")); } MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Motion %s Started"),VERSION); if ((cnt_list[0]->conf.log_type == NULL) || !(cnt_list[0]->log_type = get_log_type(cnt_list[0]->conf.log_type))) { cnt_list[0]->log_type = TYPE_DEFAULT; cnt_list[0]->conf.log_type = mymalloc(4); sprintf(cnt_list[0]->conf.log_type, "%s", "ALL"); MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO,_("Using default log type (%s)"), get_log_type_str(cnt_list[0]->log_type)); } MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Using log type (%s) log level (%s)"), get_log_type_str(cnt_list[0]->log_type), get_log_level_str(cnt_list[0]->log_level)); set_log_level(cnt_list[0]->log_level); set_log_type(cnt_list[0]->log_type); if (daemonize) { /* * If daemon mode is requested, and we're not going into setup mode, * become daemon. */ if (cnt_list[0]->daemon && cnt_list[0]->conf.setup_mode == 0) { become_daemon(); MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Motion running as daemon process")); } } pid_write(); if (cnt_list[0]->conf.setup_mode) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO,_("Motion running in setup mode.")); } conf_output_parms(cnt_list); motion_ntc(); motion_camera_ids(); initialize_chars(); webu_start(cnt_list); vid_mutex_init(); } /** * motion_start_thread * * Called from main when start a motion thread * * Parameters: * * cnt - Thread context pointer * thread_attr - pointer to thread attributes * * Returns: nothing */ static void motion_start_thread(struct context *cnt) { int i; char service[6]; pthread_attr_t thread_attr; if (mystrne(cnt->conf_filename, "")) { cnt->conf_filename[sizeof(cnt->conf_filename) - 1] = '\0'; MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Camera ID: %d is from %s") ,cnt->camera_id, cnt->conf_filename); } if (cnt->conf.netcam_url) { snprintf(service,6,"%s",cnt->conf.netcam_url); MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO,_("Camera ID: %d Camera Name: %s Service: %s") ,cnt->camera_id, cnt->conf.camera_name,service); } else { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO,_("Camera ID: %d Camera Name: %s Device: %s") ,cnt->camera_id, cnt->conf.camera_name,cnt->conf.video_device); } /* * Check the stream port number for conflicts. * First we check for conflict with the control port. * Second we check for that two threads does not use the same port number * for the stream. If a duplicate port is found the stream feature gets disabled (port = 0) * for this thread and a warning is written to console and syslog. */ if (cnt->conf.stream_port != 0) { /* Compare against the control port. */ if (cnt_list[0]->conf.webcontrol_port == cnt->conf.stream_port) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Stream port number %d for thread %d conflicts with the control port") ,cnt->conf.stream_port, cnt->threadnr); MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("Stream feature for thread %d is disabled.") ,cnt->threadnr); cnt->conf.stream_port = 0; } /* Compare against stream ports of other threads. */ for (i = 1; cnt_list[i]; i++) { if (cnt_list[i] == cnt) { continue; } if (cnt_list[i]->conf.stream_port == cnt->conf.stream_port) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Stream port number %d for thread %d conflicts with thread %d") ,cnt->conf.stream_port, cnt->threadnr, cnt_list[i]->threadnr); MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("Stream feature for thread %d is disabled.") ,cnt->threadnr); cnt->conf.stream_port = 0; } } } /* * Update how many threads we have running. This is done within a * mutex lock to prevent multiple simultaneous updates to * 'threads_running'. */ pthread_mutex_lock(&global_lock); threads_running++; pthread_mutex_unlock(&global_lock); /* Set a flag that we want this thread running */ cnt->restart = 1; /* Give the thread watchdog to start */ cnt->watchdog = cnt->conf.watchdog_tmo; /* Flag it as running outside of the thread, otherwise if the main loop * checked if it is was running before the thread set it to 1, it would * start another thread for this device. */ cnt->running = 1; pthread_attr_init(&thread_attr); pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); if (pthread_create(&cnt->thread_id, &thread_attr, &motion_loop, cnt)) { /* thread create failed, undo running state */ cnt->running = 0; pthread_mutex_lock(&global_lock); threads_running--; pthread_mutex_unlock(&global_lock); } pthread_attr_destroy(&thread_attr); } static void motion_restart(int argc, char **argv) { /* * Handle the restart situation. Currently the approach is to * cleanup everything, and then initialize everything again * (including re-reading the config file(s)). */ MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO,_("Restarting motion.")); motion_shutdown(); SLEEP(2, 0); motion_startup(0, argc, argv); /* 0 = skip daemon init */ MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO,_("Motion restarted")); restart = 0; } static void motion_watchdog(int indx) { /* Notes: * To test scenarios, just double lock a mutex in a spawned thread. * We use detached threads because pthread_join would lock the main thread * If we only call the first pthread_cancel when we reach the watchdog_kill * it does not break us out of the mutex lock. * We keep sending VTAlarms so the pthread_cancel queued can be caught. * The calls to pthread_kill 'may' not work or cause crashes * The cancel could finish and then the pthread_kill could be called * on the invalid thread_id which could cause undefined results * Even if the cancel finishes it is not clean since memory is not cleaned. * The other option instead of cancel would be to exit(1) and terminate everything * Best to just not get into a watchdog situation... */ if (!cnt_list[indx]->running) { return; } cnt_list[indx]->watchdog--; if (cnt_list[indx]->watchdog == 0) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Thread %d - Watchdog timeout. Trying to do a graceful restart") , cnt_list[indx]->threadnr); cnt_list[indx]->event_stop = TRUE; /* Trigger end of event */ cnt_list[indx]->finish = 1; } if (cnt_list[indx]->watchdog == -cnt_list[indx]->conf.watchdog_kill) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Thread %d - Watchdog timeout did NOT restart, killing it!") , cnt_list[indx]->threadnr); if ((cnt_list[indx]->camera_type == CAMERA_TYPE_RTSP) && (cnt_list[indx]->rtsp != NULL)) { pthread_cancel(cnt_list[indx]->rtsp->thread_id); } if ((cnt_list[indx]->camera_type == CAMERA_TYPE_RTSP) && (cnt_list[indx]->rtsp_high != NULL)) { pthread_cancel(cnt_list[indx]->rtsp_high->thread_id); } if ((cnt_list[indx]->camera_type == CAMERA_TYPE_NETCAM) && (cnt_list[indx]->netcam != NULL)) { pthread_cancel(cnt_list[indx]->netcam->thread_id); } pthread_cancel(cnt_list[indx]->thread_id); } if (cnt_list[indx]->watchdog < -cnt_list[indx]->conf.watchdog_kill) { if ((cnt_list[indx]->camera_type == CAMERA_TYPE_NETCAM) && (cnt_list[indx]->rtsp != NULL)) { if (!cnt_list[indx]->rtsp->handler_finished && pthread_kill(cnt_list[indx]->rtsp->thread_id, 0) == ESRCH) { cnt_list[indx]->rtsp->handler_finished = TRUE; pthread_mutex_lock(&global_lock); threads_running--; pthread_mutex_unlock(&global_lock); netcam_rtsp_cleanup(cnt_list[indx],FALSE); } else { pthread_kill(cnt_list[indx]->rtsp->thread_id, SIGVTALRM); } } if ((cnt_list[indx]->camera_type == CAMERA_TYPE_NETCAM) && (cnt_list[indx]->rtsp_high != NULL)) { if (!cnt_list[indx]->rtsp_high->handler_finished && pthread_kill(cnt_list[indx]->rtsp_high->thread_id, 0) == ESRCH) { cnt_list[indx]->rtsp_high->handler_finished = TRUE; pthread_mutex_lock(&global_lock); threads_running--; pthread_mutex_unlock(&global_lock); netcam_rtsp_cleanup(cnt_list[indx],FALSE); } else { pthread_kill(cnt_list[indx]->rtsp_high->thread_id, SIGVTALRM); } } if ((cnt_list[indx]->camera_type == CAMERA_TYPE_NETCAM) && (cnt_list[indx]->netcam != NULL)) { if (!cnt_list[indx]->netcam->handler_finished && pthread_kill(cnt_list[indx]->netcam->thread_id, 0) == ESRCH) { pthread_mutex_lock(&global_lock); threads_running--; pthread_mutex_unlock(&global_lock); cnt_list[indx]->netcam->handler_finished = TRUE; cnt_list[indx]->netcam->finish = FALSE; } else { pthread_kill(cnt_list[indx]->netcam->thread_id, SIGVTALRM); } } if (cnt_list[indx]->running && pthread_kill(cnt_list[indx]->thread_id, 0) == ESRCH) { MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO ,_("Thread %d - Cleaning thread.") , cnt_list[indx]->threadnr); pthread_mutex_lock(&global_lock); threads_running--; pthread_mutex_unlock(&global_lock); motion_cleanup(cnt_list[indx]); cnt_list[indx]->running = 0; cnt_list[indx]->finish = 0; } else { pthread_kill(cnt_list[indx]->thread_id,SIGVTALRM); } } } static int motion_check_threadcount(void) { /* Return 1 if we should break out of loop */ /* It has been observed that this is not counting every * thread running. The netcams spawn handler threads which are not * counted here. This is only counting context threads and when they * all get to zero, then we are done. */ int motion_threads_running, indx; motion_threads_running = 0; for (indx = (cnt_list[1] != NULL ? 1 : 0); cnt_list[indx]; indx++) { if (cnt_list[indx]->running || cnt_list[indx]->restart) { motion_threads_running++; } } /* If the web control/streams are in finish/shutdown, we * do not want to count them. They will be completely closed * by the process outside of loop that is checking the counts * of threads. If the webcontrol is not in a finish / shutdown * then we want to keep them in the tread count to allow user * to restart the cameras and keep Motion running. */ indx = 0; while (cnt_list[indx] != NULL) { if ((cnt_list[indx]->webcontrol_finish == FALSE) && ((cnt_list[indx]->webcontrol_daemon != NULL) || (cnt_list[indx]->webstream_daemon != NULL))) { motion_threads_running++; } indx++; } if (((motion_threads_running == 0) && finish) || ((motion_threads_running == 0) && (threads_running == 0))) { MOTION_LOG(ALL, TYPE_ALL, NO_ERRNO ,_("DEBUG-1 threads_running %d motion_threads_running %d , finish %d") ,threads_running, motion_threads_running, finish); return 1; } else { return 0; } } /** * main * * Main entry point of Motion. Launches all the motion threads and contains * the logic for starting up, restarting and cleaning up everything. * * Parameters: * * argc - size of argv * argv - command-line options * * Returns: Motion exit status = 0 always */ int main (int argc, char **argv) { int i; /* Create the TLS key for thread number. */ pthread_key_create(&tls_key_threadnr, NULL); pthread_setspecific(tls_key_threadnr, (void *)(0)); setup_signals(); motion_startup(1, argc, argv); ffmpeg_global_init(); dbse_global_init(cnt_list); translate_init(cnt_list[0]); do { if (restart) { motion_restart(argc, argv); } for (i = cnt_list[1] != NULL ? 1 : 0; cnt_list[i]; i++) { cnt_list[i]->threadnr = i ? i : 1; motion_start_thread(cnt_list[i]); } MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Waiting for threads to finish, pid: %d"), getpid()); while (1) { SLEEP(1, 0); if (motion_check_threadcount()) { break; } for (i = (cnt_list[1] != NULL ? 1 : 0); cnt_list[i]; i++) { /* Check if threads wants to be restarted */ if ((!cnt_list[i]->running) && (cnt_list[i]->restart)) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO ,_("Motion thread %d restart"), cnt_list[i]->threadnr); motion_start_thread(cnt_list[i]); } motion_watchdog(i); } } /* Reset end main loop flag */ finish = 0; MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Threads finished")); /* Rest for a while if we're supposed to restart. */ if (restart) { SLEEP(1, 0); } } while (restart); /* loop if we're supposed to restart */ MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("Motion terminating")); ffmpeg_global_deinit(); dbse_global_deinit(cnt_list); motion_shutdown(); /* Perform final cleanup. */ pthread_key_delete(tls_key_threadnr); pthread_mutex_destroy(&global_lock); return 0; } motion-release-4.6.0/src/motion.h000066400000000000000000000450731452402535500167270ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * motion.h * Headers associated with functions in the motion.c module. * Copyright 2000 by Jeroen Vreeken (pe1rxq@amsat.org) */ #ifndef _INCLUDE_MOTION_H #define _INCLUDE_MOTION_H /* Forward declarations of structs */ struct images; struct image_data; struct rtsp_context; struct ffmpeg; #include "config.h" /* Includes */ #include #include #ifndef __USE_GNU #define __USE_GNU #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(HAVE_PTHREAD_NP_H) #include #endif #if defined(HAVE_MYSQL) #include #endif #if defined(HAVE_MARIADB) #include #endif #ifdef HAVE_SQLITE3 #include #endif #ifdef HAVE_PGSQL // avoid libpq-fe.h collision with motion.h #define CONNECTION_OK (below) #define CONNECTION_OK PGSQL_CONNECTION_OK #include // avoid redefinition warning for motion.h #define CONNECTION_OK below #undef CONNECTION_OK #endif #ifdef HAVE_FFMPEG #define MYFFVER (LIBAVFORMAT_VERSION_MAJOR * 1000)+LIBAVFORMAT_VERSION_MINOR #include #include #include #include #include #include #include #include #include #if (MYFFVER >= 57083) #include "libavutil/hwcontext.h" #endif #else #define MYFFVER 0 #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /* Due to the pointer magic method of conf, the conf.h and track.h must stay in here */ #include "conf.h" #include "track.h" #ifdef HAVE_MMAL #include "mmalcam.h" #endif /* * The macro below defines a version of sleep using nanosleep * If a signal such as SIG_CHLD interrupts the sleep we just continue sleeping */ #define SLEEP(seconds, nanoseconds) { \ struct timespec tv; \ tv.tv_sec = (seconds); \ tv.tv_nsec = (nanoseconds); \ while (nanosleep(&tv, &tv) == -1); \ } /* Default picture settings */ #define DEF_WIDTH 640 #define DEF_HEIGHT 480 #define DEF_QUALITY 75 #define DEF_CHANGES 1500 #define DEF_MAXFRAMERATE 15 #define DEF_NOISELEVEL 32 /* Minimum time between two 'actions' (email, sms, external) */ #define DEF_EVENT_GAP 60 /* 1 minutes */ #define DEF_VIDEO_DEVICE "/dev/video0" #define THRESHOLD_TUNE_LENGTH 256 #define MISSING_FRAMES_TIMEOUT 30 /* When failing to get picture frame from camera we reuse the previous frame until MISSING_FRAMES_TIMEOUT seconds has passed and then we show a grey image instead */ #define CONNECTION_KO "Lost connection" #define CONNECTION_OK "Connection OK" #define DEF_MAXSTREAMS 10 /* Maximum number of stream clients per camera */ #define DEF_MAXWEBQUEUE 10 /* Maximum number of stream client in queue */ #define DEF_TIMESTAMP "%Y-%m-%d\\n%T" #define DEF_EVENTSTAMP "%Y%m%d%H%M%S" #define DEF_SNAPPATH "%v-%Y%m%d%H%M%S-snapshot" #define DEF_IMAGEPATH "%v-%Y%m%d%H%M%S-%q" #define DEF_MOVIEPATH "%v-%Y%m%d%H%M%S" #define DEF_TIMEPATH "%Y%m%d-timelapse" #define DEF_TIMELAPSE_MODE "daily" /* OUTPUT Image types */ #define IMAGE_TYPE_JPEG 0 #define IMAGE_TYPE_PPM 1 #define IMAGE_TYPE_WEBP 2 #define IMAGE_TYPE_GREY 3 /* Filetype defines */ #define FTYPE_IMAGE 1 #define FTYPE_IMAGE_SNAPSHOT 2 #define FTYPE_IMAGE_MOTION 4 #define FTYPE_MPEG 8 #define FTYPE_MPEG_MOTION 16 #define FTYPE_MPEG_TIMELAPSE 32 #define FTYPE_MPEG_ANY (FTYPE_MPEG | FTYPE_MPEG_MOTION | FTYPE_MPEG_TIMELAPSE) #define FTYPE_IMAGE_ANY (FTYPE_IMAGE | FTYPE_IMAGE_SNAPSHOT | FTYPE_IMAGE_MOTION) /* What types of images files do we want to have */ #define NEWIMG_OFF 0 #define NEWIMG_ON 1 #define NEWIMG_FIRST 2 #define NEWIMG_BEST 4 #define NEWIMG_CENTER 8 #define LOCATE_OFF 0 #define LOCATE_ON 1 #define LOCATE_PREVIEW 2 #define LOCATE_BOX 1 #define LOCATE_REDBOX 2 #define LOCATE_CROSS 4 #define LOCATE_REDCROSS 8 #define LOCATE_NORMAL 1 #define LOCATE_BOTH 2 #define UPDATE_REF_FRAME 1 #define RESET_REF_FRAME 2 /* * Structure to hold images information * The idea is that this should have all information about a picture e.g. diffs, timestamp etc. * The exception is the label information, it uses a lot of memory * When the image is stored all texts motion marks etc. is written to the image * so we only have to send it out when/if we want. */ /* A image can have detected motion in it, but dosn't trigger an event, if we use minimum_motion_frames */ #define IMAGE_MOTION 1 #define IMAGE_TRIGGER 2 #define IMAGE_SAVE 4 #define IMAGE_SAVED 8 #define IMAGE_PRECAP 16 #define IMAGE_POSTCAP 32 enum CAMERA_TYPE { CAMERA_TYPE_UNKNOWN, CAMERA_TYPE_V4L2, CAMERA_TYPE_BKTR, CAMERA_TYPE_MMAL, CAMERA_TYPE_RTSP, CAMERA_TYPE_NETCAM }; enum WEBUI_LEVEL{ WEBUI_LEVEL_ALWAYS = 0, WEBUI_LEVEL_LIMITED = 1, WEBUI_LEVEL_ADVANCED = 2, WEBUI_LEVEL_RESTRICTED = 3, WEBUI_LEVEL_NEVER = 99 }; struct params_item_ctx { char *param_name; /* The name or description of the ID as requested by user*/ char *param_value; /* The value that the user wants the control set to*/ }; struct params_context { struct params_item_ctx *params_array; /*Array of the controls the user specified*/ int params_count; /*Count of the controls the user specified*/ int update_params; /*Bool for whether to update the parameters on the device*/ }; struct image_data { unsigned char *image_norm; unsigned char *image_high; int diffs; int64_t idnbr_norm; int64_t idnbr_high; struct timeval timestamp_tv; int shot; /* Sub second timestamp count */ /* * Movement center to img center distance * Note: Dist is calculated distX*distX + distY*distY */ unsigned long cent_dist; unsigned int flags; /* Se IMAGE_* defines */ struct coord location; /* coordinates for center and size of last motion detection*/ int total_labels; }; struct stream_data { unsigned char *jpeg_data; /* Image compressed as JPG */ long jpeg_size; /* The number of bytes for jpg */ int cnct_count; /* Counter of the number of connections */ }; /* * DIFFERENCES BETWEEN imgs.width, conf.width AND rotate_data.cap_width * (and the corresponding height values, of course) * =========================================================================== * Location Purpose * * conf The values in conf reflect width and height set in the * configuration file. These can be set via http remote control, * but they are not used internally by Motion, so it won't break * anything. These values are transferred to imgs in vid_start. * * imgs The values in imgs are the actual output dimensions. Normally * the output dimensions are the same as the capture dimensions, * but for 90 or 270 degrees rotation, they are not. E.g., if * you capture at 320x240, and rotate 90 degrees, the output * dimensions are 240x320. * These values are set from the conf values in vid_start, or * from the first JPEG image in netcam_start. For 90 or 270 * degrees rotation, they are swapped in rotate_init. * * rotate_data The values in rotate_data are named cap_width and cap_height, * and contain the capture dimensions. The difference between * capture and output dimensions is explained above. * These values are set in rotate_init. */ struct images { struct image_data *image_ring; /* The base address of the image ring buffer */ int image_ring_size; int image_ring_in; /* Index in image ring buffer we last added a image into */ int image_ring_out; /* Index in image ring buffer we want to process next time */ unsigned char *ref; /* The reference frame */ struct image_data img_motion; /* Picture buffer for motion images */ int *ref_dyn; /* Dynamic objects to be excluded from reference frame */ struct image_data image_virgin; /* Last picture frame with no text or locate overlay */ struct image_data image_vprvcy; /* Virgin image with the privacy mask applied */ struct image_data preview_image; /* Picture buffer for best image when enables */ unsigned char *mask; /* Buffer for the mask file */ unsigned char *smartmask; unsigned char *smartmask_final; unsigned char *common_buffer; unsigned char *substream_image; unsigned char *mask_privacy; /* Buffer for the privacy mask values */ unsigned char *mask_privacy_uv; /* Buffer for the privacy U&V values */ unsigned char *mask_privacy_high; /* Buffer for the privacy mask values */ unsigned char *mask_privacy_high_uv; /* Buffer for the privacy U&V values */ int *smartmask_buffer; int *labels; int *labelsize; int width; int height; int type; int picture_type; /* Output picture type IMAGE_JPEG, IMAGE_PPM */ int size_norm; /* Number of bytes for normal size image */ int width_high; int height_high; int size_high; /* Number of bytes for high resolution image */ int motionsize; int labelgroup_max; int labels_above; int labelsize_max; int largest_label; }; enum FLIP_TYPE { FLIP_TYPE_NONE, FLIP_TYPE_HORIZONTAL, FLIP_TYPE_VERTICAL }; /* Contains data for image rotation, see rotate.c. */ struct rotdata { unsigned char *buffer_norm; /* Temporary buffer for 90 and 270 degrees rotation of normal resolution image. */ unsigned char *buffer_high; /* Temporary buffer for 90 and 270 degrees rotation of high resolution image. */ int degrees; /* Degrees to rotate; copied from conf.rotate_deg. */ enum FLIP_TYPE axis; /* Rotate image over the Horizontal or Vertical axis. */ int capture_width_norm; /* Capture width of normal resolution image */ int capture_height_norm; /* Capture height of normal resolution image */ int capture_width_high; /* Capture width of high resolution image */ int capture_height_high; /* Capture height of high resolution image */ }; struct context { FILE *extpipe; int extpipe_open; char conf_filename[PATH_MAX]; int from_conf_dir; int threadnr; unsigned int daemon; char pid_file[PATH_MAX]; char log_file[PATH_MAX]; char log_type_str[6]; int log_level; unsigned int log_type; struct config conf; struct images imgs; struct trackoptions track; int track_posx; int track_posy; enum CAMERA_TYPE camera_type; struct netcam_context *netcam; #ifdef HAVE_MMAL struct mmalcam_context *mmalcam; #endif struct rtsp_context *rtsp; /* this structure contains the context for normal RTSP connection */ struct rtsp_context *rtsp_high; /* this structure contains the context for high resolution RTSP connection */ struct params_context *vdev; /* Structure for v4l2 and bktr device information */ struct image_data *current_image; /* Pointer to a structure where the image, diffs etc is stored */ unsigned int new_img; int locate_motion_mode; int locate_motion_style; int process_thisframe; struct rotdata rotate_data; /* rotation data is thread-specific */ int noise; int threshold; int threshold_maximum; int diffs_last[THRESHOLD_TUNE_LENGTH]; int smartmask_speed; /* bktr and v4l2 params used for round robin */ int param_input; long param_freq; int param_norm; /* Commands to the motion thread */ volatile unsigned int snapshot; /* Make a snapshot */ volatile unsigned int event_stop; /* Boolean for whether to stop a event */ volatile unsigned int event_user; /* Boolean for whether to user triggered an event */ volatile unsigned int finish; /* End the thread */ volatile unsigned int restart; /* Restart the thread when it ends */ /* Is the motion thread running */ volatile unsigned int running; /* Is the web control thread running */ volatile unsigned int webcontrol_running; volatile unsigned int webcontrol_finish; /* End the thread */ volatile int watchdog; pthread_t thread_id; int event_nr; int prev_event; char eventid[20]; /* Cam ID + Date/Time 99999yyyymmddhhmmss */ unsigned int lightswitch_framecounter; char text_event_string[PATH_MAX]; /* The text for conv. spec. %C - */ int text_scale; int postcap; /* downcounter, frames left to to send post event */ int shots; unsigned int detecting_motion; struct timeval current_tv; struct timeval last_tv; struct timeval event_tv; struct timeval movie_tv; struct timeval lostconnection_tv; /* timestamp from connection lost */ struct timeval lastframe_tv; unsigned int lastrate; unsigned int startup_frames; unsigned int moved; unsigned int pause; int missing_frame_counter; /* counts failed attempts to fetch picture frame from camera */ unsigned int lost_connection; int video_dev; int pipe; int mpipe; char hostname[PATH_MAX]; int sql_mask; #ifdef HAVE_SQLITE3 sqlite3 *database_sqlite3; #endif #if defined(HAVE_MYSQL) MYSQL *database_mysql; #endif #if defined(HAVE_MARIADB) MYSQL *database_mariadb; #endif #ifdef HAVE_PGSQL PGconn *database_pgsql; int eid_db_format; /* db event ID PQfformat() or PQgetlength() if binary */ #define dbeid_undetermined -1 /* sql_query_start not present or not yet executed */ #define dbeid_no_return -2 /* sql_query_start statement returned nothing */ #define dbeid_not_valid -3 /* sql_query_start statement returned invalid value: */ /* multiple values or value not a positive integer */ #define dbeid_unk_format -4 /* PGgetlength() returned unexpected size for bin fmt */ #define dbeid_use_error -5 /* %{dbeventid} used w/ no sql_query_start return val */ #define dbeid_recovery -6 /* PGSQL session in recovery after session failure */ #define dbeid_rec_fail -7 /* PQresetStart failed; keep trying */ /* NB: for values < -1, event ID recording is skipped */ /* unless lost session recovery or SIGHUP occur */ #endif int movie_fps; char newfilename[PATH_MAX]; char extpipefilename[PATH_MAX]; char extpipecmdline[PATH_MAX]; int movie_last_shot; struct ffmpeg *ffmpeg_output; struct ffmpeg *ffmpeg_output_motion; struct ffmpeg *ffmpeg_timelapse; int movie_passthrough; char timelapsefilename[PATH_MAX]; char motionfilename[PATH_MAX]; int area_minx[9], area_miny[9], area_maxx[9], area_maxy[9]; int areadetect_eventnbr; /* ToDo Determine why we need these...just put it all into prepare? */ unsigned long long int timenow, timebefore; unsigned int rate_limit; int minimum_frame_time_downcounter; unsigned int get_image; /* Flag used to signal that we capture new image when we run the loop */ long int required_frame_time, frame_delay; long int rolling_average_limit; long int *rolling_average_data; unsigned long int rolling_average; int olddiffs; //only need this in here for a printf later...do we need that printf? int smartmask_ratio; int smartmask_count; int previous_diffs, previous_location_x, previous_location_y; unsigned long int time_last_frame, time_current_frame; unsigned int smartmask_lastrate; unsigned int passflag; //only purpose is to flag first frame vs all others..... int rolling_frame; struct MHD_Daemon *webcontrol_daemon; struct MHD_Daemon *webstream_daemon; char webcontrol_digest_rand[8]; char webstream_digest_rand[8]; int camera_id; pthread_mutex_t mutex_stream; struct stream_data stream_norm; /* Copy of the image to use for web stream*/ struct stream_data stream_sub; /* Copy of the image to use for web stream*/ struct stream_data stream_motion; /* Copy of the image to use for web stream*/ struct stream_data stream_source; /* Copy of the image to use for web stream*/ struct params_context *webcontrol_headers; /* Headers for webcontrol */ struct params_context *stream_headers; /* Headers for stream */ }; extern pthread_mutex_t global_lock; extern volatile int threads_running; extern FILE *ptr_logfile; /* TLS keys below */ extern pthread_key_t tls_key_threadnr; /* key for thread number */ void motion_remove_pid(void); #endif /* _INCLUDE_MOTION_H */ motion-release-4.6.0/src/netcam.c000066400000000000000000000771321452402535500166650ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /** * netcam.c * * Module of common routines for handling network cameras. * */ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include "netcam.h" #include "netcam_http.h" #include "netcam_ftp.h" /* * The following three routines (netcam_url_match, netcam_url_parse and * netcam_url_free are for 'parsing' (i.e. separating into the relevant * components) the URL provided by the user. They make use of regular * expressions (which is outside the scope of this module, so detailed * comments are not provided). netcam_url_parse is called from netcam_start, * and puts the "broken-up" components of the URL into the "url" element of * the netcam_context structure. * * Note that the routines are not "very clever", but they work sufficiently * well for the limited requirements of this module. The expression: * (http)://(((.*):(.*))@)?([^/:]|[-.a-z0-9]+)(:([0-9]+))?($|(/[^:]*)) * requires * 1) a string which begins with 'http', followed by '://' * 2) optionally a '@' which is preceded by two strings * (with 0 or more characters each) separated by a ':' * [this is for an optional username:password] * 3) a string comprising alpha-numerics, '-' and '.' characters * [this is for the hostname] * 4) optionally a ':' followed by one or more numeric characters * [this is for an optional port number] * 5) finally, either an end of line or a series of segments, * each of which begins with a '/', and contains anything * except a ':' */ /** * netcam_url_match * * Finds the matched part of a regular expression * * Parameters: * * m A structure containing the regular expression to be used * input The input string * * Returns: The string which was matched * */ static char *netcam_url_match(regmatch_t m, const char *input) { char *match = NULL; int len; if (m.rm_so != -1) { len = m.rm_eo - m.rm_so; if ((match = mymalloc(len + 1)) != NULL) { strncpy(match, input + m.rm_so, len); match[len] = '\0'; } } return match; } static void netcam_url_invalid(struct url_t *parse_url) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("Invalid URL. Can not parse values.")); parse_url->host = malloc(5); parse_url->service = malloc(5); parse_url->path = malloc(10); parse_url->userpass = malloc(10); parse_url->port = 0; sprintf(parse_url->host, "%s","????"); sprintf(parse_url->service, "%s","????"); sprintf(parse_url->path, "%s","INVALID"); sprintf(parse_url->userpass, "%s","INVALID"); } /** * netcam_url_parse * * parses a string containing a URL into it's components * * Parameters: * parse_url A structure which will receive the results * of the parsing * text_url The input string containing the URL * * Returns: Nothing * */ void netcam_url_parse(struct url_t *parse_url, const char *text_url) { char *s; int i; const char *re = "(.*)://(((.*):(.*))@)?" "([^/:]|[-_.a-z0-9]+)(:([0-9]+))?($|(/[^*]*))"; regex_t pattbuf; regmatch_t matches[10]; if (!strncmp(text_url, "file", 4)) { re = "(file)://(((.*):(.*))@)?([/:])?(:([0-9]+))?($|(/[^*]*))"; } if (!strncmp(text_url, "jpeg", 4)) { re = "(jpeg)://(((.*):(.*))@)?([/:])?(:([0-9]+))?($|(/[^*]*))"; } if (!strncmp(text_url, "v4l2", 4)) { re = "(v4l2)://(((.*):(.*))@)?([/:])?(:([0-9]+))?($|(/[^*]*))"; } /* Note that log messages are commented out to avoid leaking info related * to user/host/pass etc. Keeing them in the code for easier debugging if * it is needed */ //MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO, "Entry netcam_url_parse data %s",text_url); memset(parse_url, 0, sizeof(struct url_t)); /* * regcomp compiles regular expressions into a form that is * suitable for regexec searches * regexec matches the URL string against the regular expression * and returns an array of pointers to strings matching each match * within (). The results that we need are finally placed in parse_url. */ if (!regcomp(&pattbuf, re, REG_EXTENDED | REG_ICASE)) { if (regexec(&pattbuf, text_url, 10, matches, 0) != REG_NOMATCH) { for (i = 0; i < 10; i++) { if ((s = netcam_url_match(matches[i], text_url)) != NULL) { //MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, "Parse case %d data %s", i, s); switch (i) { case 1: parse_url->service = s; break; case 3: parse_url->userpass = s; break; case 6: parse_url->host = s; break; case 8: parse_url->port = atoi(s); free(s); break; case 9: parse_url->path = s; break; /* Other components ignored */ default: free(s); break; } } } } else { netcam_url_invalid(parse_url); } } else { netcam_url_invalid(parse_url); } regfree(&pattbuf); } /** * netcam_url_free * * General cleanup of the URL structure, called from netcam_cleanup. * * Parameters: * * parse_url Structure containing the parsed data. * * Returns: Nothing * */ void netcam_url_free(struct url_t *parse_url) { free(parse_url->service); parse_url->service = NULL; free(parse_url->userpass); parse_url->userpass = NULL; free(parse_url->host); parse_url->host = NULL; free(parse_url->path); parse_url->path = NULL; } /** * netcam_handler_loop * This is the "main loop" for the handler thread. It is created * in netcam_start when a streaming camera is detected. * * Parameters * * arg Pointer to the motion context for this camera. * * Returns: NULL pointer * */ static void *netcam_handler_loop(void *arg) { int retval; int open_error = 0; netcam_context_ptr netcam = arg; struct context *cnt = netcam->cnt; /* Needed for the SETUP macro :-( */ netcam->handler_finished = FALSE; util_threadname_set("nc",netcam->threadnr,netcam->cnt->conf.camera_name); /* Store the corresponding motion thread number in TLS also for this * thread (necessary for 'MOTION_LOG' to function properly). */ pthread_setspecific(tls_key_threadnr, (void *)((unsigned long)cnt->threadnr)); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("Camera handler thread [%d] started"), netcam->threadnr); /* * The logic of our loop is very simple. If this is a non- * streaming camera, we re-establish connection with the camera * and read the header record. If it's a streaming camera, we * position to the next "boundary string" in the input stream. * In either case, we then read the following JPEG image into the * next available buffer, updating the "next" and "latest" indices * in our netcam * structure. The loop continues until netcam->finish * or cnt->finish is set. */ while (!netcam->finish) { if (netcam->response) { /* If html input */ if (netcam->caps.streaming == NCS_UNSUPPORTED) { /* Non-streaming ie. jpeg */ if (!netcam->connect_keepalive || (netcam->connect_keepalive && netcam->keepalive_timeup)) { /* If keepalive flag set but time up, time to close this socket. */ if (netcam->connect_keepalive && netcam->keepalive_timeup) { MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO ,_("Closing netcam socket as Keep-Alive time is up " "(camera sent Close field). A reconnect should happen.")); netcam_disconnect(netcam); netcam->keepalive_timeup = FALSE; } /* And the netcam_connect call below will open a new one. */ if (netcam_connect(netcam, open_error) < 0) { if (!open_error) { /* Log first error. */ MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO ,_("re-opening camera (non-streaming)")); open_error = 1; } /* Need to have a dynamic delay here. */ SLEEP(5, 0); continue; } if (open_error) { /* Log re-connection */ MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO ,_("camera re-connected")); open_error = 0; } } /* Send our request and look at the response. */ if ((retval = netcam_read_first_header(netcam)) != 1) { if (retval > 0) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Unrecognized image header (%d)"), retval); } else if (retval != -1) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Error in header (%d)"), retval); } /* Need to have a dynamic delay here. */ continue; } } else if (netcam->caps.streaming == NCS_MULTIPART) { /* Multipart Streaming */ if (netcam_read_next_header(netcam) < 0) { if (netcam_connect(netcam, open_error) < 0) { if (!open_error) { /* Log first error */ MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("re-opening camera (streaming)")); open_error = 1; } SLEEP(5, 0); continue; } if ((retval = netcam_read_first_header(netcam) != 2)) { if (retval > 0) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Unrecognized image header (%d)"), retval); } else if (retval != -1) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Error in header (%d)"), retval); } /* FIXME need some limit. */ continue; } } if (open_error) { /* Log re-connection */ MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("camera re-connected")); open_error = 0; } } else if (netcam->caps.streaming == NCS_BLOCK) { /* MJPG-Block streaming */ /* * Since we cannot move in the stream here, because we will read past the * MJPG-block-header, error handling is done while reading MJPG blocks. */ } } if (netcam->get_image(netcam) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("Error getting jpeg image")); /* If FTP connection, attempt to re-connect to server. */ if (netcam->ftp) { close(netcam->ftp->control_file_desc); if (ftp_connect(netcam) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("Trying to re-connect")); } } continue; } /* * FIXME * Need to check whether the image was received / decoded * satisfactorily. */ /* * If non-streaming, want to synchronize our thread with the * motion main-loop. */ if (netcam->caps.streaming == NCS_UNSUPPORTED) { pthread_mutex_lock(&netcam->mutex); /* Before anything else, check for system shutdown. */ if (netcam->finish) { pthread_mutex_unlock(&netcam->mutex); break; } /* * If our current loop has finished before the next * request from the motion main-loop, we do a * conditional wait (wait for signal). On the other * hand, if the motion main-loop has already signalled * us, we just continue. In either event, we clear * the start_capture flag set by the main loop. */ if (!netcam->start_capture) { pthread_cond_wait(&netcam->cap_cond, &netcam->mutex); } netcam->start_capture = 0; pthread_mutex_unlock(&netcam->mutex); } /* The loop continues forever, or until motion shutdown. */ } /* Our thread is finished - decrement motion's thread count. */ pthread_mutex_lock(&global_lock); threads_running--; pthread_mutex_unlock(&global_lock); /* Log out a termination message. */ MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("netcam camera handler: finish set, exiting")); netcam->handler_finished = TRUE; /* Signal netcam_cleanup that we're all done. */ pthread_mutex_lock(&netcam->mutex); pthread_cond_signal(&netcam->exiting); pthread_mutex_unlock(&netcam->mutex); /* Goodbye..... */ pthread_exit(NULL); } /** * netcam_cleanup * * This routine releases any allocated data within the netcam context, * then frees the context itself. Extreme care must be taken to assure * that the multi-threading nature of the program is correctly * handled. * This function is also called from motion_init if first time connection * fails and we start retrying until we get a valid first frame from the * camera. * * Parameters: * * netcam Pointer to a netcam context * init_retry_flag 1 when the function is called because we are retrying * making the initial connection with a netcam and we know * we do not need to kill a netcam handler thread * 0 in any other case. * * Returns: Nothing. * */ void netcam_cleanup(netcam_context_ptr netcam, int init_retry_flag) { struct timespec waittime; if (!netcam) { return; } if (netcam->cnt->netcam == NULL) { return; } /* * This 'lock' is just a bit of "defensive" programming. It should * only be necessary if the routine is being called from different * threads, but in our Motion design, it should only be called from * the motion main-loop. */ pthread_mutex_lock(&netcam->mutex); /* * We set the netcam_context pointer in the motion main-loop context * to be NULL, so that this routine won't be called a second time. */ netcam->cnt->netcam = NULL; /* * Next we set 'finish' in order to get the camera-handler thread * to stop. */ netcam->finish = 1; /* * If the camera is non-streaming, the handler thread could be waiting * for a signal, so we send it one. If it's actually waiting on the * condition, it won't actually start yet because we still have * netcam->mutex locked. */ if (netcam->caps.streaming == NCS_UNSUPPORTED) { pthread_cond_signal(&netcam->cap_cond); } /* * Once the camera-handler gets to the end of it's loop (probably as * soon as we release netcam->mutex), because netcam->finish has been * set it will exit it's loop, do anything it needs to do with the * netcam context, and then send *us* as signal (netcam->exiting). * Note that when we start our wait on netcam->exiting, our lock on * netcam->mutex is automatically released, which will allow the * handler to complete it's loop, notice that 'finish' is set and exit. * This should always work, but again (defensive programming) we * use pthread_cond_timedwait and, if our timeout (8 seconds) expires * we just do the cleanup the handler would normally have done. This * assures that (even if there is a bug in our code) motion will still * be able to exit. * If the init_retry_flag is not set the netcam_cleanup code was * called while retrying the initial connection to a netcam and then * there is no camera-handler started yet and thread_running must * not be decremented. */ waittime.tv_sec = time(NULL) + 8; /* Seems that 3 is too small */ waittime.tv_nsec = 0; if (!init_retry_flag && pthread_cond_timedwait(&netcam->exiting, &netcam->mutex, &waittime) != 0) { /* * Although this shouldn't happen, if it *does* happen we will * log it (just for the programmer's information). */ MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("No response from camera handler - it must have already died")); pthread_mutex_lock(&global_lock); threads_running--; pthread_mutex_unlock(&global_lock); } /* We don't need any lock anymore, so release it. */ pthread_mutex_unlock(&netcam->mutex); /* and cleanup the rest of the netcam_context structure. */ free(netcam->connect_host); free(netcam->connect_request); free(netcam->boundary); if (netcam->latest != NULL) { free(netcam->latest->ptr); free(netcam->latest); } if (netcam->receiving != NULL) { free(netcam->receiving->ptr); free(netcam->receiving); } if (netcam->jpegbuf != NULL) { free(netcam->jpegbuf->ptr); free(netcam->jpegbuf); } if (netcam->ftp != NULL) { ftp_close(netcam->ftp); netcam->ftp = NULL; } else { netcam_disconnect(netcam); } util_parms_free (netcam->parameters); if (netcam->parameters != NULL) { free(netcam->parameters); } netcam->parameters = NULL; free(netcam->response); pthread_mutex_destroy(&netcam->mutex); pthread_cond_destroy(&netcam->cap_cond); pthread_cond_destroy(&netcam->pic_ready); pthread_cond_destroy(&netcam->exiting); free(netcam); } /** * netcam_next * * This routine is called when the main 'motion' thread wants a new * frame of video. It fetches the most recent frame available from * the netcam, converts it to YUV420P, and returns it to motion. * * Parameters: * cnt Pointer to the context for this thread * image Pointer to a buffer for the returned image * * Returns: Error code */ int netcam_next(struct context *cnt, struct image_data *img_data) { netcam_context_ptr netcam; /* * Here we have some more "defensive programming". This check should * never be true, but if it is just return with a "fatal error". */ if ((!cnt) || (!cnt->netcam)) { return NETCAM_FATAL_ERROR; } netcam = cnt->netcam; if (!netcam->latest->used) { MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO,_("called with no data in buffer")); return NETCAM_NOTHING_NEW_ERROR; } /* * If we are controlling a non-streaming camera, we synchronize the * motion main-loop with the camera-handling thread through a signal, * together with a flag to say "start your next capture". */ if (netcam->caps.streaming == NCS_UNSUPPORTED) { pthread_mutex_lock(&netcam->mutex); netcam->start_capture = 1; pthread_cond_signal(&netcam->cap_cond); pthread_mutex_unlock(&netcam->mutex); } /* * If an error occurs in the JPEG decompression which follows this, * jpeglib will return to the code within this 'if'. Basically, our * approach is to just return a NULL (failed) to the caller (an * error message has already been produced by the libjpeg routines). */ if (setjmp(netcam->setjmp_buffer)) { return NETCAM_GENERAL_ERROR | NETCAM_JPEG_CONV_ERROR; } /* If there was no error, process the latest image buffer. */ return netcam_proc_jpeg(netcam, img_data); } /** * netcam_start * * This routine is called from the main motion thread. It's job is * to open up the requested camera device and do any required * initialization. If the camera is a streaming type, then this * routine must also start up the camera-handling thread to take * care of it. * * Parameters: * * cnt Pointer to the motion context structure for this device. * * Returns: 0 on success * -1 on any failure * -2 image dimensions are not modulo 8 */ int netcam_start(struct context *cnt) { netcam_context_ptr netcam; /* Local pointer to our context. */ pthread_attr_t handler_attribute; /* Attributes of our handler thread. */ int retval, indx; struct url_t url; /* For parsing netcam URL. */ char err_service[6]; memset(&url, 0, sizeof(url)); cnt->netcam = mymalloc(sizeof(struct netcam_context)); netcam = cnt->netcam; /* Just for clarity in remaining code. */ netcam->cnt = cnt; /* Fill in the "parent" info. */ /* Our image buffers */ netcam->receiving = mymalloc(sizeof(netcam_buff)); netcam->receiving->ptr = mymalloc(NETCAM_BUFFSIZE); netcam->latest = mymalloc(sizeof(netcam_buff)); netcam->latest->ptr = mymalloc(NETCAM_BUFFSIZE); netcam->jpegbuf = mymalloc(sizeof(netcam_buff)); netcam->jpegbuf->ptr = mymalloc(NETCAM_BUFFSIZE); /* Thread control structures */ pthread_mutex_init(&netcam->mutex, NULL); pthread_cond_init(&netcam->cap_cond, NULL); pthread_cond_init(&netcam->pic_ready, NULL); pthread_cond_init(&netcam->exiting, NULL); /* Initialize the average frame time to the user's value. */ netcam->av_frame_time = 1000000.0 / cnt->conf.framerate; MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("Network Camera starting for camera (%s)"), cnt->conf.camera_name); netcam->parameters = mymalloc(sizeof(struct params_context)); netcam->parameters->update_params = TRUE; util_parms_parse(netcam->parameters, (char*)cnt->conf.netcam_params, TRUE); util_parms_add_default(netcam->parameters,"proxy","NULL"); util_parms_add_default(netcam->parameters,"keepalive","off"); util_parms_add_default(netcam->parameters,"tolerant_check","off"); /*false*/ for (indx = 0; indx < netcam->parameters->params_count; indx++) { if (mystreq(netcam->parameters->params_array[indx].param_name,"proxy") && mystrne(netcam->parameters->params_array[indx].param_value,"NULL")) { netcam_url_parse(&url, netcam->parameters->params_array[indx].param_value); if (!url.host) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Invalid netcam_proxy (%s)") ,netcam->parameters->params_array[indx].param_value); netcam_url_free(&url); return -1; } if (url.userpass) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Username/password not allowed on a proxy URL")); netcam_url_free(&url); return -1; } netcam->connect_host = url.host; url.host = NULL; if ((url.port == 0) && mystreq(url.service, "ftp")) { url.port = 21; } else if ((url.port == 0) && mystreq(url.service, "mjpeg")) { url.port = 80; } netcam->connect_port = url.port; netcam_url_free(&url); /* Finished with proxy */ break; } } /* Parse the URL from the configuration data */ netcam_url_parse(&url, cnt->conf.netcam_url); if (!url.service) { snprintf(err_service,5,"%s",cnt->conf.netcam_url); MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Invalid netcam service '%s' "), err_service); netcam_url_free(&url); return -1; } if ((!url.host) && (mystrne(url.service, "jpeg"))) { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("Invalid netcam_url for camera (%s)"), cnt->conf.camera_name); netcam_url_free(&url); return -1; } if ((url.port == 0) && mystreq(url.service, "ftp")) { url.port = 21; } else if ((url.port == 0) && mystreq(url.service, "mjpeg")) { url.port = 80; } for (indx = 0; indx < netcam->parameters->params_count; indx++) { if (mystreq(netcam->parameters->params_array[indx].param_name,"proxy")) { if (mystreq(netcam->parameters->params_array[indx].param_value,"NULL")) { netcam->connect_host = url.host; url.host = NULL; netcam->connect_port = url.port; netcam->haveproxy = FALSE; } else { netcam->haveproxy = TRUE; } } if (mystreq(netcam->parameters->params_array[indx].param_name,"keepalive")) { if (mystreq(netcam->parameters->params_array[indx].param_value,"force")) { netcam->connect_http_10 = TRUE; netcam->connect_http_11 = FALSE; netcam->connect_keepalive = TRUE; } else if (mystreq(netcam->parameters->params_array[indx].param_value,"off")) { netcam->connect_http_10 = TRUE; netcam->connect_http_11 = FALSE; netcam->connect_keepalive = FALSE; } else if (mystreq(netcam->parameters->params_array[indx].param_value,"on")) { netcam->connect_http_10 = FALSE; netcam->connect_http_11 = TRUE; netcam->connect_keepalive = TRUE; /* HTTP 1.1 has keepalive by default. */ } MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Netcam_http parameter '%s' converts to flags: HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s.") ,netcam->parameters->params_array[indx].param_value ,netcam->connect_http_10 ? "1":"0", netcam->connect_http_11 ? "1":"0" ,netcam->connect_keepalive ? "ON":"OFF"); } if (mystreq(netcam->parameters->params_array[indx].param_name,"tolerant_check")) { if (mystreq(netcam->parameters->params_array[indx].param_value,"off")) { netcam->netcam_tolerant_check = FALSE; } else { netcam->netcam_tolerant_check = TRUE; } } } /* Initialise the netcam socket to -1 to trigger a connection by the keep-alive logic. */ netcam->sock = -1; if ((url.service) && (mystreq(url.service, "mjpeg"))) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO,_("now calling netcam_setup_html()")); retval = netcam_setup_html(netcam, &url); } else if ((url.service) && (mystreq(url.service, "ftp"))) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO,_("now calling netcam_setup_ftp")); retval = netcam_setup_ftp(netcam, &url); } else if ((url.service) && (mystreq(url.service, "jpeg"))) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO,_("now calling netcam_setup_file()")); retval = netcam_setup_file(netcam, &url); } else if ((url.service) && (mystreq(url.service, "mjpg"))) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO,_("now calling netcam_setup_mjpg()")); retval = netcam_setup_mjpg(netcam, &url); } else { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Invalid netcam service '%s' - must be mjpeg, ftp, mjpg or jpeg.") , url.service); retval = -1; } netcam_url_free(&url); if (retval < 0) { return -1; } /* * We expect that, at this point, we should be positioned to read * he first image available from the camera (directly after the * applicable header). We want to decode the image in order to get * the dimensions (width and height). If successful, we will use * these to set the required image buffer(s) in our netcam_struct. */ if ((retval = netcam->get_image(netcam)) != 0) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Failed trying to read first image - retval:%d"), retval); return -1; } /* * If an error occurs in the JPEG decompression which follows this, * jpeglib will return to the code within this 'if'. If such an error * occurs during startup, we will just abandon this attempt. */ if (setjmp(netcam->setjmp_buffer)) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("libjpeg decompression failure on first frame - giving up!")); return -1; } netcam->JFIF_marker = 0; netcam_get_dimensions(netcam); /* Validate image sizes are multiple of 8 */ if ((netcam->width % 8) || (netcam->height % 8) ) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Width/height(%dx%d) must be multiples of 8") ,netcam->width, netcam->height); return -2; } /* Fill in camera details into context structure. */ cnt->imgs.width = netcam->width; cnt->imgs.height = netcam->height; cnt->imgs.size_norm = (netcam->width * netcam->height * 3) / 2; cnt->imgs.motionsize = netcam->width * netcam->height; cnt->imgs.width_high = 0; cnt->imgs.height_high = 0; cnt->imgs.size_high = 0; pthread_attr_init(&handler_attribute); pthread_attr_setdetachstate(&handler_attribute, PTHREAD_CREATE_DETACHED); pthread_mutex_lock(&global_lock); netcam->threadnr = ++threads_running; pthread_mutex_unlock(&global_lock); retval = pthread_create(&netcam->thread_id, &handler_attribute,&netcam_handler_loop, netcam); if (retval < 0) { MOTION_LOG(ALR, TYPE_NETCAM, SHOW_ERRNO ,_("Error starting camera handler thread [%d]"), netcam->threadnr); return -1; } return 0; } /** * netcam_recv * * This routine receives the next block from the netcam. It takes care * of the potential timeouts and interrupt which may occur because of * the settings from setsockopt. * * Parameters: * * netcam Pointer to a netcam context * buffptr Pointer to the receive buffer * buffsize Length of the buffer * * Returns: * If successful, the length of the message received, otherwise the * error reply from the system call. * */ ssize_t netcam_recv(netcam_context_ptr netcam, void *buffptr, size_t buffsize) { ssize_t retval; fd_set fd_r; struct timeval selecttime; if (netcam->sock < 0) { return -1; /* We are not connected, it's impossible to receive data. */ } FD_ZERO(&fd_r); FD_SET(netcam->sock, &fd_r); selecttime = netcam->timeout; retval = select(FD_SETSIZE, &fd_r, NULL, NULL, &selecttime); if (retval == 0) { /* 0 means timeout */ return -1; } return recv(netcam->sock, buffptr, buffsize, 0); } motion-release-4.6.0/src/netcam.h000066400000000000000000000254261452402535500166710ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * netcam.h * * Headers associated with functions in the netcam.c module. * This code was inspired by the original netcam.c module * written by Jeroen Vreeken and enhanced by several Motion * project contributors, particularly Angel Carpintero and * Christopher Price. * Copyright 2005, William M. Brack */ #ifndef _INCLUDE_NETCAM_H #define _INCLUDE_NETCAM_H /* This is a workaround regarding these defines. The config.h file defines * HAVE_STDLIB_H as 1 whereas the jpeglib.h just defines it without a value. * this causes massive warnings/error on mis-matched definitions. We do not * control either of these so we have to suffer through this workaround hack */ #if (HAVE_STDLIB_H == 1) #undef HAVE_STDLIB_H #define HAVE_STDLIB_H_ORIG 1 #endif #include #ifdef HAVE_STDLIB_H #ifdef HAVE_STDLIB_H_ORIG #undef HAVE_STDLIB_H #undef HAVE_STDLIB_H_ORIG #define HAVE_STDLIB_H 1 #else #undef HAVE_STDLIB_H #endif #endif #include #include #include typedef struct netcam_context *netcam_context_ptr; #include "netcam_wget.h" #include "netcam_jpeg.h" #define NETCAM_BUFFSIZE 4096 /* Initial size reserved for a JPEG image. If expansion is required, this value is also used for the amount to increase. */ /* * Error return codes for netcam routines. The values are "bit * significant". All error returns will return bit 1 set to indicate * these are "netcam errors"; additional bits set will give more detail * as to what kind of error it was. * Bit 0 is reserved for V4L type errors. * */ #define NETCAM_GENERAL_ERROR 0x02 /* binary 000010 */ #define NETCAM_NOTHING_NEW_ERROR 0x06 /* binary 000110 */ #define NETCAM_JPEG_CONV_ERROR 0x0a /* binary 001010 */ #define NETCAM_RESTART_ERROR 0x12 /* binary 010010 */ #define NETCAM_FATAL_ERROR -2 #define NCS_UNSUPPORTED 0 /* streaming is not supported */ #define NCS_MULTIPART 1 /* streaming is done via multipart */ #define NCS_BLOCK 2 /* streaming is done via MJPG-block */ /* * struct url_t is used when parsing the user-supplied URL, as well as * when attempting to connect to the netcam. */ struct url_t { char *service; char *userpass; char *host; int port; char *path; }; /* * We use a special "triple-buffer" technique. There are * three separate buffers (latest, receiving and jpegbuf) * which are each described using a struct netcam_image_buff */ typedef struct netcam_image_buff { char *ptr; int content_length; size_t size; /* total allocated size */ size_t used; /* bytes already used */ struct timeval image_time; /* time this image was received */ } netcam_buff; typedef netcam_buff *netcam_buff_ptr; extern struct netcam_caps { /* netcam capabilities: */ unsigned char streaming; /* See the NCS_* defines */ unsigned char content_length; /* 0 - unsupported */ } caps; /* * struct netcam_context contains all the structures and other data * for an individual netcam. */ typedef struct netcam_context { struct context *cnt; /* pointer to parent motion context structure */ struct params_context *parameters; /* User specified parameters for the camera */ int haveproxy; /* bool for whether there is a proxy */ int finish; /* flag to break the camera- handling thread out of it's infinite loop in emergency */ int threadnr; /* motion's thread number for the camera-handling thread (if required). Used for error reporting */ pthread_t thread_id; /* thread i.d. for a camera-handling thread (if required). */ pthread_mutex_t mutex; /* mutex used with conditional waits */ pthread_cond_t exiting; /* signal for exiting thread */ pthread_cond_t cap_cond; /* pthread condition structure to initiate next capture request (used only with non-streaming cameras */ pthread_cond_t pic_ready; /* pthread condition structure used for synchronisation between the camera handler and the motion main loop, showing new frame is ready */ int start_capture; /* besides our signalling condition, we also keep a flag to assure the camera-handler will always start a new cycle as soon as possible, even if it's not currently waiting on the condition. */ char *connect_host; /* the host to connect to (may be either the camera host, or possibly a proxy) */ int connect_port; /* usually will be 80, but can be specified as something else by the user */ int connect_http_10; /* set to TRUE if HTTP 1.0 connection (netcam_keepalive off) */ int connect_http_11; /* set to TRUE if HTTP 1.1 connection (netcam_keepalive on) */ int connect_keepalive; /* set to TRUE if connection maintained after a request, otherwise FALSE to close down the socket each time (netcam_keealive force) */ int keepalive_thisconn; /* set to TRUE if cam has sent 'Keep-Alive' in this connection */ int keepalive_timeup; /* set to TRUE if it is time to close netcam's socket, and then re-open it with Keep-Alive set again. Even Keep-Alive netcams need a close/open sometimes. */ char *connect_request; /* contains the complete string required for connection to the camera */ int sock; /* fd for the camera's socket. Note that this value is also present within the struct rbuf *response. */ struct timeval timeout; /* The current timeout setting for the socket. */ struct rbuf *response; /* this structure (defined in the netcam_wget module) contains the context for an HTTP connection. Note that this structure includes a large buffer for the HTTP data */ struct ftp_context *ftp; /* this structure contains the context for FTP connection */ struct file_context *file; /* this structure contains the context for FILE connection */ int (*get_image)(netcam_context_ptr); /* Function to fetch the image from the netcam. It is initialised in netcam_setup depending upon whether the picture source is from an http server or from an ftp server */ struct netcam_caps caps; /* Type of camera */ char *boundary; /* 'boundary' string when used to separate mjpeg images */ size_t boundary_length; /* string length of the boundary string */ netcam_buff_ptr latest; /* This buffer contains the latest frame received from the camera */ netcam_buff_ptr receiving; /* This buffer is used for receiving data from the camera */ netcam_buff_ptr jpegbuf; /* This buffer is used for jpeg decompression */ int imgcnt; /* count for # of received jpegs */ int imgcnt_last; /* remember last count to check if a new image arrived */ int warning_count; /* simple count of number of warnings since last good frame was received */ int error_count; /* simple count of number of errors since last good frame was received */ unsigned int width; /* info for decompression */ unsigned int height; int JFIF_marker; /* Debug to know if JFIF was present or not */ unsigned int netcam_tolerant_check; /* For network cameras with buggy firmwares */ struct timeval last_image; /* time the most recent image was received */ float av_frame_time; /* "running average" of time between successive frames (microseconds) */ struct jpeg_error_mgr jerr; jmp_buf setjmp_buffer; int jpeg_error; /* flag to show error or warning occurred during decompression*/ int handler_finished; } netcam_context; int netcam_start(struct context *cnt); int netcam_next(struct context *cnt, struct image_data *img_data); void netcam_cleanup(netcam_context_ptr netcam, int init_retry_flag); void netcam_url_parse(struct url_t *parse_url, const char *text_url); void netcam_url_free(struct url_t *parse_url); ssize_t netcam_recv(netcam_context_ptr netcam, void *buffptr, size_t buffsize); /** * Publish new image * * Moves the image in 'receiving' into 'latest' and updates last frame time */ void netcam_image_read_complete(netcam_context_ptr netcam); /** * This routine checks whether there is enough room in a buffer to copy * some additional data. If there is not enough room, it will re-allocate * the buffer and adjust it's size. * * Parameters: * buff Pointer to a netcam_image_buffer structure. * numbytes The number of bytes to be copied. * * Returns: Nothing */ void netcam_check_buffsize(netcam_buff_ptr buff, size_t numbytes); #endif motion-release-4.6.0/src/netcam_ftp.c000066400000000000000000000632251452402535500175340ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * Much of the FTP code was inspired by the nanoftp.c module from * libxml2 (Copyright Daniel Veillard, 2003). The routines have been * modified to fit the needs of the Motion project. * * Copyright 2005, William M. Brack * */ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include #include #include #include "netcam.h" #include "netcam_ftp.h" /** * ftp_new_context * * Create a new FTP context structure. * * Parameters * * None * * Returns: Pointer to the newly-created structure, NULL if error. * */ static ftp_context_pointer ftp_new_context(void) { ftp_context_pointer ret; /* Note that mymalloc will exit on any problem. */ ret = mymalloc(sizeof(ftp_context)); memset(ret, 0, sizeof(ftp_context)); ret->control_file_desc = -1; /* No control connection yet. */ ret->data_file_desc = -1; /* No data connection yet. */ return ret; } /** * ftp_free_context * * Free the resources allocated for this context. * * Parameters * * ctxt Pointer to the ftp_context structure. * * Returns: Nothing * */ static void ftp_free_context(ftp_context_pointer ctxt) { if (ctxt == NULL) { return; } free(ctxt->path); free(ctxt->user); free(ctxt->passwd); if (ctxt->control_file_desc >= 0) { close(ctxt->control_file_desc); } free(ctxt); } /** * ftp_parse_response * * Parses the answer from the server, extracting the numeric code. * * Parameters: * * buf the buffer containing the response. * len the buffer length. * * Returns: * 0 for errors * +XXX for last line of response * -XXX for response to be continued */ static int ftp_parse_response(char *buf, int len) { int val = 0; if (len < 3) { return -1; } if ((*buf >= '0') && (*buf <= '9')) { val = val * 10 + (*buf - '0'); } else { return 0; } buf++; if ((*buf >= '0') && (*buf <= '9')) { val = val * 10 + (*buf - '0'); } else { return 0; } buf++; if ((*buf >= '0') && (*buf <= '9')) { val = val * 10 + (*buf - '0'); } else { return 0; } buf++; if (*buf == '-') { return -val; } return val; } /** * ftp_get_more * * Read more information from the FTP control connection. * * Parameters: * * ctxt pointer to an FTP context. * * Returns the number of bytes read, < 0 indicates an error */ static int ftp_get_more(ftp_context_pointer ctxt) { int len; int size; /* Validate that our context structure is valid. */ if ((ctxt == NULL) || (ctxt->control_file_desc < 0)) { return -1; } if ((ctxt->control_buffer_index < 0) || (ctxt->control_buffer_index > FTP_BUF_SIZE)) { return -1; } if ((ctxt->control_buffer_used < 0) || (ctxt->control_buffer_used > FTP_BUF_SIZE)) { return -1; } if (ctxt->control_buffer_index > ctxt->control_buffer_used) { return -1; } /* First pack the control buffer. */ if (ctxt->control_buffer_index > 0) { memmove(&ctxt->control_buffer[0], &ctxt->control_buffer[ctxt->control_buffer_index], ctxt->control_buffer_used - ctxt->control_buffer_index); ctxt->control_buffer_used -= ctxt->control_buffer_index; ctxt->control_buffer_index = 0; } size = FTP_BUF_SIZE - ctxt->control_buffer_used; if (size == 0) { return 0; } /* Read the amount left on the control connection. */ if ((len = recv(ctxt->control_file_desc, &ctxt->control_buffer[ctxt->control_buffer_index], size, 0)) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, _("recv failed in ftp_get_more")); close(ctxt->control_file_desc); ctxt->control_file_desc = -1; return -1; } ctxt->control_buffer_used += len; ctxt->control_buffer[ctxt->control_buffer_used] = 0; return len; } /** * ftp_get_response * * Read the response from the FTP server after a command. * * Parameters * * ctxt pointer to an FTP context * * Returns the code number */ static int ftp_get_response(ftp_context_pointer ctxt) { char *ptr, *end; int len; int res = -1, cur = -1; if ((ctxt == NULL) || (ctxt->control_file_desc < 0)) { return -1; } get_more: /* * Assumes everything up to control_buffer[control_buffer_index] * has been read and analyzed. */ len = ftp_get_more(ctxt); if (len < 0) { return -1; } if ((ctxt->control_buffer_used == 0) && (len == 0)) { return -1; } ptr = &ctxt->control_buffer[ctxt->control_buffer_index]; end = &ctxt->control_buffer[ctxt->control_buffer_used]; while (ptr < end) { cur = ftp_parse_response(ptr, end - ptr); if (cur > 0) { /* * Successfully scanned the control code, skip * till the end of the line, but keep the index to be * able to analyze the result if needed. */ res = cur; ptr += 3; ctxt->control_buffer_answer = ptr - ctxt->control_buffer; while ((ptr < end) && (*ptr != '\n')) { ptr++; } if (*ptr == '\n') { ptr++; } if (*ptr == '\r') { ptr++; } break; } while ((ptr < end) && (*ptr != '\n')) { ptr++; } if (ptr >= end) { ctxt->control_buffer_index = ctxt->control_buffer_used; goto get_more; } if (*ptr != '\r') { ptr++; } } if (res < 0) { goto get_more; } ctxt->control_buffer_index = ptr - ctxt->control_buffer; MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("Server Response: %s"),ctxt->control_buffer); return (res / 100); } /** * ftp_send_user * Sends the user authentication. */ static int ftp_send_user(ftp_context_pointer ctxt) { char buf[200]; int len; int res; if (ctxt->user == NULL) { snprintf(buf, sizeof(buf), "USER anonymous\r\n"); } else { snprintf(buf, sizeof(buf), "USER %s\r\n", ctxt->user); } buf[sizeof(buf) - 1] = 0; len = strlen(buf); res = send(ctxt->control_file_desc, buf, len, 0); if (res < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("send failed in ftp_send_user")); return res; } return 0; } /** * ftp_send_passwd * Sends the password authentication. */ static int ftp_send_passwd(ftp_context_pointer ctxt) { char buf[200]; int len; int res; if (ctxt->passwd == NULL) { snprintf(buf, sizeof(buf), "PASS anonymous@\r\n"); } else { snprintf(buf, sizeof(buf), "PASS %s\r\n", ctxt->passwd); } buf[sizeof(buf) - 1] = 0; len = strlen(buf); res = send(ctxt->control_file_desc, buf, len, 0); if (res < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("send failed in ftp_send_passwd")); return res; } return 0; } /** * ftp_quit * * Send a QUIT command to the server * * Parameters: * * ctxt pointer to an FTP context * * Returns -1 in case of error, 0 otherwise */ static int ftp_quit(ftp_context_pointer ctxt) { char buf[200]; int len, res; if ((ctxt == NULL) || (ctxt->control_file_desc < 0)) { return -1; } snprintf(buf, sizeof(buf), "QUIT\r\n"); len = strlen(buf); res = send(ctxt->control_file_desc, buf, len, 0); if (res < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, _("send failed in ftp_quit")); return res; } return 0; } /** * ftp_connect * * Tries to open a control connection. * * Parameters: * * ctxt an FTP context * * Returns -1 in case of error, 0 otherwise. */ int ftp_connect(netcam_context_ptr netcam) { ftp_context_pointer ctxt; struct hostent *hp; int port; int res; int addrlen = sizeof (struct sockaddr_in); if (netcam == NULL) { return -1; } ctxt = netcam->ftp; if (ctxt == NULL) { return -1; } if (netcam->connect_host == NULL) { return -1; } /* Do the blocking DNS query. */ port = netcam->connect_port; if (port == 0) { port = 21; } memset (&ctxt->ftp_address, 0, sizeof(ctxt->ftp_address)); hp = gethostbyname (netcam->connect_host); if (hp == NULL) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("gethostbyname failed in ftp_connect")); return -1; } if ((unsigned int) hp->h_length > sizeof(((struct sockaddr_in *)&ctxt->ftp_address)->sin_addr)) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO ,_("gethostbyname address mismatch in ftp_connect")); return -1; } /* Prepare the socket */ ((struct sockaddr_in *)&ctxt->ftp_address)->sin_family = AF_INET; memcpy (&((struct sockaddr_in *)&ctxt->ftp_address)->sin_addr, hp->h_addr_list[0], hp->h_length); ((struct sockaddr_in *)&ctxt->ftp_address)->sin_port = (u_short)htons ((unsigned short)port); ctxt->control_file_desc = socket (AF_INET, SOCK_STREAM, 0); addrlen = sizeof (struct sockaddr_in); if (ctxt->control_file_desc < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, _("socket failed")); return -1; } /* Do the connect. */ if (connect(ctxt->control_file_desc, (struct sockaddr *) &ctxt->ftp_address, addrlen) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, _("Failed to create a connection")); close(ctxt->control_file_desc); ctxt->control_file_desc = -1; return -1; } /* Wait for the HELLO from the server. */ res = ftp_get_response(ctxt); if (res != 2) { close(ctxt->control_file_desc); ctxt->control_file_desc = -1; return -1; } /* Do the authentication */ res = ftp_send_user(ctxt); if (res < 0) { close(ctxt->control_file_desc); ctxt->control_file_desc = -1; return -1; } res = ftp_get_response(ctxt); /*The FALLTHROUGH is a special comment required by compiler. Do not edit it*/ /*FIXME: Refactor this switch....*/ switch (res) { case 2: return 0; case 3: break; case 1: /*FALLTHROUGH*/ case 4: /*FALLTHROUGH*/ case 5: /*FALLTHROUGH*/ case -1: /*FALLTHROUGH*/ default: close(ctxt->control_file_desc); ctxt->control_file_desc = -1; return -1; } res = ftp_send_passwd(ctxt); if (res < 0) { close(ctxt->control_file_desc); ctxt->control_file_desc = -1; return -1; } res = ftp_get_response(ctxt); switch (res) { case 2: break; case 3: MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO,_("FTP server asking for ACCT on anonymous")); /*FALLTHROUGH*/ case 1: /*FALLTHROUGH*/ case 4: /*FALLTHROUGH*/ case 5: /*FALLTHROUGH*/ case -1: /*FALLTHROUGH*/ default: close(ctxt->control_file_desc); ctxt->control_file_desc = -1; ctxt->control_file_desc = -1; return-1; } return 0; } /** * ftp_get_connection * * Try to open a data connection to the server. * * Parameters: * * ctxt pointer to an FTP context. * * Returns -1 in case of error, 0 otherwise */ static int ftp_get_connection(ftp_context_pointer ctxt) { char buf[200], *cur; int len, i; int res; int on; unsigned char ad[6], *adp, *portp; unsigned int temp[6]; struct sockaddr_in data_address; unsigned int data_address_length; if (ctxt == NULL) { return -1; } /* Set up a socket for our data address. */ if (ctxt->data_file_desc != -1) { close(ctxt->data_file_desc); } memset (&data_address, 0, sizeof(data_address)); ctxt->data_file_desc = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); if (ctxt->data_file_desc < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("socket failed")); return -1; } on = 1; if (setsockopt(ctxt->data_file_desc, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("setting socket option SO_REUSEADDR")); return -1; } ((struct sockaddr_in *)&data_address)->sin_family = AF_INET; data_address_length = sizeof (struct sockaddr_in); if (ctxt->passive) { /* Send PASV command over control channel. */ snprintf (buf, sizeof(buf), "PASV\r\n"); len = strlen (buf); res = send(ctxt->control_file_desc, buf, len, 0); if (res < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("send failed in ftp_get_connection")); close(ctxt->data_file_desc); ctxt->data_file_desc = -1; return res; } /* Check server's answer */ res = ftp_get_response(ctxt); if (res != 2) { if (res == 5) { close(ctxt->data_file_desc); ctxt->data_file_desc = -1; return -1; } else { /* Retry with an active connection. */ close(ctxt->data_file_desc); ctxt->data_file_desc = -1; ctxt->passive = 0; } } /* Parse the IP address and port supplied by the server. */ cur = &ctxt->control_buffer[ctxt->control_buffer_answer]; while (((*cur < '0') || (*cur > '9')) && *cur != '\0') { cur++; } if (sscanf(cur, "%u,%u,%u,%u,%u,%u", &temp[0], &temp[1], &temp[2], &temp[3], &temp[4], &temp[5]) != 6) { MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO,_("Invalid answer to PASV")); if (ctxt->data_file_desc != -1) { close (ctxt->data_file_desc); ctxt->data_file_desc = -1; } return -1; } for (i = 0; i < 6; i++) { ad[i] = (unsigned char) (temp[i] & 0xff) ; } memcpy (&((struct sockaddr_in *)&data_address)->sin_addr, &ad[0], 4); memcpy (&((struct sockaddr_in *)&data_address)->sin_port, &ad[4], 2); /* Now try to connect to the data port. */ if (connect(ctxt->data_file_desc, (struct sockaddr *) &data_address, data_address_length) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("Failed to create a data connection")); close(ctxt->data_file_desc); ctxt->data_file_desc = -1; return -1; } } else { /* * We want to bind to a port to receive the data. To do this, * we need the address of our host. One easy way to get it is * to get the info from the control connection that we have * with the remote server. */ getsockname(ctxt->control_file_desc, (struct sockaddr *)&data_address, &data_address_length); ((struct sockaddr_in *)&data_address)->sin_port = 0; /* Bind to the socket - should give us a unique port. */ if (bind(ctxt->data_file_desc, (struct sockaddr *) &data_address, data_address_length) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("bind failed")); close(ctxt->data_file_desc); ctxt->data_file_desc = -1; return -1; } /* We get the port number by reading back in the sockaddr. */ getsockname(ctxt->data_file_desc, (struct sockaddr *)&data_address, &data_address_length); /* Set up a 'listen' on the port to get the server's connection. */ if (listen(ctxt->data_file_desc, 1) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("listen failed")); close(ctxt->data_file_desc); ctxt->data_file_desc = -1; return -1; } /* Now generate the PORT command. */ adp = (unsigned char *) &((struct sockaddr_in *)&data_address)->sin_addr; portp = (unsigned char *) &((struct sockaddr_in *)&data_address)->sin_port; snprintf(buf, sizeof(buf), "PORT %d,%d,%d,%d,%d,%d\r\n", adp[0] & 0xff, adp[1] & 0xff, adp[2] & 0xff, adp[3] & 0xff, portp[0] & 0xff, portp[1] & 0xff); buf[sizeof(buf) - 1] = 0; len = strlen(buf); /* Send the PORT command to the server. */ res = send(ctxt->control_file_desc, buf, len, 0); if (res < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("send failed in ftp_get_connection")); close(ctxt->data_file_desc); ctxt->data_file_desc = -1; return res; } res = ftp_get_response(ctxt); if (res != 2) { close(ctxt->data_file_desc); ctxt->data_file_desc = -1; return -1; } } return ctxt->data_file_desc; } /** * ftp_close_connection * * Close the data connection from the server. * * Parameters: * * ctxt Pointer to an FTP context. * * Returns -1 in case of error, 0 otherwise */ static int ftp_close_connection(ftp_context_pointer ctxt) { int res; fd_set rfd, efd; struct timeval tv; if ((ctxt == NULL) || (ctxt->control_file_desc < 0)) { return -1; } close(ctxt->data_file_desc); ctxt->data_file_desc = -1; /* Check for data on the control channel. */ tv.tv_sec = 15; tv.tv_usec = 0; FD_ZERO(&rfd); FD_SET(ctxt->control_file_desc, &rfd); FD_ZERO(&efd); FD_SET(ctxt->control_file_desc, &efd); res = select(ctxt->control_file_desc + 1, &rfd, NULL, &efd, &tv); if (res < 0) { close(ctxt->control_file_desc); ctxt->control_file_desc = -1; return -1; } if (res == 0) { /* Timeout */ close(ctxt->control_file_desc); ctxt->control_file_desc = -1; } else { /* Read the response */ res = ftp_get_response(ctxt); if (res != 2) { /* Should be positive completion (2) */ close(ctxt->control_file_desc); ctxt->control_file_desc = -1; return -1; } } return 0; } /** * ftp_get_socket * * Initiate fetch of the given file from the server. * * Parameters: * * ctxt an FTP context * * Returns the socket for the data connection, or <0 in case of error */ static int ftp_get_socket(ftp_context_pointer ctxt) { char buf[300]; int res, len; int acfd; if ((ctxt == NULL) || (ctxt->path == NULL)) { return -1; } /* Set up the data connection. */ ctxt->data_file_desc = ftp_get_connection(ctxt); if (ctxt->data_file_desc == -1) { return -1; } /* Generate a "retrieve" command for the file. */ snprintf(buf, sizeof(buf), "RETR %s\r\n", ctxt->path); buf[sizeof(buf) - 1] = 0; len = strlen(buf); /* Send it to the server. */ res = send(ctxt->control_file_desc, buf, len, 0); if (res < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("send failed in ftp_get_socket")); close(ctxt->data_file_desc); ctxt->data_file_desc = -1; return res; } /* Check the answer */ res = ftp_get_response(ctxt); if (res != 1) { close(ctxt->data_file_desc); ctxt->data_file_desc = -1; return -res; } /* * If not a passive connection, need to do an accept to get the * connection from the server. */ if (!ctxt->passive) { struct sockaddr_in data_address; unsigned int data_address_length = sizeof(struct sockaddr_in); if ((acfd = accept(ctxt->data_file_desc, (struct sockaddr *)&data_address, &data_address_length)) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("accept in ftp_get_socket")); close(ctxt->data_file_desc); ctxt->data_file_desc = -1; return -1; } close(ctxt->data_file_desc); ctxt->data_file_desc = acfd; } return ctxt->data_file_desc; } /** * ftp_send_type * * Send a TYPE (either 'I' or 'A') command to the server. * * Parameters * * ctxt pointer to the ftp_context * type ascii character ('I' or 'A') * * Returns 0 for success, negative error code for failure. * */ static int ftp_send_type(ftp_context_pointer ctxt, char type) { char buf[100], utype; int len, res; utype = toupper(type); snprintf(buf, sizeof(buf), "TYPE %c\r\n", utype); len = strlen(buf); res = send(ctxt->control_file_desc, buf, len, 0); if (res < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("send failed in ftp_get_socket")); close(ctxt->data_file_desc); ctxt->data_file_desc = -1; return res; } res = ftp_get_response(ctxt); if (res != 2) { close(ctxt->data_file_desc); ctxt->data_file_desc = -1; return -res; } return 0; } /** * ftp_read * * This function tries to read len bytes from the existing FTP * connection and saves them in dest. This is a blocking call. * * Parameters: * ctxt the FTP context * dest a buffer * len the buffer length * * Returns: the number of bytes read. * 0 is an indication of an end of connection. * -1 indicates a parameter error. */ static int ftp_read(ftp_context_pointer ctxt, void *dest, int len) { if (ctxt == NULL) { return -1; } if (ctxt->data_file_desc < 0) { return 0; } if (dest == NULL) { return -1; } if (len <= 0) { return 0; } len = recv(ctxt->data_file_desc, dest, len, 0); if (len <= 0) { if (len < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("recv failed in ftp_read")); } ftp_close_connection(ctxt); } return len; } /** * ftp_close * * Close the connection and both control and transport. * * Parameters: * * ctxt Pointer to an FTP context. * * Returns -1 in case of error, 0 otherwise. */ int ftp_close(ftp_context_pointer ctxt) { if (ctxt == NULL) { return -1; } if (ctxt->data_file_desc >= 0) { close(ctxt->data_file_desc); ctxt->data_file_desc = -1; } if (ctxt->control_file_desc >= 0) { ftp_quit(ctxt); close(ctxt->control_file_desc); ctxt->control_file_desc = -1; } ftp_free_context(ctxt); return 0; } /** * netcam_read_ftp_jpeg * * This routine reads from a netcam using the FTP protocol. * The current implementation is still a little experimental, * and needs some additional code for error detection and * recovery. */ static int netcam_read_ftp_jpeg(netcam_context_ptr netcam) { netcam_buff_ptr buffer; int len; /* Point to our working buffer. */ buffer = netcam->receiving; buffer->used = 0; /* Request the image from the remote server. */ if (ftp_get_socket(netcam->ftp) <= 0) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("ftp_get_socket failed")); return -1; } /* Now fetch the image using ftp_read. Note this is a blocking call. */ do { /* Assure there's enough room in the buffer. */ netcam_check_buffsize(buffer, FTP_BUF_SIZE); /* Do the read */ if ((len = ftp_read(netcam->ftp, buffer->ptr + buffer->used, FTP_BUF_SIZE)) < 0) { return -1; } buffer->used += len; } while (len > 0); netcam_image_read_complete(netcam); return 0; } int netcam_setup_ftp(netcam_context_ptr netcam, struct url_t *url) { struct context *cnt = netcam->cnt; const char *ptr; if ((netcam->ftp = ftp_new_context()) == NULL) { return -1; } /* * We copy the strings out of the url structure into the ftp_context * structure. By setting url->{string} to NULL we effectively "take * ownership" of the string away from the URL (i.e. it won't be freed * when we cleanup the url structure later). */ if (mystrne(url->path,"/")) { netcam->ftp->path = mystrdup(url->path + 1); } else { netcam->ftp->path = mystrdup(url->path); } url->path = NULL; if (cnt->conf.netcam_userpass != NULL) { ptr = cnt->conf.netcam_userpass; } else { ptr = url->userpass; /* Don't set this one NULL, gets freed. */ } if (ptr != NULL) { char *cptr; if ((cptr = strchr(ptr, ':')) == NULL) { netcam->ftp->user = mystrdup(ptr); } else { netcam->ftp->user = mymalloc((cptr - ptr)); memcpy(netcam->ftp->user, ptr,(cptr - ptr)); netcam->ftp->passwd = mystrdup(cptr + 1); } } netcam_url_free(url); /* * The ftp context should be all ready to attempt a connection with * the server, so we try .... */ if (ftp_connect(netcam) < 0) { ftp_free_context(netcam->ftp); netcam->ftp = NULL; return -1; } if (ftp_send_type(netcam->ftp, 'I') < 0) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Error sending TYPE I to ftp server")); return -1; } netcam->get_image = netcam_read_ftp_jpeg; return 0; } motion-release-4.6.0/src/netcam_ftp.h000066400000000000000000000042261452402535500175350ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * netcam_ftp.h * Headers associated with functions in the netcam_ftp.c module. * Much of the FTP routines was inspired by the nanoftp.c module from * libxml2 (Copyright Daniel Veillard, 2003). The routines have been * modified to fit the needs of the Motion project. * Copyright 2005, William M. Brack */ #ifndef _INCLUDE_NETCAM_FTP_H #define _INCLUDE_NETCAM_FTP_H #define FTP_BUF_SIZE 1024 typedef struct ftp_context { char *path; /* the path within the URL */ char *user; /* user string */ char *passwd; /* passwd string */ struct sockaddr_in ftp_address; /* the socket addr structure */ int passive; /* flag show passive/active mode used */ int control_file_desc; /* file descriptor for the control socket */ int data_file_desc; /* file descriptor for the data socket */ int state; /* WRITE / READ / CLOSED */ int returnValue; /* the protocol return value */ /* buffer for data received from the control connection */ char control_buffer[FTP_BUF_SIZE + 1]; int control_buffer_index; int control_buffer_used; int control_buffer_answer; } ftp_context, *ftp_context_pointer; /* The public interface */ int ftp_close(ftp_context_pointer ctxt); int ftp_connect(netcam_context_ptr netcam); int netcam_setup_ftp(netcam_context_ptr netcam, struct url_t *url); #endif motion-release-4.6.0/src/netcam_http.c000066400000000000000000001761241452402535500177250ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /*********************************************************** * netcam_http.c * Process network camera images using http protocol * This code was inspired by the original netcam.c module * written by Jeroen Vreeken and enhanced by several Motion * project contributors, particularly Angel Carpintero and * Christopher Price. * * Copyright 2005, William M. Brack ***********************************************************/ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include "netcam.h" #include "netcam_http.h" #define CONNECT_TIMEOUT 10 /* Timeout on remote connection attempt */ #define READ_TIMEOUT 5 /* Default timeout on recv requests */ #define POLLING_TIMEOUT READ_TIMEOUT /* File polling timeout [s] */ #define POLLING_TIME 500*1000*1000 /* File polling time quantum [ns] (500ms) */ #define MAX_HEADER_RETRIES 5 /* Max tries to find a header record */ #define MINVAL(x, y) ((x) < (y) ? (x) : (y)) /* These strings are used for the HTTP connection. */ static const char *connect_req; #define connect_req_http10 "GET %s HTTP/1.0\r\n" \ "Host: %s\r\n" \ "User-Agent: Motion-netcam/" VERSION "\r\n" #define connect_req_http11 "GET %s HTTP/1.1\r\n" \ "Host: %s\r\n" \ "User-Agent: Motion-netcam/" VERSION "\r\n" #define connect_req_close "Connection: close\r\n" #define connect_req_keepalive "Connection: Keep-Alive\r\n" #define connect_auth_req "Authorization: Basic %s\r\n" tfile_context *file_new_context(void); void file_free_context(tfile_context* ctxt); /** * check_quote * * Checks a string to see if it's quoted, and if so removes the * quotes. * * Parameters: * * str Pointer to a string. * * Returns: Nothing, but updates the target if necessary. * */ static void check_quote(char *str) { int len; char ch; ch = *str; if ((ch == '"') || (ch == '\'')) { len = strlen(str) - 1; if (str[len] == ch) { memmove(str, str+1, len-1); str[len-1] = 0; } } } /** * netcam_check_content_length * * Analyse an HTTP-header line to see if it is a Content-length. * * Parameters: * * header Pointer to a string containing the header line. * * Returns: * -1 Not a Content-length line. * >=0 Value of Content-length field. * */ static long netcam_check_content_length(char *header) { long length = -1; /* Note this is a long, not an int. */ if (!header_process(header, "Content-Length", header_extract_number, &length)) { /* * Some netcams deliver some bad-format data, but if * we were able to recognize the header section and the * number we might as well try to use it. */ if (length > 0) { MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO ,_("malformed token Content-Length but value %ld"), length); } } MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("Content-Length %ld"), length); return length; } /** * netcam_check_keepalive * * Analyse an HTTP-header line to see if it is a Keep-Alive. * * Parameters: * * header Pointer to a string containing the header line. * * Returns: * -1 Not a Keep-Alive line. * 1 Is a Keep-Alive line. * */ static int netcam_check_keepalive(char *header) { char *content_type = NULL; if (!header_process(header, "Keep-Alive", http_process_type, &content_type)) { return -1; } /* We do not detect the second field or other case mixes at present. */ free(content_type); return 1; } /** * netcam_check_close * * Analyse an HTTP-header line to see if it is a Connection: close. * * Parameters: * * header Pointer to a string containing the header line. * * Returns: * -1 Not a Connection: close. * 1 Is a Connection: close. * */ static int netcam_check_close(char *header) { char *type = NULL; int ret = -1; if (!header_process(header, "Connection", http_process_type, &type)) { return -1; } if (mystreq(type, "close")) { ret = 1; } free(type); return ret; } /** * netcam_check_content_type * * Analyse an HTTP-header line to see if it is a Content-type. * * Parameters: * * header Pointer to a string containing the header line. * * Returns: * -1 Not a Content-type line * 0 Content-type not recognized * 1 image/jpeg * 2 multipart/x-mixed-replace or multipart/mixed * 3 application/octet-stream (used by WVC200 Linksys IP Camera) * */ static int netcam_check_content_type(char *header) { char *content_type = NULL; int ret; if (!header_process(header, "Content-type", http_process_type, &content_type)) { return -1; } MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("Content-type %s"), content_type); if (mystreq(content_type, "image/jpeg")) { ret = 1; } else if (mystreq(content_type, "multipart/x-mixed-replace") || mystreq(content_type, "multipart/mixed")) { ret = 2; } else if (mystreq(content_type, "application/octet-stream")) { ret = 3; } else { ret = 0; } free(content_type); return ret; } /** * netcam_read_next_header * * Read the next header record from the camera. * * Parameters * * netcam pointer to a netcam_context. * * Returns: 0 for success, -1 if any error. * */ int netcam_read_next_header(netcam_context_ptr netcam) { int retval; char *header; /* Return if not connected */ if (netcam->sock == -1) { return -1; } /* * We are expecting a header which *must* contain a mime-type of * image/jpeg, and *might* contain a Content-Length. * * If this is a "streaming" camera, the header *must* be preceded * by a "boundary" string. * */ netcam->caps.content_length = 0; /* * If this is a "streaming" camera, the stream header must be * preceded by a "boundary" string. */ if (netcam->caps.streaming == NCS_MULTIPART) { while (1) { retval = header_get(netcam, &header, HG_NONE); if (retval != HG_OK) { /* Header reported as not-OK, check to see if it's null. */ if (strlen(header) == 0) { MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO ,_("Error reading image header, streaming mode (1). Null header.")); } else { /* Header is not null. Output it in case it's a new camera with unknown headers. */ MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO ,_("Error reading image header, streaming mode (1). Unknown header '%s'") ,header); } free(header); return -1; } retval = (strstr(header, netcam->boundary) == NULL); free(header); if (!retval) { break; } } } while (1) { retval = header_get(netcam, &header, HG_NONE); if (retval != HG_OK) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("Error reading image header (2)")); free(header); return -1; } if (*header == 0) { break; } if ((retval = netcam_check_content_type(header)) >= 0) { if (retval != 1) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("Header not JPEG")); free(header); return -1; } } if ((retval = (int) netcam_check_content_length(header)) >= 0) { if (retval > 0) { netcam->caps.content_length = 1; /* Set flag */ netcam->receiving->content_length = retval; } else { netcam->receiving->content_length = 0; MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("Content-Length 0")); free(header); return -1; } } free(header); } MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("Found image header record")); free(header); return 0; } /** * netcam_read_first_header * * This routine attempts to read a header record from the netcam. If * successful, it analyses the header to determine whether the camera is * a "streaming" type. If it is, the routine looks for the Boundary-string; * if found, it positions just past the string so that the image header can * be read. It then reads the image header and continues processing that * header as well. * * If the camera does not appear to be a streaming type, it is assumed that the * header just read was the image header. It is processed to determine whether * a Content-length is present. * * After this processing, the routine returns to the caller. * * Parameters: * netcam Pointer to the netcam_context structure. * * Returns: Content-type code if successful, -1 if not * -2 if Content-length = 0 */ int netcam_read_first_header(netcam_context_ptr netcam) { int retval = -3; /* "Unknown err" */ int ret; int firstflag = 1; int aliveflag = 0; /* If we have seen a Keep-Alive header from cam. */ int closeflag = 0; /* If we have seen a Connection: close header from cam. */ char *header; char *boundary; /* Send the initial command to the camera. */ if (send(netcam->sock, netcam->connect_request, strlen(netcam->connect_request), 0) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO ,_("Error sending 'connect' request")); return -1; } /* * We expect to get back an HTTP header from the camera. * Successive calls to header_get will return each line * of the header received. We will continue reading until * a blank line is received. * * As we process the header, we are looking for either of * header lines Content-type or Content-length. Content-type * is used to determine whether the camera is "streaming" or * "non-streaming", and Content-length will be used to determine * whether future reads of images will be controlled by the * length specified before the image, or by a boundary string. * * The Content-length will only be present "just before" an * image is sent (if it is present at all). That means that, if * this is a "streaming" camera, it will not be present in the * "first header", but will occur later (after a boundary-string). * For a non-streaming camera, however, there is no boundary-string, * and the first header is, in fact, the only header. In this case, * there may be a Content-length. * */ while (1) { /* 'Do forever' */ ret = header_get(netcam, &header, HG_NONE); MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("Received first header ('%s')"), header); if (ret != HG_OK) { MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO ,_("Error reading first header (%s)"), header); free(header); return -1; } if (firstflag) { if ((ret = http_result_code(header)) != 200) { MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("HTTP Result code %d"), ret); free(header); if (netcam->connect_keepalive) { /* * Cannot unset netcam->cnt->conf.netcam_keepalive as it is assigned const * But we do unset the netcam keepalive flag which was set in netcam_start * This message is logged as Information as it would be useful to know * if your netcam often returns bad HTTP result codes. */ netcam->connect_keepalive = FALSE; MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("Removed netcam Keep-Alive flag " "due to apparent closed HTTP connection.")); } return ret; } firstflag = 0; free(header); continue; } if (*header == 0) { /* Blank line received */ break; } /* Check if this line is the content type. */ if ((ret = netcam_check_content_type(header)) >= 0) { retval = ret; /* * We are expecting to find one of three types: * 'multipart/x-mixed-replace', 'multipart/mixed' * or 'image/jpeg'. The first two will be received * from a streaming camera, and the third from a * camera which provides a single frame only. */ switch (ret) { case 1: /* Not streaming */ if (netcam->connect_keepalive) { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("Non-streaming camera (keep-alive set)")); } else { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("Non-streaming camera (keep-alive not set)")); } netcam->caps.streaming = NCS_UNSUPPORTED; break; case 2: /* Streaming */ MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("Streaming camera")); netcam->caps.streaming = NCS_MULTIPART; if ((boundary = strstr(header, "boundary="))) { /* On error recovery this may already be set. */ free(netcam->boundary); netcam->boundary = mystrdup(boundary + 9); /* * HTTP protocol apparently permits the boundary string * to be quoted (the Lumenera does this, which caused * trouble) so we need to get rid of any surrounding * quotes. */ check_quote(netcam->boundary); netcam->boundary_length = strlen(netcam->boundary); MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO ,_("Boundary string [%s]"), netcam->boundary); } else { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("Boundary string not found in header")); free(header); return -1; } break; case 3: /* MJPG-Block style streaming. */ MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("Streaming camera probably using MJPG-blocks," " consider using mjpg:// netcam_url.")); break; default: /* Error */ MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("Unrecognized content type")); free(header); return -1; } } else if ((ret = (int) netcam_check_content_length(header)) >= 0) { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO,_("Content-length present")); if (ret > 0) { netcam->caps.content_length = 1; /* Set flag */ netcam->receiving->content_length = ret; } else { netcam->receiving->content_length = 0; MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("Content-length 0")); retval = -2; } } else if (netcam_check_keepalive(header) == TRUE) { /* Note that we have received a Keep-Alive header, and thus the socket can be left open. */ aliveflag = TRUE; netcam->keepalive_thisconn = TRUE; /* * This flag will not be set when a Streaming cam is in use, but that * does not matter as the test below looks at Streaming state also. */ } else if (netcam_check_close(header) == TRUE) { /* Note that we have received a Connection: close header. */ closeflag = TRUE; /* * This flag is acted upon below. * Changed criterion and moved up from below to catch headers that cause returns. */ MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("Found Conn: close header ('%s')"), header); } free(header); } free(header); if (netcam->caps.streaming == NCS_UNSUPPORTED && netcam->connect_keepalive) { /* If we are a non-streaming (ie. Jpeg) netcam and keepalive is configured. */ if (aliveflag) { if (closeflag) { netcam->warning_count++; if (netcam->warning_count > 3) { netcam->warning_count = 0; MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Both 'Connection: Keep-Alive' and " "'Connection: close' header received. Motion removes keepalive.")); netcam->connect_keepalive = FALSE; } else { /* * If not a streaming cam, and keepalive is set, and the flag shows we * did not see a Keep-Alive field returned from netcam and a Close field. * Not quite sure what the correct course of action is here. In for testing. */ MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Both 'Connection: Keep-Alive' and " "'Connection: close' header received. Motion continues unchanged.")); } } else { /* * aliveflag && !closeflag * * If not a streaming cam, and keepalive is set, and the flag shows we * just got a Keep-Alive field returned from netcam and no Close field. * No action, as this is the normal case. In debug we print a notification. */ MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Received a Keep-Alive field in this set of headers.")); } } else { /* !aliveflag */ if (!closeflag) { netcam->warning_count++; if (netcam->warning_count > 3) { netcam->warning_count = 0; MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("No 'Connection: Keep-Alive' nor 'Connection: close'" " header received.\n Motion removes keepalive.")); netcam->connect_keepalive = FALSE; } else { /* * If not a streaming cam, and keepalive is set, and the flag shows we * did not see a Keep-Alive field returned from netcam nor a Close field. * Not quite sure what the correct course of action is here. In for testing. */ MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("No 'Connection: Keep-Alive' nor 'Connection: close'" " header received.\n Motion continues unchanged.")); } } else { /* * !aliveflag & closeflag * If not a streaming cam, and keepalive is set, and the flag shows we * received a 'Connection: close' field returned from netcam. It is not likely * we will get a Keep-Alive and Close header together - this is picked up by * the test code above. * If we receive a Close header, then we want to cease keep-alive for this cam. * This situation will occur in 2 situations: * (a) in HTTP 1.1 when the client wants to stop the keep-alive * (and in this case it would be correct to close connection and then * make a new one, with keep-alive set again). * (b) in HTTP 1.0 with keepalive, when the client does not support it. * In this case we should not attempt to re-start Keep-Alive. * Due to that, we accept a Connection: close header in HTTP 1.0 & 1.1 modes * * To tell between the sitation where a camera has been in Keep-Alive mode and * is now finishing (and will want to be re-started in Keep-Alive) and the other * case when a cam does not support it, we have a flag which says if the netcam * has returned a Keep-Alive flag during this connection. If that's set, we * set ourselves up to re-connect with Keep-Alive after the socket is closed. * If it's not set, then we will not try again to use Keep-Alive. */ if (!netcam->keepalive_thisconn) { netcam->connect_keepalive = FALSE; /* No further attempts at keep-alive */ MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Removed netcam Keep-Alive flag because" " 'Connection: close' header received.\n Netcam does not support " "Keep-Alive. Motion continues in non-Keep-Alive.")); } else { netcam->keepalive_timeup = TRUE; /* We will close and re-open keep-alive */ MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Keep-Alive has reached end of valid period.\n" "Motion will close netcam, then resume Keep-Alive with a new socket.")); } } } } return retval; } /** * netcam_disconnect * * Disconnect from the network camera. * * Parameters: * * netcam pointer to netcam context * * Returns: Nothing * */ void netcam_disconnect(netcam_context_ptr netcam) { if (netcam->sock > 0) { if (close(netcam->sock) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, _("disconnect")); } netcam->sock = -1; } } /** * netcam_connect * * Attempt to open the network camera as a stream device. * Keep-alive is supported, ie. if netcam->connect_keepalive is TRUE, we * re-use netcam->sock unless it has value -1, meaning it is invalid. * * Parameters: * * netcam pointer to netcam_context structure * err_flag flag to suppress error printout (1 => suppress) * Note that errors which indicate something other than * a network connection problem are not suppressed. * * Returns: 0 for success, -1 for error * */ int netcam_connect(netcam_context_ptr netcam, int err_flag) { struct addrinfo *ai; int ret; int saveflags; int back_err; int optval; socklen_t optlen = sizeof(optval); socklen_t len; fd_set fd_w; struct timeval selecttime; char port[15]; sprintf(port,"%u",netcam->connect_port); /* Lookup the hostname given in the netcam URL. */ if ((ret = getaddrinfo(netcam->connect_host, port, NULL, &ai)) != 0) { if (!err_flag) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("getaddrinfo() failed (%s): %s") ,netcam->connect_host, gai_strerror(ret)); } MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO,_("disconnecting netcam (1)")); netcam_disconnect(netcam); return -1; } /* Assure any previous connection has been closed - IF we are not in keepalive. */ if (!netcam->connect_keepalive) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("disconnecting netcam since keep-alive not set.")); netcam_disconnect(netcam); /* Create a new socket. */ if ((netcam->sock = socket(ai->ai_family, SOCK_STREAM, 0)) < 0) { MOTION_LOG(WRN, TYPE_NETCAM, SHOW_ERRNO ,_("with no keepalive, attempt to create socket failed.")); return -1; } MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("with no keepalive, new socket created fd %d"), netcam->sock); } else if (netcam->sock == -1) { /* We are in keepalive mode, check for invalid socket. */ /* Must be first time, or closed, create a new socket. */ if ((netcam->sock = socket(ai->ai_family, SOCK_STREAM, 0)) < 0) { MOTION_LOG(WRN, TYPE_NETCAM, SHOW_ERRNO ,_("with keepalive set, invalid socket." "This could be the first time. Creating a new one failed.")); return -1; } MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("with keepalive set, invalid socket." "This could be first time, created a new one with fd %d") ,netcam->sock); /* Record that this connection has not yet received a Keep-Alive header. */ netcam->keepalive_thisconn = FALSE; /* Check the socket status for the keepalive option. */ if (getsockopt(netcam->sock, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "getsockopt()"); return -1; } MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("SO_KEEPALIVE is %s") ,optval ? _("ON"):_("OFF")); /* Set the option active. */ optval = 1; optlen = sizeof(optval); if (setsockopt(netcam->sock, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "setsockopt()"); return -1; } MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO, _("SO_KEEPALIVE set on socket.")); } /* * We set the socket non-blocking and then use a 'select' * system call to control the timeout. */ if ((saveflags = fcntl(netcam->sock, F_GETFL, 0)) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, _("fcntl(1) on socket")); netcam_disconnect(netcam); return -1; } /* Set the socket non-blocking. */ if (fcntl(netcam->sock, F_SETFL, saveflags | O_NONBLOCK) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO,_("fcntl(2) on socket")); netcam_disconnect(netcam); return -1; } /* Now the connect call will return immediately. */ ret = connect(netcam->sock, ai->ai_addr, ai->ai_addrlen); back_err = errno; /* Save the errno from connect */ freeaddrinfo(ai); /* If the connect failed with anything except EINPROGRESS, error. */ if ((ret < 0) && (back_err != EINPROGRESS)) { if (!err_flag) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO ,_("connect() failed (%d)"), back_err); } MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO,_("disconnecting netcam (4)")); netcam_disconnect(netcam); return -1; } /* Now we do a 'select' with timeout to wait for the connect. */ FD_ZERO(&fd_w); FD_SET(netcam->sock, &fd_w); selecttime.tv_sec = CONNECT_TIMEOUT; selecttime.tv_usec = 0; ret = select(FD_SETSIZE, NULL, &fd_w, NULL, &selecttime); if (ret == 0) { /* 0 means timeout. */ if (!err_flag) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, _("timeout on connect()")); } MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO,_("disconnecting netcam (2)")); netcam_disconnect(netcam); return -1; } /* * A +ve value returned from the select (actually, it must be a * '1' showing 1 fd's changed) shows the select has completed. * Now we must check the return code from the select. */ len = sizeof(ret); if (getsockopt(netcam->sock, SOL_SOCKET, SO_ERROR, &ret, &len) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, _("getsockopt after connect")); netcam_disconnect(netcam); return -1; } /* If the return code is anything except 0, error on connect. */ if (ret) { if (!err_flag) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, _("connect returned error")); } MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO,_("disconnecting netcam (3)")); netcam_disconnect(netcam); return -1; } /* The socket info is stored in the rbuf structure of our context. */ rbuf_initialize(netcam); return 0; /* Success */ } void netcam_check_buffsize(netcam_buff_ptr buff, size_t numbytes) { int min_size_to_alloc; int real_alloc; int new_size; if ((buff->size - buff->used) >= numbytes) { return; } min_size_to_alloc = numbytes - (buff->size - buff->used); real_alloc = ((min_size_to_alloc / NETCAM_BUFFSIZE) * NETCAM_BUFFSIZE); if ((min_size_to_alloc - real_alloc) > 0) { real_alloc += NETCAM_BUFFSIZE; } new_size = buff->size + real_alloc; MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO ,_("expanding buffer from [%d/%d] to [%d/%d] bytes.") ,(int) buff->used, (int) buff->size ,(int) buff->used, new_size); buff->ptr = myrealloc(buff->ptr, new_size, "netcam_check_buf_size"); buff->size = new_size; } /** * Publish new image * * Moves the image in 'receiving' into 'latest' and updates last frame time */ void netcam_image_read_complete(netcam_context_ptr netcam) { struct timeval curtime; netcam_buff *xchg; if (gettimeofday(&curtime, NULL) < 0) { MOTION_LOG(WRN, TYPE_NETCAM, SHOW_ERRNO, "gettimeofday"); } netcam->receiving->image_time = curtime; /* * Calculate our "running average" time for this netcam's * frame transmissions (except for the first time). * Note that the average frame time is held in microseconds. */ if (netcam->last_image.tv_sec) { netcam->av_frame_time = ((9.0 * netcam->av_frame_time) + 1000000.0 * (curtime.tv_sec - netcam->last_image.tv_sec) + (curtime.tv_usec- netcam->last_image.tv_usec)) / 10.0; /* The following floods the log. Comment out until it is needed. */ //MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO, "Calculated frame time %f", netcam->av_frame_time); } netcam->last_image = curtime; /* * read is complete - set the current 'receiving' buffer atomically * as 'latest', and make the buffer previously in 'latest' become * the new 'receiving'. */ pthread_mutex_lock(&netcam->mutex); xchg = netcam->latest; netcam->latest = netcam->receiving; netcam->receiving = xchg; netcam->imgcnt++; /* * We have a new frame ready. We send a signal so that * any thread (e.g. the motion main loop) waiting for the * next frame to become available may proceed. */ pthread_cond_signal(&netcam->pic_ready); pthread_mutex_unlock(&netcam->mutex); } /** * netcam_read_html_jpeg * * This routine reads a jpeg image from the netcam. When it is called, * the stream is already positioned just after the image header. * * This routine is called under the four variations of two different * conditions: * 1) Streaming or non-streaming camera * Note: Keep-Alive is supported for non-streaming cameras, * if enabled in the netcam's config structure. * 2) Header does or does not include Content-Length * Additionally, if it is a streaming camera, there must always be a * boundary-string. * * The routine will (attempt to) read the JPEG image. If a Content-Length * is present, it will be used (this will result in more efficient code, and * also code which should be better at detecting and recovering from possible * error conditions). * * If a boundary-string is present (and, if the camera is streaming, this * *must* be the case), the routine will assure that it is recognized and * acted upon. * * Our algorithm for this will be as follows: * 1) If a Content-Length is present, set the variable "remaining" * to be equal to that value, else set it to a "very large" * number. * WARNING !!! Content-Length *must* to be greater than 0, even more * a jpeg image cannot be less than 300 bytes or so. * 2) While there is more data available from the camera: * a) If there is a "boundary string" specified (from the initial * header): * i) If the amount of data in the input buffer is less than * the length of the boundary string, get more data into * the input buffer (error if failure). * ii) If the boundary string is found, check how many * characters remain in the input buffer before the start * of the boundary string. If that is less than the * variable "remaining", reset "remaining" to be equal * to that number. * b) Try to copy up to "remaining" characters from the input * buffer into our destination buffer. * c) If there are no more characters available from the camera, * exit this loop, else subtract the number of characters * actually copied from the variable "remaining". * 3) If Content-Length was present, and "remaining" is not equal * to zero, generate a warning message for logging. * * * Parameters: * netcam Pointer to netcam context * * * Returns: 0 for success, -1 for error * */ static int netcam_read_html_jpeg(netcam_context_ptr netcam) { netcam_buff_ptr buffer; size_t remaining; /* # characters to read */ size_t maxflush; /* # chars before boundary */ size_t rem, rlen, ix; /* Working vars */ int retval; char *ptr, *bptr, *rptr; /* * Initialisation - set our local pointers to the context * information. */ buffer = netcam->receiving; /* Assure the target buffer is empty. */ buffer->used = 0; /* Prepare for read loop. */ if (buffer->content_length != 0) { remaining = buffer->content_length; } else { remaining = 9999999; } /* Now read in the data. */ while (remaining) { /* Assure data in input buffer. */ if (netcam->response->buffer_left <= 0) { retval = rbuf_read_bufferful(netcam); if (retval <= 0) { break; } netcam->response->buffer_left = retval; netcam->response->buffer_pos = netcam->response->buffer; } /* If a boundary string is present, take it into account. */ bptr = netcam->boundary; if (bptr) { rptr = netcam->response->buffer_pos; rlen = netcam->response->buffer_left; /* Loop through buffer looking for start of boundary. */ while (1) { /* * Logic gets a little complicated here. The * problem is that we are reading in input * data in packets, and there is a (small) * chance that the boundary string could be * split across successive packets. * First a quick check if the string *might* * be in the current buffer. */ if (rlen > remaining) { rlen = remaining; } if (remaining < netcam->boundary_length) { break; } if ((ptr = memchr(rptr, *bptr, rlen)) == NULL) { /* Boundary not here (normal path) */ break; } /* * At least the first char was found in the * buffer - check for the rest. */ rem = rlen - (ptr - rptr); for (ix = 1; (ix < rem) && (ix < netcam->boundary_length); ix++) { if (ptr[ix] != bptr[ix]) { break; } } if ((ix != netcam->boundary_length) && (ix != rem)) { /* * Not pointing at a boundary string - * step along input. */ ix = ptr - rptr + 1; rptr += ix; rlen -= ix; if (rlen <= 0) { /* boundary not in buffer - go copy out */ break; } /* * Not yet decided - continue * through input. */ continue; } /* * If we finish the 'for' with * ix == boundary_length, that means we found * the string, and should copy any data which * precedes it into the target buffer, then * exit the main loop. */ if (ix == netcam->boundary_length) { if ((ptr - netcam->response->buffer) < (int) remaining) { remaining = ptr - netcam->response->buffer; } /* Go copy everything up to boundary. */ break; } /* * If not, and ix == rem, that means we reached * the end of the input buffer in the middle of * our check, which is the (somewhat messy) * problem mentioned above. * * Assure there is data before potential * boundary string. */ if (ptr != netcam->response->buffer) { /* * We have a boundary string crossing * packets :-(. We will copy all the * data up to the beginning of the * potential boundary, then re-position * the (partial) string to the * beginning and get some more input * data. First we flush the input * buffer up to the beginning of the * (potential) boundary string. */ ix = ptr - netcam->response->buffer_pos; netcam_check_buffsize(buffer, ix); retval = rbuf_flush(netcam, buffer->ptr + buffer->used, ix); buffer->used += retval; remaining -= retval; /* * Now move the boundary fragment to * the head of the input buffer. * This is really a "hack" - ideally, * we should have a function within the * module netcam_wget.c to do this job! */ MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO ,_("Potential split boundary - " "%d chars flushed, %d re-positioned") , ix, (int) netcam->response->buffer_left); memmove(netcam->response->buffer, ptr, netcam->response->buffer_left); } /* End of boundary split over buffer. */ retval = netcam_recv(netcam, netcam->response->buffer + netcam->response->buffer_left, sizeof(netcam->response->buffer) - netcam->response->buffer_left); if (retval <= 0) { /* This is a fatal error. */ MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO ,_("recv() fail after boundary string")); return -1; } /* Reset the input buffer pointers. */ netcam->response->buffer_left = retval + netcam->response->buffer_left; netcam->response->buffer_pos = netcam->response->buffer; /* This will cause a 'continue' of the main loop. */ bptr = NULL; /* Return to do the boundary compare from the start. */ break; } /* End of while(1) input buffer search. */ /* !bptr shows we're processing split boundary. */ if (!bptr) { continue; } } /* end of if (bptr) */ /* boundary string not present, so just write out as much data as possible. */ if (remaining) { maxflush = MINVAL(netcam->response->buffer_left, remaining); netcam_check_buffsize(buffer, maxflush); retval = rbuf_flush(netcam, buffer->ptr + buffer->used, maxflush); buffer->used += retval; remaining -= retval; } } /* Fix starting of JPEG if needed , some cameras introduce thrash before * SOI 0xFFD8 Start Of Image */ netcam_fix_jpeg_header(netcam); netcam_image_read_complete(netcam); if (netcam->caps.streaming == NCS_UNSUPPORTED) { if (!netcam->connect_keepalive) { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("disconnecting netcam since keep-alive not set.")); netcam_disconnect(netcam); return 0; } MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("leaving netcam connected.")); } return 0; } /** * netcam_http_request * * This routine initiates a connection on the specified netcam, * for which every parameter has already been set (url, etc). * It uses the HTTP protocol, which is what many IP cameras use. * If this function succeeds, the HTTP response along with the * headers are already processed, and you can start reading contents * from here. * * Parameters: * netcam Pointer to a netcam_context structure * * Returns: 0 on success, -1 if an error occurs. */ static int netcam_http_request(netcam_context_ptr netcam) { int ix; /* * Our basic initialisation has been completed. Now we will attempt * to connect with the camera so that we can then get a "header" * in order to find out what kind of camera we are dealing with, * as well as what are the picture dimensions. Note that for * this initial connection, any failure will cause an error * return from netcam_start (unlike later possible attempts at * re-connecting, if the network connection is later interrupted). */ for (ix = 0; ix < MAX_HEADER_RETRIES; ix++) { /* * netcam_connect does an automatic netcam_close, so it's * safe to include it as part of this loop * (Not always true now Keep-Alive is implemented). */ MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("about to try to connect, time #%d"), ix); if (netcam_connect(netcam, 0) != 0) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Failed to open camera - check your config and that netcamera is online")); /* Fatal error on startup */ ix = MAX_HEADER_RETRIES; break;; } if (netcam_read_first_header(netcam) >= 0) { break; } MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("Error reading first header - re-trying")); } if (ix == MAX_HEADER_RETRIES) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Failed to read first camera header - giving up for now")); return -1; } return 0; } /** * netcam_http_build_url * * This routing takes care of the url-processing part of the http protocol. * This includes url scheme and parsing, proxy handling, http-authentication * preparation, response buffer allocation and so on. At the end of this * routine, we are ready to call netcam_http_request(). * * Parameters: * netcam Pointer to a netcam_context structure * url Pointer to a netcam url structure * * Returns: 0 on success, * or -1 if an fatal error occurs. */ static int netcam_http_build_url(netcam_context_ptr netcam, struct url_t *url) { struct context *cnt = netcam->cnt; const char *ptr; /* Working var */ char *userpass; /* Temp pointer to config value */ char *encuserpass; /* Temp storage for encoded ver */ char *request_pass = NULL; /* Temp storage for base64 conv */ int ix; /* First the http context structure. */ netcam->response = mymalloc(sizeof(struct rbuf)); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Netcam has flags:" " HTTP/1.0: %s HTTP/1.1: %s Keep-Alive %s.") ,netcam->connect_http_10 ? "1":"0", netcam->connect_http_11 ? "1":"0" ,netcam->connect_keepalive ? "ON":"OFF"); /* * The network camera may require a username and password. If * so, the information can come from two different places in the * motion configuration file. Either it can be present in * the netcam_userpass, or it can be present as a part of the URL * for the camera. We assume the first of these has a higher * relevance. */ if (cnt->conf.netcam_userpass) { ptr = cnt->conf.netcam_userpass; } else { ptr = url->userpass; } /* motion_base64_encode needs up to 3 additional chars. */ if (ptr) { userpass = mymalloc(strlen(ptr) + 3); strcpy(userpass, ptr); } else { userpass = NULL; } /* * Now we want to create the actual string which will be used to * connect to the camera. It may or may not contain a username / * password. We first compose a basic connect message, then check * if a Keep-Alive header is to be included (or just 'close'), then * whether a username / password is required and, if so, just * concatenate it with the request. * */ /* Space for final \r\n plus string terminator. */ ix = 3; /* See if username / password is required. */ if (userpass) { /* If either of the above are non-NULL. */ /* Allocate space for the base64-encoded string. */ encuserpass = mymalloc(BASE64_LENGTH(strlen(userpass)) + 1); /* Fill in the value. */ motion_base64_encode(userpass, encuserpass, strlen(userpass)); /* Now create the last part (authorization) of the request. */ request_pass = mymalloc(strlen(connect_auth_req) + strlen(encuserpass) + 1); ix += sprintf(request_pass, connect_auth_req, encuserpass); /* Free the working variables. */ free(encuserpass); } /* * We are now ready to set up the netcam's "connect request". Most of * this comes from the (preset) string 'connect_req', but additional * characters are required if there is a proxy server, or if there is * a Keep-Alive connection rather than a close connection, or * a username / password for the camera. The variable 'ix' currently * has the number of characters required for username/password (which * could be zero) and for the \r\n and string terminator. We will also * always need space for the netcam path, and if a proxy is being used * we also need space for a preceding 'http://{hostname}' for the * netcam path. * Note: Keep-Alive (but not HTTP 1.1) is disabled if a proxy URL * is set, since HTTP 1.0 Keep-alive cannot be transferred through. */ if ( netcam->haveproxy) { /* * Allocate space for a working string to contain the path. * The extra 4 is for "://" and string terminator. */ if (url->port != 0) { ptr = mymalloc(strlen(url->service) + strlen(url->host) + 7 + strlen(url->path) + 4); sprintf((char *)ptr, "http://%s:%d%s", url->host, url->port , url->path); }else { ptr = mymalloc(strlen(url->service) + strlen(url->host) + strlen(url->path) + 4); sprintf((char *)ptr, "http://%s%s", url->host, url->path); } netcam->connect_keepalive = FALSE; /* Disable Keepalive if proxy */ MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("Removed netcam_keepalive flag due to proxy set." "Proxy is incompatible with Keep-Alive.")); } else { /* If no proxy, set as netcam_url path. */ ptr = url->path; /* * After generating the connect message the string * will be freed, so we don't want netcam_url_free * to free it as well. */ url->path = NULL; } ix += strlen(ptr); /* * Now add the required number of characters for the close header * or Keep-Alive header. We test the flag which can be unset if * there is a problem (rather than the flag in the conf structure * which is read-only. */ if (netcam->connect_keepalive) { ix += strlen(connect_req_keepalive); } else { ix += strlen(connect_req_close); } /* * Point to either the HTTP 1.0 or 1.1 request header set * If the configuration is anything other than 1.1, use 1.0 * as a default. This avoids a chance of being left with none. */ if (netcam->connect_http_11 == TRUE) { connect_req = connect_req_http11; } else { connect_req = connect_req_http10; } /* * Now that we know how much space we need, we can allocate space * for the connect-request string. */ netcam->connect_request = mymalloc(strlen(connect_req) + ix + strlen(netcam->connect_host)); /* Now create the request string with an sprintf. */ sprintf(netcam->connect_request, connect_req, ptr, netcam->connect_host); if (netcam->connect_keepalive) { strcat(netcam->connect_request, connect_req_keepalive); } else { strcat(netcam->connect_request, connect_req_close); } if (userpass) { strcat(netcam->connect_request, request_pass); free(request_pass); free(userpass); } /* Put on the final CRLF onto the request. */ strcat(netcam->connect_request, "\r\n"); free((void *)ptr); netcam_url_free(url); /* Cleanup the url data. */ /* Note that log messages are commented out to avoid leaking info related * to user/host/pass etc. Keeing them in the code for easier debugging if * it is needed */ //MOTION_LOG(INF , TYPE_NETCAM, NO_ERRNO, "Camera connect" // " string is ''%s'' End of camera connect string.", // netcam->connect_request); return 0; } /** * netcam_setup_html * This function will parse the netcam url, connect to the camera, * set its type to jpeg-based, detect multipart and keep-alive, * and the get_image method accordingly. The cam can be non-streaming * or multipart-streaming. * * Parameters * * netcam Pointer to the netcam_context for the camera * url Pointer to the url of the camera * * Returns: 0 on success (camera link ok) or -1 if an error occurred. * */ int netcam_setup_html(netcam_context_ptr netcam, struct url_t *url) { netcam->timeout.tv_sec = READ_TIMEOUT; /* * This netcam is http-based, so build the required URL and * structures, like the connection-string and so on. */ if (netcam_http_build_url(netcam, url) < 0) { return -1; } /* * Then we will send our http request and get headers. */ if (netcam_http_request(netcam) < 0) { return -1; } /* * If this is a streaming camera, we need to position just * past the boundary string and read the image header. */ if (netcam->caps.streaming == NCS_MULTIPART) { if (netcam_read_next_header(netcam) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Failed to read first stream header - giving up for now")); return -1; } } MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("connected, going on to read image.")); netcam->get_image = netcam_read_html_jpeg; return 0; } /** * netcam_mjpg_buffer_refill * * This routing reads content from the MJPG-camera until the response * buffer of the specified netcam_context is full. If the connection is * lost during this operation, it tries to re-connect. * * Parameters: * netcam Pointer to a netcam_context structure * * Returns: The number of read bytes, * or -1 if an fatal connection error occurs. */ static int netcam_mjpg_buffer_refill(netcam_context_ptr netcam) { int retval; if (netcam->response->buffer_left > 0) { return netcam->response->buffer_left; } while (1) { retval = rbuf_read_bufferful(netcam); if (retval <= 0) { /* If we got 0, we timeoutted. */ MOTION_LOG(ALR, TYPE_NETCAM, NO_ERRNO ,_("Read error, trying to reconnect..")); /* We may have lost the connexion */ if (netcam_http_request(netcam) < 0) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("lost the cam.")); return -1; /* We REALLY lost the cam... bail out for now. */ } } if (retval > 0) { break; } } netcam->response->buffer_left = retval; netcam->response->buffer_pos = netcam->response->buffer; MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Refilled buffer with [%d] bytes from the network."), retval); return retval; } /** * netcam_read_mjpg_jpeg * * This routine reads from a netcam using a MJPG-chunk based * protocol, used by Linksys WVC200 for example. * This implementation has been made by reverse-engineering * the protocol, so it may contain bugs and should be considered as * experimental. * * Protocol explanation: * * The stream consists of JPG pictures, spanned across multiple * MJPG chunks (in general 3 chunks, altough that's not guaranteed). * * Each data chunk can range from 1 to 65535 bytes + a header, altough * i have not seen anything bigger than 20000 bytes + a header. * * One MJPG chunk is constituted by a header plus the chunk data. * The chunk header is of fixed size, and the following data size * and position in the frame is specified in the chunk header. * * From what i have seen on WVC200 cameras, the stream always begins * on JPG frame boundary, so you don't have to worry about beginning * in the middle of a frame. * * See netcam.h for the mjpg_header structure and more details. * * Parameters: * netcam Pointer to a netcam_context structure * * Returns: 0 if an image was obtained from the camera, * or -1 if an error occurred. */ static int netcam_read_mjpg_jpeg(netcam_context_ptr netcam) { netcam_buff_ptr buffer; mjpg_header mh; size_t read_bytes; int retval; /* * Initialisation - set our local pointers to the context * information. */ buffer = netcam->receiving; /* Assure the target buffer is empty. */ buffer->used = 0; if (netcam_mjpg_buffer_refill(netcam) < 0) { return -1; } /* Loop until we have a complete JPG. */ while (1) { read_bytes = 0; while (read_bytes < sizeof(mh)) { /* Transfer what we have in buffer in the header structure. */ retval = rbuf_flush(netcam, ((char *)&mh) + read_bytes, sizeof(mh) - read_bytes); read_bytes += retval; MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO ,_("Read [%d/%d] header bytes."), read_bytes, sizeof(mh)); /* If we don't have received a full header, refill our buffer. */ if (read_bytes < sizeof(mh)) { if (netcam_mjpg_buffer_refill(netcam) < 0) { return -1; } } } /* Now check the validity of our header. */ if (strncmp(mh.mh_magic, MJPG_MH_MAGIC, MJPG_MH_MAGIC_SIZE)) { MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO ,_("Invalid header received, reconnecting")); /* * We shall reconnect to restart the stream, and get a chance * to resync. */ if (netcam_http_request(netcam) < 0) { return -1; /* We lost the cam... bail out. */ } /* Even there, we need to resync. */ buffer->used = 0; continue ; } /* Make room for the chunk. */ netcam_check_buffsize(buffer, (int) mh.mh_chunksize); read_bytes = 0; while (read_bytes < mh.mh_chunksize) { retval = rbuf_flush(netcam, buffer->ptr + buffer->used + read_bytes, mh.mh_chunksize - read_bytes); read_bytes += retval; MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO ,_("Read [%d/%d] chunk bytes, [%d/%d] total") ,read_bytes, mh.mh_chunksize ,buffer->used + read_bytes, mh.mh_framesize); if (retval < (int) (mh.mh_chunksize - read_bytes)) { /* MOTION_LOG(EMG, TYPE_NETCAM, NO_ERRNO, "Chunk incomplete, going to refill."); */ if (netcam_mjpg_buffer_refill(netcam) < 0) { return -1; } } } buffer->used += read_bytes; MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO ,_("Chunk complete, buffer used [%d] bytes."), buffer->used); /* Is our JPG image complete ? */ if (mh.mh_framesize == buffer->used) { MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO ,_("Image complete, buffer used [%d] bytes."), buffer->used); break; } /* MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO, "Rlen now at [%d] bytes", rlen); */ } netcam_image_read_complete(netcam); return 0; } /** * netcam_setup_mjpg * This function will parse the netcam url, connect to the camera, * set its type to MJPG-Streaming, and the get_image method accordingly. * * Parameters * * netcam Pointer to the netcam_context for the camera * url Pointer to the url of the camera * * Returns: 0 on success (camera link ok) or -1 if an error occurred. * */ int netcam_setup_mjpg(netcam_context_ptr netcam, struct url_t *url) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO,_("now calling netcam_setup_mjpg()")); netcam->timeout.tv_sec = READ_TIMEOUT; strcpy(url->service, "http"); /* Put back a real URL service. */ /* * This netcam is http-based, so build the required URL and * structures, like the connection-string and so on. */ if (netcam_http_build_url(netcam, url) != 0) { return -1; } /* Then we will send our http request and get headers. */ if (netcam_http_request(netcam) < 0) { return -1; } /* We have a special type of streaming camera. */ netcam->caps.streaming = NCS_BLOCK; /* * We are positionned right just at the start of the first MJPG * header, so don't move anymore, initialization complete. */ MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("connected, going on to read and decode MJPG chunks.")); netcam->get_image = netcam_read_mjpg_jpeg; return 0; } /** * netcam_read_file_jpeg * * This routine reads local image jpeg. ( netcam_url jpeg:///path/image.jpg ) * The current implementation is still a little experimental, * and needs some additional code for error detection and * recovery. */ static int netcam_read_file_jpeg(netcam_context_ptr netcam) { int loop_counter = 0; MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("Begin")); netcam_buff_ptr buffer; int len; struct stat statbuf; /* Point to our working buffer. */ buffer = netcam->receiving; buffer->used = 0; /*int fstat(int filedes, struct stat *buf);*/ do { if (stat(netcam->file->path, &statbuf)) { MOTION_LOG(CRT, TYPE_NETCAM, SHOW_ERRNO ,_("stat(%s) error"), netcam->file->path); return -1; } MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO ,_("statbuf.st_mtime[%d] != last_st_mtime[%d]") , statbuf.st_mtime, netcam->file->last_st_mtime); /* its waits POLLING_TIMEOUT */ if (loop_counter>((POLLING_TIMEOUT*1000*1000)/(POLLING_TIME/1000))) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("waiting new file image timeout")); return -1; } MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO ,_("delay waiting new file image ")); //its waits 5seconds - READ_TIMEOUT //SLEEP(netcam->timeout.tv_sec, netcam->timeout.tv_usec*1000); SLEEP(0, POLLING_TIME); // its waits 500ms /*return -1;*/ loop_counter++; } while (statbuf.st_mtime == netcam->file->last_st_mtime); netcam->file->last_st_mtime = statbuf.st_mtime; MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("processing new file image - st_mtime %d"), netcam->file->last_st_mtime); /* Assure there's enough room in the buffer. */ while (buffer->size < (size_t)statbuf.st_size) { netcam_check_buffsize(buffer, statbuf.st_size); } /* Do the read */ netcam->file->control_file_desc = open(netcam->file->path, O_RDONLY|O_CLOEXEC); if (netcam->file->control_file_desc < 0) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("open(%s) error: %d") ,netcam->file->path, netcam->file->control_file_desc); return -1; } if ((len = read(netcam->file->control_file_desc, buffer->ptr + buffer->used, statbuf.st_size)) < 0) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("read(%s) error: %d"), netcam->file->control_file_desc, len); return -1; } buffer->used += len; close(netcam->file->control_file_desc); netcam_image_read_complete(netcam); MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("End")); return 0; } tfile_context *file_new_context(void) { /* Note that mymalloc will exit on any problem. */ return mymalloc(sizeof(tfile_context)); } void file_free_context(tfile_context* ctxt) { if (ctxt == NULL) { return; } free(ctxt->path); free(ctxt); } int netcam_setup_file(netcam_context_ptr netcam, struct url_t *url) { if ((netcam->file = file_new_context()) == NULL) { return -1; } /* * We copy the strings out of the url structure into the ftp_context * structure. By setting url->{string} to NULL we effectively "take * ownership" of the string away from the URL (i.e. it won't be freed * when we cleanup the url structure later). */ netcam->file->path = url->path; url->path = NULL; MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("netcam->file->path %s"), netcam->file->path); netcam->get_image = netcam_read_file_jpeg; return 0; } motion-release-4.6.0/src/netcam_http.h000066400000000000000000000052521452402535500177230ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * netcam_http.h * Headers associated with functions in the netcam_http.c module. */ #ifndef _INCLUDE_NETCAM_HTTP_H #define _INCLUDE_NETCAM_HTTP_H #include #include #include #define MJPG_MH_MAGIC "MJPG" #define MJPG_MH_MAGIC_SIZE 4 typedef struct file_context { char *path; /* the path within the URL */ int control_file_desc; /* file descriptor for the control socket */ time_t last_st_mtime; /* time this image was modified */ } tfile_context; /* * MJPG Chunk header for MJPG streaming. * Little-endian data is read from the network. */ typedef struct { char mh_magic[MJPG_MH_MAGIC_SIZE]; /* must contain the string MJP not null-terminated. */ unsigned int mh_framesize; /* Total size of the current frame in bytes (~45kb on WVC200) */ unsigned short mh_framewidth; /* Frame width in pixels */ unsigned short mh_frameheight; /* Frame height in pixels */ unsigned int mh_frameoffset; /* Offset of this chunk relative to the beginning of frame. */ unsigned short mh_chunksize; /* The size of the chunk data following this header. */ char mh_reserved[30]; /* Unknown data, seems to be constant between all headers */ } mjpg_header; void netcam_disconnect(netcam_context_ptr netcam); int netcam_connect(netcam_context_ptr netcam, int err_flag); int netcam_read_first_header(netcam_context_ptr netcam); int netcam_setup_html(netcam_context_ptr netcam, struct url_t *url); int netcam_setup_mjpg(netcam_context_ptr netcam, struct url_t *url); int netcam_setup_file(netcam_context_ptr netcam, struct url_t *url); int netcam_read_next_header(netcam_context_ptr netcam); #endif // _INCLUDE_NETCAM_HTTP_H motion-release-4.6.0/src/netcam_jpeg.c000066400000000000000000000433761452402535500176750ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * netcam_jpeg.c * * Module for handling JPEG decompression for network cameras. * * This code was inspired by the original module written by * Jeroen Vreeken and enhanced by several Motion project * contributors, particularly Angel Carpintero and * Christopher Price. * * Copyright 2005, William M. Brack */ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include "rotate.h" #include "netcam.h" #include "netcam_jpeg.h" /* This is a workaround regarding these defines. The config.h file defines * HAVE_STDLIB_H as 1 whereas the jpeglib.h just defines it without a value. * this causes massive warnings/error on mis-matched definitions. We do not * control either of these so we have to suffer through this workaround hack */ #if (HAVE_STDLIB_H == 1) #undef HAVE_STDLIB_H #define HAVE_STDLIB_H_ORIG 1 #endif #include #ifdef HAVE_STDLIB_H #ifdef HAVE_STDLIB_H_ORIG #undef HAVE_STDLIB_H #undef HAVE_STDLIB_H_ORIG #define HAVE_STDLIB_H 1 #else #undef HAVE_STDLIB_H #endif #endif #include /* * netcam_source_mgr is a locally-defined structure to contain elements * which are not present in the standard libjpeg (the element 'pub' is a * pointer to the standard information). */ typedef struct { struct jpeg_source_mgr pub; char *data; int length; JOCTET *buffer; boolean start_of_file; } netcam_source_mgr; typedef netcam_source_mgr *netcam_src_ptr; /* * Here we declare function prototypes for all the routines involved with * overriding libjpeg functions. The reason these are required is that, * although the standard library handles input and output with stdio, * we are working with "remote" data (from the camera or from a file). */ static void netcam_init_source(j_decompress_ptr); static boolean netcam_fill_input_buffer(j_decompress_ptr); static void netcam_skip_input_data(j_decompress_ptr, long); static void netcam_term_source(j_decompress_ptr); static void netcam_memory_src(j_decompress_ptr, char *, int); static void netcam_error_exit(j_common_ptr); static void netcam_init_source(j_decompress_ptr cinfo) { /* Get our "private" structure from the libjpeg structure. */ netcam_src_ptr src = (netcam_src_ptr) cinfo->src; /* * Set the 'start_of_file' flag in our private structure * (used by my_fill_input_buffer). */ src->start_of_file = TRUE; } static boolean netcam_fill_input_buffer(j_decompress_ptr cinfo) { netcam_src_ptr src = (netcam_src_ptr) cinfo->src; size_t nbytes; /* * start_of_file is set any time netcam_init_source has been called * since the last entry to this routine. This would be the normal * path when a new image is to be processed. It is assumed that * this routine will only be called once for the entire image. * If an unexpected call (with start_of_file FALSE) occurs, the * routine calls ERREXIT(). */ if (src->start_of_file) { nbytes = src->length; src->buffer = (JOCTET *) src->data; } else { nbytes = 2; MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("Not enough data from netcam.")); ERREXIT(cinfo, JERR_INPUT_EOF); } src->pub.next_input_byte = src->buffer; src->pub.bytes_in_buffer = nbytes; src->start_of_file = FALSE; return TRUE; } static void netcam_skip_input_data(j_decompress_ptr cinfo, long num_bytes) { netcam_src_ptr src = (netcam_src_ptr) cinfo->src; if (num_bytes > 0) { while (num_bytes > (long) src->pub.bytes_in_buffer) { num_bytes -= (long) src->pub.bytes_in_buffer; (void) netcam_fill_input_buffer (cinfo); } src->pub.next_input_byte += (size_t) num_bytes; src->pub.bytes_in_buffer -= (size_t) num_bytes; } } static void netcam_term_source(j_decompress_ptr cinfo) { (void)cinfo; } /** * netcam_memory_src * * Routine to setup for fetching data from a netcam buffer, used by the * JPEG library decompression routine. * * Parameters: * cinfo pointer to the jpeg decompression object. * data pointer to the image data received from a netcam. * length total size of the image. * * Returns: Nothing * */ static void netcam_memory_src(j_decompress_ptr cinfo, char *data, int length) { netcam_src_ptr src; if (cinfo->src == NULL) { cinfo->src = (struct jpeg_source_mgr *) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, sizeof (netcam_source_mgr)); } src = (netcam_src_ptr)cinfo->src; src->data = data; src->length = length; src->pub.init_source = netcam_init_source; src->pub.fill_input_buffer = netcam_fill_input_buffer; src->pub.skip_input_data = netcam_skip_input_data; src->pub.resync_to_restart = jpeg_resync_to_restart; src->pub.term_source = netcam_term_source; src->pub.bytes_in_buffer = 0; src->pub.next_input_byte = NULL; } /** * netcam_error_exit * * Routine to override the libjpeg error exit routine so * that we can just throw away the bad frame and continue * with more data from the netcam. * * Parameters * * cinfo pointer to the decompression control structure. * * Returns: does an (ugly) longjmp to get back to netcam_jpeg * code. * */ static void netcam_error_exit(j_common_ptr cinfo) { /* Fetch our pre-stored pointer to the netcam context. */ netcam_context_ptr netcam = cinfo->client_data; /* Output the message associated with the error. */ (*cinfo->err->output_message)(cinfo); /* Set flag to show the decompression had errors. */ netcam->jpeg_error |= 1; /* Need to "cleanup" the aborted decompression. */ jpeg_destroy (cinfo); MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("netcam->jpeg_error %d"), netcam->jpeg_error); /* Jump back to wherever we started. */ longjmp(netcam->setjmp_buffer, 1); } /** * netcam_output_message * * Routine to override the libjpeg error message output routine. * We do this so that we can output our module and thread i.d., * as well as put the message to the motion log. * * Parameters * * cinfo pointer to the decompression control structure. * * Returns Nothing * */ static void netcam_output_message(j_common_ptr cinfo) { char buffer[JMSG_LENGTH_MAX]; /* Fetch our pre-stored pointer to the netcam context. */ netcam_context_ptr netcam = cinfo->client_data; /* * While experimenting with a "appro" netcam it was discovered * that the jpeg data produced by the camera caused warning * messages from libjpeg (JWRN_EXTRANEOUS_DATA). The following * code is to assure that specific warning is ignored. * * NOTE: It's likely that we will discover other error message * codes which we want to ignore. In that case, we should have * some sort of table-lookup to decide which messages we really * care about. */ if ((cinfo->err->msg_code != JWRN_EXTRANEOUS_DATA) && (cinfo->err->msg_code == JWRN_NOT_SEQUENTIAL) && (!netcam->netcam_tolerant_check)) { netcam->jpeg_error |= 2; /* Set flag to show problem */ } /* * Format the message according to library standards. * Write it out to the motion log. */ (*cinfo->err->format_message)(cinfo, buffer); MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO, "%s", buffer); } /** * netcam_init_jpeg * * Initialises the JPEG library prior to doing a * decompression. * * Parameters: * netcam pointer to netcam_context. * cinfo pointer to JPEG decompression context. * * Returns: Error code. */ static int netcam_init_jpeg(netcam_context_ptr netcam, j_decompress_ptr cinfo) { netcam_buff_ptr buff; /* * First we check whether a new image has arrived. If not, we * setup to wait for 1/2 a frame time. This will (hopefully) * help in synchronizing the camera frames with the motion main * loop. */ pthread_mutex_lock(&netcam->mutex); if (netcam->imgcnt_last == netcam->imgcnt) { /* Need to wait */ struct timespec waittime; struct timeval curtime; int retcode; /* * We calculate the delay time (representing the desired frame * rate). This delay time is in *nanoseconds*. * We will wait 0.5 seconds which gives a practical minimum * framerate of 2 which is desired for the motion_loop to * function. */ gettimeofday(&curtime, NULL); curtime.tv_usec += 500000; if (curtime.tv_usec > 1000000) { curtime.tv_usec -= 1000000; curtime.tv_sec++; } waittime.tv_sec = curtime.tv_sec; waittime.tv_nsec = 1000L * curtime.tv_usec; do { retcode = pthread_cond_timedwait(&netcam->pic_ready, &netcam->mutex, &waittime); } while (retcode == EINTR); if (retcode) { /* We assume a non-zero reply is ETIMEOUT */ pthread_mutex_unlock(&netcam->mutex); return NETCAM_GENERAL_ERROR | NETCAM_NOTHING_NEW_ERROR; } MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("***new pic delay successful***")); } netcam->imgcnt_last = netcam->imgcnt; /* Set latest buffer as "current". */ buff = netcam->latest; netcam->latest = netcam->jpegbuf; netcam->jpegbuf = buff; pthread_mutex_unlock(&netcam->mutex); /* Clear any error flag from previous work. */ netcam->jpeg_error = 0; buff = netcam->jpegbuf; /* * Prepare for the decompression. * Initialize the JPEG decompression object. */ jpeg_create_decompress(cinfo); /* Set up own error exit routine. */ cinfo->err = jpeg_std_error(&netcam->jerr); cinfo->client_data = netcam; netcam->jerr.error_exit = netcam_error_exit; netcam->jerr.output_message = netcam_output_message; /* Specify the data source as our own routine. */ netcam_memory_src(cinfo, buff->ptr, buff->used); /* Read file parameters (rejecting tables-only). */ jpeg_read_header(cinfo, TRUE); /* Override the desired colour space. */ if (cinfo->out_color_space != JCS_GRAYSCALE) { cinfo->out_color_space = JCS_YCbCr; } /* Start the decompressor. */ jpeg_start_decompress(cinfo); if (netcam->jpeg_error) { MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("jpeg_error %d"), netcam->jpeg_error); } return netcam->jpeg_error; } /** * netcam_image_conv * * Parameters: * netcam pointer to netcam_context * cinfo pointer to JPEG decompression context * image pointer to buffer of destination image (yuv420) * * Returns : netcam->jpeg_error */ static int netcam_image_conv(netcam_context_ptr netcam, struct jpeg_decompress_struct *cinfo , struct image_data *img_data) { JSAMPARRAY line; /* Array of decomp data lines */ unsigned char *wline; /* Will point to line[0] */ /* Working variables */ int linesize, i; unsigned char *upic, *vpic; unsigned char *pic = img_data->image_norm; unsigned char y; /* Switch for decoding YUV data */ unsigned int width, height; width = cinfo->output_width; height = cinfo->output_height; if (width && ((width != netcam->width) || (height != netcam->height))) { MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO ,_("JPEG image size %dx%d, JPEG was %dx%d") ,netcam->width, netcam->height, width, height); jpeg_destroy_decompress(cinfo); netcam->jpeg_error |= 4; return netcam->jpeg_error; } /* Set the output pointers (these come from YUV411P definition. */ upic = pic + width * height; vpic = upic + (width * height) / 4; /* YCbCr format will give us one byte each for YUV. */ linesize = cinfo->output_width * 3; /* Allocate space for one line. */ line = (cinfo->mem->alloc_sarray)((j_common_ptr) cinfo, JPOOL_IMAGE, cinfo->output_width * cinfo->output_components, 1); wline = line[0]; y = 0; while (cinfo->output_scanline < height) { jpeg_read_scanlines(cinfo, line, 1); if (cinfo->out_color_space == JCS_GRAYSCALE) { for (i = 0; i < (int)cinfo->output_width; i++) { pic[i] = wline[i]; } pic += cinfo->output_width; } else { for (i = 0; i < linesize; i += 3) { pic[i / 3] = wline[i]; if (i & 1) { upic[(i / 3) / 2] = wline[i + 1]; vpic[(i / 3) / 2] = wline[i + 2]; } } pic += linesize / 3; if (y++ & 1) { upic += width / 2; vpic += width / 2; } } } jpeg_finish_decompress(cinfo); jpeg_destroy_decompress(cinfo); rotate_map(netcam->cnt, img_data); if (netcam->jpeg_error) { MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO,_("jpeg_error %d"), netcam->jpeg_error); } return netcam->jpeg_error; } /** * netcam_proc_jpeg * * Routine to decode an image received from a netcam into a YUV420P buffer * suitable for processing by motion. * * Parameters: * netcam pointer to the netcam_context structure. * image pointer to a buffer for the returned image. * * Returns: * * 0 Success * non-zero error code from other routines * (e.g. netcam_init_jpeg or netcam_image_conv) * or just NETCAM_GENERAL_ERROR */ int netcam_proc_jpeg(netcam_context_ptr netcam, struct image_data *img_data) { struct jpeg_decompress_struct cinfo; /* Decompression control struct. */ int retval = 0; /* Value returned to caller. */ int ret; /* Working var. */ /* * This routine is only called from the main thread. * We need to "protect" the "latest" image while we * decompress it. netcam_init_jpeg uses * netcam->mutex to do this. */ MOTION_LOG(DBG, TYPE_NETCAM, NO_ERRNO ,_("processing jpeg image - content length %d"), netcam->latest->content_length); ret = netcam_init_jpeg(netcam, &cinfo); if (ret != 0) { return ret; } /* * Do a sanity check on dimensions * If dimensions have changed we throw an * error message that will cause * restart of Motion. */ if (netcam->width) { /* 0 means not yet init'ed */ if ((cinfo.output_width != netcam->width) || (cinfo.output_height != netcam->height)) { retval = NETCAM_RESTART_ERROR; MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Camera width/height mismatch with JPEG image - " " expected %dx%d, JPEG %dx%d retval %d") ,netcam->width, netcam->height ,cinfo.output_width, cinfo.output_height, retval); return retval; } } /* Do the conversion */ ret = netcam_image_conv(netcam, &cinfo, img_data); if (ret != 0) { retval |= NETCAM_JPEG_CONV_ERROR; MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("ret %d retval %d"), ret, retval); } return retval; } /** * netcam_fix_jpeg_header * * Routine to decode an image received from a netcam into a YUV420P buffer * suitable for processing by motion. * * Parameters: * netcam pointer to the netcam_context structure * * Returns: Nothing * */ void netcam_fix_jpeg_header(netcam_context_ptr netcam) { char *ptr_buffer; ptr_buffer = memmem(netcam->receiving->ptr, netcam->receiving->used, "\xff\xd8", 2); if (ptr_buffer != NULL) { size_t soi_position = 0; soi_position = ptr_buffer - netcam->receiving->ptr; if (soi_position > 0) { memmove(netcam->receiving->ptr, netcam->receiving->ptr + soi_position, netcam->receiving->used - soi_position); netcam->receiving->used -= soi_position; } // if (debug_level > CAMERA_INFO) // motion_log(LOG_INFO, 0, "SOI found , position %d", // __FUNCTION__, soi_position); } } /** * netcam_get_dimensions * * This function gets the height and width of the JPEG image * located in the supplied netcam_image_buffer. * * Parameters * * netcam pointer to the netcam context. * * Returns: Nothing, but fills in width and height into context. * */ void netcam_get_dimensions(netcam_context_ptr netcam) { struct jpeg_decompress_struct cinfo; /* Decompression control struct. */ int ret; ret = netcam_init_jpeg(netcam, &cinfo); netcam->width = cinfo.output_width; netcam->height = cinfo.output_height; netcam->JFIF_marker = cinfo.saw_JFIF_marker; jpeg_destroy_decompress(&cinfo); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO, "JFIF_marker %s PRESENT ret %d", netcam->JFIF_marker ? "IS" : "NOT", ret); } motion-release-4.6.0/src/netcam_jpeg.h000066400000000000000000000020441452402535500176650ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * netcam_jpeg.h * Headers associated with functions in the netcam_jpeg.c module. */ #ifndef _INCLUDE_NETCAM_JPEG_H #define _INCLUDE_NETCAM_JPEG_H int netcam_proc_jpeg(struct netcam_context *netcam, struct image_data *img_data); void netcam_fix_jpeg_header(struct netcam_context *netcam); void netcam_get_dimensions(struct netcam_context *netcam); #endif motion-release-4.6.0/src/netcam_rtsp.c000066400000000000000000002475671452402535500177500ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /*********************************************************** * In the top section are the functions that are used * when processing the camera feed. Since these functions * are internal to the RTSP module, and many require FFmpeg * structures in their declarations, they are within the * HAVE_FFMPEG block that eliminates them entirely when * FFmpeg is not present. * * The functions: * netcam_rtsp_setup * netcam_rtsp_next * netcam_rtsp_cleanup * are called from video_common.c therefore must be defined even * if FFmpeg is not present. They must also not have FFmpeg * structures in the declarations. Simple error * messages are raised if called when no FFmpeg is found. * * Additional note: Although this module is called netcam_rtsp, * it actually handles more camera types than just rtsp. * Within its current construct, it could be set up to handle * whatever types of capture devices that ffmpeg can use. * As of this writing it includes rtsp, http, files and v4l2. * ***********************************************************/ #include #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include "rotate.h" #include "netcam.h" #include "netcam_rtsp.h" #ifdef HAVE_FFMPEG #include "ffmpeg.h" static void netcam_rtsp_free_pkt(struct rtsp_context *rtsp_data) { if (rtsp_data->packet_recv != NULL) { my_packet_free(rtsp_data->packet_recv); } rtsp_data->packet_recv = NULL; } static int netcam_rtsp_check_pixfmt(struct rtsp_context *rtsp_data) { /* Determine if the format is YUV420P */ int retcd; retcd = -1; if (((enum AVPixelFormat)rtsp_data->frame->format == MY_PIX_FMT_YUV420P) || ((enum AVPixelFormat)rtsp_data->frame->format == MY_PIX_FMT_YUVJ420P)) { retcd = 0; } return retcd; } static void netcam_rtsp_pktarray_free(struct rtsp_context *rtsp_data) { int indx; pthread_mutex_lock(&rtsp_data->mutex_pktarray); if (rtsp_data->pktarray_size > 0) { for(indx = 0; indx < rtsp_data->pktarray_size; indx++) { my_packet_free(rtsp_data->pktarray[indx].packet); rtsp_data->pktarray[indx].packet = NULL; } } free(rtsp_data->pktarray); rtsp_data->pktarray = NULL; rtsp_data->pktarray_size = 0; rtsp_data->pktarray_index = -1; pthread_mutex_unlock(&rtsp_data->mutex_pktarray); } static void netcam_rtsp_null_context(struct rtsp_context *rtsp_data) { rtsp_data->swsctx = NULL; rtsp_data->swsframe_in = NULL; rtsp_data->swsframe_out = NULL; rtsp_data->frame = NULL; rtsp_data->codec_context = NULL; rtsp_data->format_context = NULL; rtsp_data->transfer_format = NULL; } static void netcam_rtsp_close_context(struct rtsp_context *rtsp_data) { if (rtsp_data->swsctx != NULL) { sws_freeContext(rtsp_data->swsctx); } if (rtsp_data->swsframe_in != NULL) { my_frame_free(rtsp_data->swsframe_in); } if (rtsp_data->swsframe_out != NULL) { my_frame_free(rtsp_data->swsframe_out); } if (rtsp_data->frame != NULL) { my_frame_free(rtsp_data->frame); } if (rtsp_data->pktarray != NULL) { netcam_rtsp_pktarray_free(rtsp_data); } if (rtsp_data->codec_context != NULL) { my_avcodec_close(rtsp_data->codec_context); } if (rtsp_data->format_context != NULL) { avformat_close_input(&rtsp_data->format_context); } if (rtsp_data->transfer_format != NULL) { avformat_close_input(&rtsp_data->transfer_format); } #if (MYFFVER >= 57083) if (rtsp_data->hw_device_ctx != NULL) av_buffer_unref(&rtsp_data->hw_device_ctx); #endif netcam_rtsp_null_context(rtsp_data); } static void netcam_rtsp_pktarray_resize(struct context *cnt, int is_highres) { /* This is called from netcam_rtsp_next and is on the motion loop thread * The rtsp_data->mutex is locked around the call to this function. */ /* Remember that this is a ring and we have two threads chasing around it * the ffmpeg is writing out of this ring while we are filling it up. "Bad" * things will occur if the "add" thread catches up with the "write" thread. * We need this ring to be big enough so they don't collide. * The alternative is that we'd need to make a copy of the entire packet * array in the ffmpeg module and do our writing from that copy. The * downside is that is a lot to be copying around for each image we want * to write out. And putting a mutex on the array during adding function would * slow down the capture thread to the speed of the writing thread. And that * writing thread operates at the user specified FPS which could be really slow * ...So....make this array big enough so we never catch our tail. :) */ int64_t idnbr_last, idnbr_first; int indx; struct rtsp_context *rtsp_data; struct packet_item *tmp; int newsize; if (is_highres) { idnbr_last = cnt->imgs.image_ring[cnt->imgs.image_ring_out].idnbr_high; idnbr_first = cnt->imgs.image_ring[cnt->imgs.image_ring_in].idnbr_high; rtsp_data = cnt->rtsp_high; } else { idnbr_last = cnt->imgs.image_ring[cnt->imgs.image_ring_out].idnbr_norm; idnbr_first = cnt->imgs.image_ring[cnt->imgs.image_ring_in].idnbr_norm; rtsp_data = cnt->rtsp; } if (!rtsp_data->passthrough) { return; } /* The 30 is arbitrary */ /* Double the size plus double last diff so we don't catch our tail */ newsize =((idnbr_first - idnbr_last) * 2 ) + ((rtsp_data->idnbr - idnbr_last ) * 2); if (newsize < 30) { newsize = 30; } pthread_mutex_lock(&rtsp_data->mutex_pktarray); if ((rtsp_data->pktarray_size < newsize) || (rtsp_data->pktarray_size < 30)) { tmp = mymalloc(newsize * sizeof(struct packet_item)); if (rtsp_data->pktarray_size > 0 ) { memcpy(tmp, rtsp_data->pktarray, sizeof(struct packet_item) * rtsp_data->pktarray_size); } for(indx = rtsp_data->pktarray_size; indx < newsize; indx++) { tmp[indx].packet = my_packet_alloc(tmp[indx].packet); tmp[indx].idnbr = 0; tmp[indx].iskey = FALSE; tmp[indx].iswritten = FALSE; } if (rtsp_data->pktarray != NULL) { free(rtsp_data->pktarray); } rtsp_data->pktarray = tmp; rtsp_data->pktarray_size = newsize; MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Resized packet array to %d"), rtsp_data->cameratype,newsize); } pthread_mutex_unlock(&rtsp_data->mutex_pktarray); } static void netcam_rtsp_pktarray_add(struct rtsp_context *rtsp_data) { int indx_next; int retcd; char errstr[128]; pthread_mutex_lock(&rtsp_data->mutex_pktarray); if (rtsp_data->pktarray_size == 0) { pthread_mutex_unlock(&rtsp_data->mutex_pktarray); return; } /* Recall pktarray_size is one based but pktarray is zero based */ if (rtsp_data->pktarray_index == (rtsp_data->pktarray_size-1) ) { indx_next = 0; } else { indx_next = rtsp_data->pktarray_index + 1; } rtsp_data->pktarray[indx_next].idnbr = rtsp_data->idnbr; my_packet_free(rtsp_data->pktarray[indx_next].packet); rtsp_data->pktarray[indx_next].packet = NULL; rtsp_data->pktarray[indx_next].packet = my_packet_alloc(rtsp_data->pktarray[indx_next].packet); retcd = my_copy_packet(rtsp_data->pktarray[indx_next].packet, rtsp_data->packet_recv); if ((rtsp_data->interrupted) || (retcd < 0)) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: av_copy_packet: %s ,Interrupt: %s") ,rtsp_data->cameratype ,errstr, rtsp_data->interrupted ? _("True"):_("False")); my_packet_free(rtsp_data->pktarray[indx_next].packet); rtsp_data->pktarray[indx_next].packet = NULL; } if (rtsp_data->pktarray[indx_next].packet->flags & AV_PKT_FLAG_KEY) { rtsp_data->pktarray[indx_next].iskey = TRUE; } else { rtsp_data->pktarray[indx_next].iskey = FALSE; } rtsp_data->pktarray[indx_next].iswritten = FALSE; rtsp_data->pktarray[indx_next].timestamp_tv.tv_sec = rtsp_data->img_recv->image_time.tv_sec; rtsp_data->pktarray[indx_next].timestamp_tv.tv_usec = rtsp_data->img_recv->image_time.tv_usec; rtsp_data->pktarray_index = indx_next; pthread_mutex_unlock(&rtsp_data->mutex_pktarray); } static int netcam_decode_sw(struct rtsp_context *rtsp_data) { #if ( MYFFVER >= 57041) int retcd; char errstr[128]; retcd = avcodec_receive_frame(rtsp_data->codec_context, rtsp_data->frame); if ((rtsp_data->interrupted) || (rtsp_data->finish) || (retcd < 0) ) { if (retcd == AVERROR(EAGAIN)) { retcd = 0; } else if (retcd == AVERROR_INVALIDDATA) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Ignoring packet with invalid data") ,rtsp_data->cameratype); retcd = 0; } else if (retcd < 0) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Rec frame error: %s") ,rtsp_data->cameratype, errstr); retcd = -1; } else { retcd = -1; } return retcd; } return 1; #else int retcd, check=0; char errstr[128]; retcd = avcodec_decode_video2(rtsp_data->codec_context, rtsp_data->frame, &check, rtsp_data->packet_recv); if ((rtsp_data->interrupted) || (rtsp_data->finish)) { return -1; } if (retcd == AVERROR_INVALIDDATA) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO, _("Ignoring packet with invalid data")); return 0; } if (retcd < 0) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO, _("Error decoding packet: %s"),errstr); return -1; } if (check == 0 || retcd == 0) { return 0; } return 1; #endif } static int netcam_decode_vaapi(struct rtsp_context *rtsp_data) { #if ( MYFFVER >= 57083) int retcd; char errstr[128]; AVFrame *hw_frame = NULL; hw_frame = my_frame_alloc(); retcd = avcodec_receive_frame(rtsp_data->codec_context, hw_frame); if ((rtsp_data->interrupted) || (rtsp_data->finish) || (retcd < 0) ) { if (retcd == AVERROR(EAGAIN)) { retcd = 0; } else if (retcd == AVERROR_INVALIDDATA) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Ignoring packet with invalid data") ,rtsp_data->cameratype); retcd = 0; } else if (retcd < 0) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Rec frame error: %s") ,rtsp_data->cameratype, errstr); retcd = -1; } else { retcd = -1; } my_frame_free(hw_frame); return retcd; } retcd = av_hwframe_transfer_data(rtsp_data->frame, hw_frame, 0); if (retcd < 0) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Error transferring HW decoded to system memory") ,rtsp_data->cameratype); my_frame_free(hw_frame); return -1; } my_frame_free(hw_frame); return 1; #else (void)rtsp_data; return 1; #endif } static int netcam_decode_cuda(struct rtsp_context *rtsp_data) { #if ( MYFFVER >= 57083) int retcd; char errstr[128]; AVFrame *hw_frame = NULL; hw_frame = my_frame_alloc(); retcd = avcodec_receive_frame(rtsp_data->codec_context, hw_frame); if ((rtsp_data->interrupted) || (rtsp_data->finish) || (retcd < 0) ){ if (retcd == AVERROR(EAGAIN)){ retcd = 0; } else if (retcd == AVERROR_INVALIDDATA) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Ignoring packet with invalid data") ,rtsp_data->cameratype); retcd = 0; } else if (retcd < 0) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Rec frame error: %s") ,rtsp_data->cameratype, errstr); retcd = -1; } else { retcd = -1; } my_frame_free(hw_frame); return retcd; } rtsp_data->frame->format=AV_PIX_FMT_NV12; retcd = av_hwframe_transfer_data(rtsp_data->frame, hw_frame, 0); if (retcd < 0) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Error transferring HW decoded to system memory") ,rtsp_data->cameratype); my_frame_free(hw_frame); return -1; } my_frame_free(hw_frame); return 1; #else (void)rtsp_data; return 1; #endif } static int netcam_decode_drm(struct rtsp_context *rtsp_data) { #if ( MYFFVER >= 57083) int retcd; char errstr[128]; AVFrame *hw_frame = NULL; hw_frame = my_frame_alloc(); retcd = avcodec_receive_frame(rtsp_data->codec_context, hw_frame); if ((rtsp_data->interrupted) || (rtsp_data->finish) || (retcd < 0) ){ if (retcd == AVERROR(EAGAIN)){ retcd = 0; } else if (retcd == AVERROR_INVALIDDATA) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Ignoring packet with invalid data") ,rtsp_data->cameratype); retcd = 0; } else if (retcd < 0) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Rec frame error: %s") ,rtsp_data->cameratype, errstr); retcd = -1; } else { retcd = -1; } my_frame_free(hw_frame); return retcd; } rtsp_data->frame->format=AV_PIX_FMT_NV12; retcd = av_hwframe_transfer_data(rtsp_data->frame, hw_frame, 0); if (retcd < 0) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Error transferring HW decoded to system memory") ,rtsp_data->cameratype); my_frame_free(hw_frame); return -1; } my_frame_free(hw_frame); return 1; #else (void)rtsp_data; return 1; #endif } /* netcam_rtsp_decode_video * * Return values: * <0 error * 0 invalid but continue * 1 valid data */ static int netcam_rtsp_decode_video(struct rtsp_context *rtsp_data) { #if ( MYFFVER >= 57041) int retcd; char errstr[128]; /* The Invalid data problem comes frequently. Usually at startup of rtsp cameras. * We now ignore those packets so this function would need to fail on a different error. * We should consider adding a maximum count of these errors and reset every time * we get a good image. */ if (rtsp_data->finish) { /* This just speeds up the shutdown time */ return 0; } retcd = avcodec_send_packet(rtsp_data->codec_context, rtsp_data->packet_recv); if ((rtsp_data->interrupted) || (rtsp_data->finish)) { return -1; } if (retcd == AVERROR_INVALIDDATA) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Ignoring packet with invalid data")); return 0; } if (retcd < 0 && retcd != AVERROR_EOF) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Error sending packet to codec: %s"), errstr); /* This is non fatal for file processing */ if (mystreq(rtsp_data->service, "file")) { return 0; } else { return -1; } } if (mystrceq(rtsp_data->decoder_nm,"vaapi")) { retcd = netcam_decode_vaapi(rtsp_data); } else if (mystrceq(rtsp_data->decoder_nm,"cuda")) { retcd = netcam_decode_cuda(rtsp_data); } else if (mystrceq(rtsp_data->decoder_nm,"drm")) { retcd = netcam_decode_drm(rtsp_data); } else { retcd = netcam_decode_sw(rtsp_data); } return retcd; #else int retcd; if (rtsp_data->finish) { return 0; /* This just speeds up the shutdown time */ } if (mystrceq(rtsp_data->decoder_nm,"vaapi")) { retcd = netcam_decode_vaapi(rtsp_data); } else if (mystrceq(rtsp_data->decoder_nm,"cuda")) { retcd = netcam_decode_cuda(rtsp_data); } else { retcd = netcam_decode_sw(rtsp_data); } return retcd; #endif } static int netcam_rtsp_decode_packet(struct rtsp_context *rtsp_data) { int frame_size; int retcd; if (rtsp_data->finish) { /* This just speeds up the shutdown time */ return -1; } retcd = netcam_rtsp_decode_video(rtsp_data); if (retcd <= 0) { return retcd; } frame_size = my_image_get_buffer_size((enum AVPixelFormat) rtsp_data->frame->format ,rtsp_data->frame->width ,rtsp_data->frame->height); netcam_check_buffsize(rtsp_data->img_recv, frame_size); netcam_check_buffsize(rtsp_data->img_latest, frame_size); retcd = my_image_copy_to_buffer(rtsp_data->frame ,(uint8_t *)rtsp_data->img_recv->ptr ,(enum AVPixelFormat) rtsp_data->frame->format ,rtsp_data->frame->width ,rtsp_data->frame->height ,frame_size); if ((retcd < 0) || (rtsp_data->interrupted)) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Error decoding video packet: Copying to buffer")); return -1; } rtsp_data->img_recv->used = frame_size; return frame_size; } static void netcam_hwdecoders(struct rtsp_context *rtsp_data) { #if ( MYFFVER >= 57083) /* High Res pass through does not decode images into frames*/ if (rtsp_data->high_resolution && rtsp_data->passthrough) { return; } if ((rtsp_data->hw_type == AV_HWDEVICE_TYPE_NONE) && (rtsp_data->first_image)) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: HW Devices: ") , rtsp_data->cameratype); while((rtsp_data->hw_type = av_hwdevice_iterate_types(rtsp_data->hw_type)) != AV_HWDEVICE_TYPE_NONE){ if (rtsp_data->hw_type == AV_HWDEVICE_TYPE_VAAPI || rtsp_data->hw_type == AV_HWDEVICE_TYPE_CUDA || rtsp_data->hw_type == AV_HWDEVICE_TYPE_DRM) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: %s (available)") , rtsp_data->cameratype , av_hwdevice_get_type_name(rtsp_data->hw_type)); } else { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: %s (not implemented)") , rtsp_data->cameratype , av_hwdevice_get_type_name(rtsp_data->hw_type)); } } } return; #else if (mystrcne(rtsp_data->decoder_nm,"NULL")) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: netcam_decoder %s disabled.") , rtsp_data->cameratype, rtsp_data->decoder_nm); free(rtsp_data->decoder_nm); rtsp_data->decoder_nm = mymalloc(5); snprintf(rtsp_data->decoder_nm, 5, "%s","NULL"); } return; #endif } static enum AVPixelFormat netcam_getfmt_vaapi(AVCodecContext *avctx, const enum AVPixelFormat *pix_fmts) { #if ( MYFFVER >= 57083) const enum AVPixelFormat *p; (void)avctx; for (p = pix_fmts; *p != -1; p++) { if (*p == AV_PIX_FMT_VAAPI) { return *p; } } MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("Failed to get vaapi pix format")); return AV_PIX_FMT_NONE; #else (void)avctx; (void)pix_fmts; return AV_PIX_FMT_NONE; #endif } static enum AVPixelFormat netcam_getfmt_cuda(AVCodecContext *avctx, const enum AVPixelFormat *pix_fmts) { #if ( MYFFVER >= 57083) const enum AVPixelFormat *p; (void)avctx; for (p = pix_fmts; *p != -1; p++) { if (*p == AV_PIX_FMT_CUDA) return *p; } MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("Failed to get cuda pix format")); return AV_PIX_FMT_NONE; #else (void)avctx; (void)pix_fmts; return AV_PIX_FMT_NONE; #endif } static enum AVPixelFormat netcam_getfmt_drm(AVCodecContext *avctx, const enum AVPixelFormat *pix_fmts) { #if ( MYFFVER >= 57083) const enum AVPixelFormat *p; (void)avctx; for (p = pix_fmts; *p != -1; p++) { if (*p == AV_PIX_FMT_DRM_PRIME) return *p; } MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("Failed to get drm pix format")); return AV_PIX_FMT_NONE; #else (void)avctx; (void)pix_fmts; return AV_PIX_FMT_NONE; #endif } static void netcam_rtsp_decoder_error(struct rtsp_context *rtsp_data, int retcd, const char* fnc_nm) { char errstr[128]; int indx; if (rtsp_data->interrupted) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("%s: Interrupted."),rtsp_data->cameratype); } else { if (retcd < 0) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("%s: %s: %s") ,rtsp_data->cameratype,fnc_nm, errstr); } else { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("%s: %s: Failed"),rtsp_data->cameratype,fnc_nm); } } if (mystrcne(rtsp_data->decoder_nm,"NULL")) { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("%s: Decoder %s did not work.") ,rtsp_data->cameratype, rtsp_data->decoder_nm); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("%s: Ignoring and removing the user requested decoder %s") ,rtsp_data->cameratype, rtsp_data->decoder_nm); for (indx = 0; indx < rtsp_data->parameters->params_count; indx++) { if (mystreq(rtsp_data->parameters->params_array[indx].param_name,"decoder") ) { free(rtsp_data->parameters->params_array[indx].param_value); rtsp_data->parameters->params_array[indx].param_value = mymalloc(5); snprintf(rtsp_data->parameters->params_array[indx].param_value, 5, "%s","NULL"); break; } } free(rtsp_data->decoder_nm); rtsp_data->decoder_nm = mymalloc(5); snprintf(rtsp_data->decoder_nm, 5, "%s","NULL"); if (rtsp_data->high_resolution) { util_parms_update(rtsp_data->parameters, rtsp_data->cnt, "netcam_high_params"); } else { util_parms_update(rtsp_data->parameters, rtsp_data->cnt, "netcam_params"); } } } static int netcam_init_vaapi(struct rtsp_context *rtsp_data) { #if ( MYFFVER >= 57083) int retcd; MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Initializing vaapi decoder"),rtsp_data->cameratype); rtsp_data->hw_type = av_hwdevice_find_type_by_name("vaapi"); if (rtsp_data->hw_type == AV_HWDEVICE_TYPE_NONE) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("%s: Unable to find vaapi hw device") , rtsp_data->cameratype); netcam_rtsp_decoder_error(rtsp_data, 0, "av_hwdevice"); return -1; } rtsp_data->codec_context = avcodec_alloc_context3(rtsp_data->decoder); if ((rtsp_data->codec_context == NULL) || (rtsp_data->interrupted)) { netcam_rtsp_decoder_error(rtsp_data, 0, "avcodec_alloc_context3"); return -1; } retcd = avcodec_parameters_to_context(rtsp_data->codec_context,rtsp_data->strm->codecpar); if ((retcd < 0) || (rtsp_data->interrupted)) { netcam_rtsp_decoder_error(rtsp_data, retcd, "avcodec_parameters_to_context"); return -1; } rtsp_data->hw_pix_fmt = AV_PIX_FMT_VAAPI; rtsp_data->codec_context->get_format = netcam_getfmt_vaapi; av_opt_set_int(rtsp_data->codec_context, "refcounted_frames", 1, 0); rtsp_data->codec_context->sw_pix_fmt = AV_PIX_FMT_YUV420P; rtsp_data->codec_context->hwaccel_flags= AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH | AV_HWACCEL_FLAG_IGNORE_LEVEL; retcd = av_hwdevice_ctx_create(&rtsp_data->hw_device_ctx, rtsp_data->hw_type, NULL, NULL, 0); if (retcd < 0) { netcam_rtsp_decoder_error(rtsp_data, retcd, "hwctx"); return -1; } rtsp_data->codec_context->hw_device_ctx = av_buffer_ref(rtsp_data->hw_device_ctx); return 0; #else (void)rtsp_data; (void)netcam_getfmt_vaapi; return 0; #endif } static int netcam_init_cuda(struct rtsp_context *rtsp_data) { #if ( MYFFVER >= 57083) int retcd; MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Initializing cuda decoder"),rtsp_data->cameratype); rtsp_data->hw_type = av_hwdevice_find_type_by_name("cuda"); if (rtsp_data->hw_type == AV_HWDEVICE_TYPE_NONE){ MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("%s: Unable to find cuda hw device") , rtsp_data->cameratype); netcam_rtsp_decoder_error(rtsp_data, 0, "av_hwdevice"); return -1; } rtsp_data->codec_context = avcodec_alloc_context3(rtsp_data->decoder); if ((rtsp_data->codec_context == NULL) || (rtsp_data->interrupted)){ netcam_rtsp_decoder_error(rtsp_data, 0, "avcodec_alloc_context3"); return -1; } retcd = avcodec_parameters_to_context(rtsp_data->codec_context,rtsp_data->strm->codecpar); if ((retcd < 0) || (rtsp_data->interrupted)) { netcam_rtsp_decoder_error(rtsp_data, retcd, "avcodec_parameters_to_context"); return -1; } rtsp_data->hw_pix_fmt = AV_PIX_FMT_CUDA; rtsp_data->codec_context->get_format = netcam_getfmt_cuda; av_opt_set_int(rtsp_data->codec_context, "refcounted_frames", 1, 0); rtsp_data->codec_context->sw_pix_fmt = AV_PIX_FMT_YUV420P; rtsp_data->codec_context->hwaccel_flags= AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH | AV_HWACCEL_FLAG_IGNORE_LEVEL; retcd = av_hwdevice_ctx_create(&rtsp_data->hw_device_ctx, rtsp_data->hw_type, NULL, NULL, 0); if (retcd < 0){ netcam_rtsp_decoder_error(rtsp_data, retcd, "hwctx"); return -1; } rtsp_data->codec_context->hw_device_ctx = av_buffer_ref(rtsp_data->hw_device_ctx); return 0; #else (void)rtsp_data; (void)netcam_getfmt_cuda; return 0; #endif } static int netcam_init_drm(struct rtsp_context *rtsp_data) { #if ( MYFFVER >= 57083) int retcd; MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Initializing drm decoder"),rtsp_data->cameratype); rtsp_data->hw_type = av_hwdevice_find_type_by_name("drm"); if (rtsp_data->hw_type == AV_HWDEVICE_TYPE_NONE){ MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO,_("%s: Unable to find drm hw device") , rtsp_data->cameratype); netcam_rtsp_decoder_error(rtsp_data, 0, "av_hwdevice"); return -1; } rtsp_data->codec_context = avcodec_alloc_context3(rtsp_data->decoder); if ((rtsp_data->codec_context == NULL) || (rtsp_data->interrupted)){ netcam_rtsp_decoder_error(rtsp_data, 0, "avcodec_alloc_context3"); return -1; } retcd = avcodec_parameters_to_context(rtsp_data->codec_context,rtsp_data->strm->codecpar); if ((retcd < 0) || (rtsp_data->interrupted)) { netcam_rtsp_decoder_error(rtsp_data, retcd, "avcodec_parameters_to_context"); return -1; } rtsp_data->hw_pix_fmt = AV_PIX_FMT_DRM_PRIME; rtsp_data->codec_context->get_format = netcam_getfmt_drm; av_opt_set_int(rtsp_data->codec_context, "refcounted_frames", 1, 0); rtsp_data->codec_context->sw_pix_fmt = AV_PIX_FMT_YUV420P; rtsp_data->codec_context->hwaccel_flags= AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH | AV_HWACCEL_FLAG_IGNORE_LEVEL; retcd = av_hwdevice_ctx_create(&rtsp_data->hw_device_ctx, rtsp_data->hw_type, NULL, NULL, 0); if (retcd < 0){ netcam_rtsp_decoder_error(rtsp_data, retcd, "hwctx"); return -1; } rtsp_data->codec_context->hw_device_ctx = av_buffer_ref(rtsp_data->hw_device_ctx); return 0; #else (void)rtsp_data; (void)netcam_getfmt_drm; return 0; #endif } static int netcam_init_swdecoder(struct rtsp_context *rtsp_data) { #if ( MYFFVER >= 57041) int retcd; MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Initializing decoder"),rtsp_data->cameratype); if (mystrcne(rtsp_data->decoder_nm,"NULL")) { rtsp_data->decoder = avcodec_find_decoder_by_name(rtsp_data->decoder_nm); if (rtsp_data->decoder == NULL) { netcam_rtsp_decoder_error(rtsp_data, 0, "avcodec_find_decoder_by_name"); } else { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO,_("%s: Using decoder %s") ,rtsp_data->cameratype, rtsp_data->decoder_nm); } } if (rtsp_data->decoder == NULL) { rtsp_data->decoder = avcodec_find_decoder(rtsp_data->strm->codecpar->codec_id); } if ((rtsp_data->decoder == NULL) || (rtsp_data->interrupted)) { netcam_rtsp_decoder_error(rtsp_data, 0, "avcodec_find_decoder"); return -1; } rtsp_data->codec_context = avcodec_alloc_context3(rtsp_data->decoder); if ((rtsp_data->codec_context == NULL) || (rtsp_data->interrupted)) { netcam_rtsp_decoder_error(rtsp_data, 0, "avcodec_alloc_context3"); return -1; } retcd = avcodec_parameters_to_context(rtsp_data->codec_context, rtsp_data->strm->codecpar); if ((retcd < 0) || (rtsp_data->interrupted)) { netcam_rtsp_decoder_error(rtsp_data, retcd, "avcodec_parameters_to_context"); return -1; } rtsp_data->codec_context->error_concealment = FF_EC_GUESS_MVS | FF_EC_DEBLOCK; rtsp_data->codec_context->err_recognition = AV_EF_EXPLODE; return 0; #else int retcd; rtsp_data->codec_context = rtsp_data->strm->codec; rtsp_data->decoder = avcodec_find_decoder(rtsp_data->codec_context->codec_id); if ((rtsp_data->decoder == NULL) || (rtsp_data->interrupted)) { netcam_rtsp_decoder_error(rtsp_data, 0, "avcodec_find_decoder"); return -1; } retcd = avcodec_open2(rtsp_data->codec_context, rtsp_data->decoder, NULL); if ((retcd < 0) || (rtsp_data->interrupted)) { netcam_rtsp_decoder_error(rtsp_data, retcd, "avcodec_open2"); return -1; } return 0; #endif } static int netcam_rtsp_open_codec(struct rtsp_context *rtsp_data) { #if ( MYFFVER >= 57041) int retcd; if (rtsp_data->finish) { /* This just speeds up the shutdown time */ return -1; } netcam_hwdecoders(rtsp_data); rtsp_data->decoder=NULL; retcd = av_find_best_stream(rtsp_data->format_context , AVMEDIA_TYPE_VIDEO, -1, -1, &rtsp_data->decoder, 0); if ((retcd < 0) || (rtsp_data->interrupted)) { netcam_rtsp_decoder_error(rtsp_data, retcd, "av_find_best_stream"); return -1; } rtsp_data->video_stream_index = retcd; rtsp_data->strm = rtsp_data->format_context->streams[rtsp_data->video_stream_index]; if (mystrceq(rtsp_data->decoder_nm,"vaapi")) { retcd = netcam_init_vaapi(rtsp_data); } else if (mystrceq(rtsp_data->decoder_nm,"cuda")){ retcd = netcam_init_cuda(rtsp_data); } else if (mystrceq(rtsp_data->decoder_nm,"drm")){ retcd = netcam_init_drm(rtsp_data); } else { retcd = netcam_init_swdecoder(rtsp_data); } if ((retcd < 0) || (rtsp_data->interrupted)) { netcam_rtsp_decoder_error(rtsp_data, retcd, "initdecoder"); return -1; } retcd = avcodec_open2(rtsp_data->codec_context,rtsp_data->decoder, NULL); if ((retcd < 0) || (rtsp_data->interrupted)) { netcam_rtsp_decoder_error(rtsp_data, retcd, "avcodec_open2"); return -1; } MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Decoder opened"), rtsp_data->cameratype); return 0; #else int retcd; if (rtsp_data->finish) { /* This just speeds up the shutdown time */ return -1; } netcam_hwdecoders(rtsp_data); rtsp_data->decoder = NULL; retcd = av_find_best_stream(rtsp_data->format_context, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0); if ((retcd < 0) || (rtsp_data->interrupted)) { netcam_rtsp_decoder_error(rtsp_data, retcd, "av_find_best_stream"); return -1; } rtsp_data->video_stream_index = retcd; rtsp_data->strm = rtsp_data->format_context->streams[rtsp_data->video_stream_index]; /* This is currently always true for older ffmpeg until it is built */ if (mystrceq(rtsp_data->decoder_nm,"vaapi")) { retcd = netcam_init_vaapi(rtsp_data); } else if (mystrceq(rtsp_data->decoder_nm,"cuda")){ retcd = netcam_init_cuda(rtsp_data); } else { retcd = netcam_init_swdecoder(rtsp_data); } return retcd; #endif } static struct rtsp_context *rtsp_new_context(void) { struct rtsp_context *ret; /* Note that mymalloc will exit on any problem. */ ret = mymalloc(sizeof(struct rtsp_context)); memset(ret, 0, sizeof(struct rtsp_context)); return ret; } static int netcam_rtsp_interrupt(void *ctx) { struct rtsp_context *rtsp_data = ctx; if (rtsp_data->finish && rtsp_data->handler_finished) { rtsp_data->interrupted = TRUE; return TRUE; } if (rtsp_data->status == RTSP_CONNECTED) { return FALSE; } else if (rtsp_data->status == RTSP_READINGIMAGE) { if (gettimeofday(&rtsp_data->interruptcurrenttime, NULL) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "gettimeofday"); } if ((rtsp_data->interruptcurrenttime.tv_sec - rtsp_data->interruptstarttime.tv_sec ) > rtsp_data->interruptduration){ MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Camera reading (%s) timed out") , rtsp_data->cameratype, rtsp_data->camera_name); rtsp_data->interrupted = TRUE; return TRUE; } else{ return FALSE; } } else { /* This is for NOTCONNECTED and RECONNECTING status. We give these * options more time because all the ffmpeg calls that are inside the * rtsp_connect function will use the same start time. Otherwise we * would need to reset the time before each call to a ffmpeg function. */ if (gettimeofday(&rtsp_data->interruptcurrenttime, NULL) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "gettimeofday"); } if ((rtsp_data->interruptcurrenttime.tv_sec - rtsp_data->interruptstarttime.tv_sec ) > rtsp_data->interruptduration){ MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Camera (%s) timed out") , rtsp_data->cameratype, rtsp_data->camera_name); rtsp_data->interrupted = TRUE; return TRUE; } else{ return FALSE; } } /* should not be possible to get here */ return FALSE; } static int netcam_rtsp_open_sws(struct rtsp_context *rtsp_data) { if (rtsp_data->finish) { /* This just speeds up the shutdown time */ return -1; } rtsp_data->swsframe_in = my_frame_alloc(); if (rtsp_data->swsframe_in == NULL) { if (rtsp_data->status == RTSP_NOTCONNECTED) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, _("Unable to allocate swsframe_in.")); } netcam_rtsp_close_context(rtsp_data); return -1; } rtsp_data->swsframe_out = my_frame_alloc(); if (rtsp_data->swsframe_out == NULL) { if (rtsp_data->status == RTSP_NOTCONNECTED) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, _("Unable to allocate swsframe_out.")); } netcam_rtsp_close_context(rtsp_data); return -1; } /* * The scaling context is used to change dimensions to config file and * also if the format sent by the camera is not YUV420. */ rtsp_data->swsctx = sws_getContext( rtsp_data->frame->width ,rtsp_data->frame->height ,(enum AVPixelFormat) rtsp_data->frame->format ,rtsp_data->imgsize.width ,rtsp_data->imgsize.height ,MY_PIX_FMT_YUV420P ,SWS_BICUBIC,NULL,NULL,NULL); if (rtsp_data->swsctx == NULL) { if (rtsp_data->status == RTSP_NOTCONNECTED) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, _("Unable to allocate scaling context.")); } netcam_rtsp_close_context(rtsp_data); return -1; } rtsp_data->swsframe_size = my_image_get_buffer_size( MY_PIX_FMT_YUV420P ,rtsp_data->imgsize.width ,rtsp_data->imgsize.height); if (rtsp_data->swsframe_size <= 0) { if (rtsp_data->status == RTSP_NOTCONNECTED) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, _("Error determining size of frame out")); } netcam_rtsp_close_context(rtsp_data); return -1; } /* the image buffers must be big enough to hold the final frame after resizing */ netcam_check_buffsize(rtsp_data->img_recv, rtsp_data->swsframe_size); netcam_check_buffsize(rtsp_data->img_latest, rtsp_data->swsframe_size); return 0; } static int netcam_rtsp_resize(struct rtsp_context *rtsp_data) { int retcd; char errstr[128]; uint8_t *buffer_out; if (rtsp_data->finish) { /* This just speeds up the shutdown time */ return -1; } if (rtsp_data->swsctx == NULL) { if (netcam_rtsp_open_sws(rtsp_data) < 0) { return -1; } } retcd=my_image_fill_arrays( rtsp_data->swsframe_in ,(uint8_t*)rtsp_data->img_recv->ptr ,(enum AVPixelFormat)rtsp_data->frame->format ,rtsp_data->frame->width ,rtsp_data->frame->height); if (retcd < 0) { if (rtsp_data->status == RTSP_NOTCONNECTED) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Error allocating picture in: %s"), errstr); } netcam_rtsp_close_context(rtsp_data); return -1; } buffer_out=(uint8_t *)av_malloc(rtsp_data->swsframe_size*sizeof(uint8_t)); retcd=my_image_fill_arrays( rtsp_data->swsframe_out ,buffer_out ,MY_PIX_FMT_YUV420P ,rtsp_data->imgsize.width ,rtsp_data->imgsize.height); if (retcd < 0) { if (rtsp_data->status == RTSP_NOTCONNECTED) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Error allocating picture out: %s"), errstr); } netcam_rtsp_close_context(rtsp_data); return -1; } retcd = sws_scale( rtsp_data->swsctx ,(const uint8_t* const *)rtsp_data->swsframe_in->data ,rtsp_data->swsframe_in->linesize ,0 ,rtsp_data->frame->height ,rtsp_data->swsframe_out->data ,rtsp_data->swsframe_out->linesize); if (retcd < 0) { if (rtsp_data->status == RTSP_NOTCONNECTED) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Error resizing/reformatting: %s"), errstr); } netcam_rtsp_close_context(rtsp_data); return -1; } retcd=my_image_copy_to_buffer( rtsp_data->swsframe_out ,(uint8_t *)rtsp_data->img_recv->ptr ,MY_PIX_FMT_YUV420P ,rtsp_data->imgsize.width ,rtsp_data->imgsize.height ,rtsp_data->swsframe_size); if (retcd < 0) { if (rtsp_data->status == RTSP_NOTCONNECTED) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Error putting frame into output buffer: %s"), errstr); } netcam_rtsp_close_context(rtsp_data); return -1; } rtsp_data->img_recv->used = rtsp_data->swsframe_size; av_free(buffer_out); return 0; } static int netcam_rtsp_read_image(struct rtsp_context *rtsp_data) { int size_decoded; int retcd, nodata, haveimage; char errstr[128]; netcam_buff *xchg; if (rtsp_data->finish) { /* This just speeds up the shutdown time */ return -1; } rtsp_data->packet_recv = my_packet_alloc(rtsp_data->packet_recv); rtsp_data->interrupted=FALSE; if (gettimeofday(&rtsp_data->interruptstarttime, NULL) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "gettimeofday"); } rtsp_data->interruptduration = 10; rtsp_data->status = RTSP_READINGIMAGE; rtsp_data->img_recv->used = 0; size_decoded = 0; nodata = 0; haveimage = FALSE; while ((haveimage == FALSE) && (rtsp_data->interrupted == FALSE)) { retcd = av_read_frame(rtsp_data->format_context, rtsp_data->packet_recv); /* The 2000 for nodata tries is arbritrary*/ if ((rtsp_data->interrupted) || (retcd < 0 ) || (nodata > 2000)) { if (rtsp_data->interrupted) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Interrupted"),rtsp_data->cameratype); } else if (retcd < 0) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: av_read_frame: %s") ,rtsp_data->cameratype, errstr); } else { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Excessive tries to get data from camera %d") ,rtsp_data->cameratype, nodata); } netcam_rtsp_free_pkt(rtsp_data); netcam_rtsp_close_context(rtsp_data); return -1; } else { if (rtsp_data->packet_recv->stream_index == rtsp_data->video_stream_index) { /* For a high resolution pass-through we don't decode the image */ if (rtsp_data->high_resolution && rtsp_data->passthrough) { if (rtsp_data->packet_recv->data != NULL) { size_decoded = 1; } } else { size_decoded = netcam_rtsp_decode_packet(rtsp_data); } } if (size_decoded > 0 ) { haveimage = TRUE; } else if (size_decoded == 0) { /* Did not fail, just didn't get anything. Try again */ nodata++; netcam_rtsp_free_pkt(rtsp_data); rtsp_data->packet_recv = my_packet_alloc(rtsp_data->packet_recv); } else { netcam_rtsp_free_pkt(rtsp_data); netcam_rtsp_close_context(rtsp_data); return -1; } } } if (gettimeofday(&rtsp_data->img_recv->image_time, NULL) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "gettimeofday"); } /* Skip status change on our first image to keep the "next" function waiting * until the handler thread gets going */ if (!rtsp_data->first_image) { rtsp_data->status = RTSP_CONNECTED; } /* Skip resize/pix format for high pass-through */ if (!(rtsp_data->high_resolution && rtsp_data->passthrough)) { if ((rtsp_data->imgsize.width != rtsp_data->frame->width) || (rtsp_data->imgsize.height != rtsp_data->frame->height) || (netcam_rtsp_check_pixfmt(rtsp_data) != 0)) { if (netcam_rtsp_resize(rtsp_data) < 0) { netcam_rtsp_free_pkt(rtsp_data); netcam_rtsp_close_context(rtsp_data); return -1; } } } pthread_mutex_lock(&rtsp_data->mutex); rtsp_data->idnbr++; if (rtsp_data->passthrough) { netcam_rtsp_pktarray_add(rtsp_data); } if (!(rtsp_data->high_resolution && rtsp_data->passthrough)) { xchg = rtsp_data->img_latest; rtsp_data->img_latest = rtsp_data->img_recv; rtsp_data->img_recv = xchg; } pthread_mutex_unlock(&rtsp_data->mutex); netcam_rtsp_free_pkt(rtsp_data); if (rtsp_data->format_context->streams[rtsp_data->video_stream_index]->avg_frame_rate.den > 0) { rtsp_data->src_fps = ( (rtsp_data->format_context->streams[rtsp_data->video_stream_index]->avg_frame_rate.num / rtsp_data->format_context->streams[rtsp_data->video_stream_index]->avg_frame_rate.den) + 0.5); if (rtsp_data->capture_rate < 1) { rtsp_data->capture_rate = rtsp_data->src_fps + 1; MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: capture_rate not specified in netcam_params. Using %d") ,rtsp_data->cameratype,rtsp_data->capture_rate); } } else { if (rtsp_data->capture_rate < 1) { rtsp_data->capture_rate = rtsp_data->conf->framerate; MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: capture_rate not specified in netcam_params. Using framerate %d") ,rtsp_data->cameratype,rtsp_data->capture_rate); } } return 0; } static int netcam_rtsp_ntc(struct rtsp_context *rtsp_data) { if ((rtsp_data->finish) || (!rtsp_data->first_image) || (rtsp_data->high_resolution && rtsp_data->passthrough)) { return 0; } if ((rtsp_data->imgsize.width != rtsp_data->frame->width) || (rtsp_data->imgsize.height != rtsp_data->frame->height) || (netcam_rtsp_check_pixfmt(rtsp_data) != 0)) { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, ""); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, "******************************************************"); if ((rtsp_data->imgsize.width != rtsp_data->frame->width) || (rtsp_data->imgsize.height != rtsp_data->frame->height)) { if (netcam_rtsp_check_pixfmt(rtsp_data) != 0) { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("The network camera is sending pictures in a different")); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("size than specified in the config and also a ")); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("different picture format. The picture is being")); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("transcoded to YUV420P and into the size requested")); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("in the config file. If possible change netcam to")); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("be in YUV420P format and the size requested in the")); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("config to possibly lower CPU usage.")); } else { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("The network camera is sending pictures in a different")); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("size than specified in the configuration file.")); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("The picture is being transcoded into the size ")); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("requested in the configuration. If possible change")); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("netcam or configuration to indicate the same size")); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("to possibly lower CPU usage.")); } MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("Netcam: %d x %d => Config: %d x %d") ,rtsp_data->frame->width,rtsp_data->frame->height ,rtsp_data->imgsize.width,rtsp_data->imgsize.height); } else { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("The image sent is being ")); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("trancoded to YUV420P. If possible change netcam ")); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, _("picture format to YUV420P to possibly lower CPU usage.")); } MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, "******************************************************"); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO, ""); } return 0; } static void netcam_rtsp_set_options(struct rtsp_context *rtsp_data) { int indx; char *tmpval; /* The log messages are a bit short in this function intentionally. * The function name is printed in each message so that is being * considered as part of the message. */ tmpval = mymalloc(PATH_MAX); if ((strncmp(rtsp_data->service, "rtsp", 4) == 0 ) || (strncmp(rtsp_data->service, "rtmp", 4) == 0 )) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO,_("%s: Setting rtsp/rtmp") ,rtsp_data->cameratype); util_parms_add_default(rtsp_data->parameters,"rtsp_transport","tcp"); } else if (strncmp(rtsp_data->service, "http", 4) == 0 ) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Setting input_format mjpeg"),rtsp_data->cameratype); rtsp_data->format_context->iformat = av_find_input_format("mjpeg"); util_parms_add_default(rtsp_data->parameters,"reconnect_on_network_error","1"); util_parms_add_default(rtsp_data->parameters,"reconnect_at_eof","1"); util_parms_add_default(rtsp_data->parameters,"reconnect","1"); util_parms_add_default(rtsp_data->parameters,"multiple_requests","1"); util_parms_add_default(rtsp_data->parameters,"reconnect_streamed","1"); } else if (strncmp(rtsp_data->service, "v4l2", 4) == 0 ) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Setting input_format video4linux2"),rtsp_data->cameratype); rtsp_data->format_context->iformat = av_find_input_format("video4linux2"); sprintf(tmpval,"%d",rtsp_data->conf->framerate); util_parms_add_default(rtsp_data->parameters,"framerate", tmpval); sprintf(tmpval,"%dx%d",rtsp_data->conf->width, rtsp_data->conf->height); util_parms_add_default(rtsp_data->parameters,"video_size", tmpval); /* Allow a bit more time for the v4l2 device to start up */ rtsp_data->cnt->watchdog = 60; rtsp_data->interruptduration = 55; } else if (strncmp(rtsp_data->service, "file", 4) == 0 ) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Setting up movie file"),rtsp_data->cameratype); } else { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO,_("%s: Setting up %s") ,rtsp_data->cameratype, rtsp_data->service); } free(tmpval); /* Write the options to the context, while skipping the Motion ones */ for (indx = 0; indx < rtsp_data->parameters->params_count; indx++) { if (mystrne(rtsp_data->parameters->params_array[indx].param_name,"decoder") && mystrne(rtsp_data->parameters->params_array[indx].param_name,"capture_rate")) { av_dict_set(&rtsp_data->opts , rtsp_data->parameters->params_array[indx].param_name , rtsp_data->parameters->params_array[indx].param_value , 0); if (rtsp_data->status == RTSP_NOTCONNECTED) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO,_("%s: option: %s = %s") ,rtsp_data->cameratype ,rtsp_data->parameters->params_array[indx].param_name ,rtsp_data->parameters->params_array[indx].param_value ); } } } } static void netcam_rtsp_set_path (struct context *cnt, struct rtsp_context *rtsp_data ) { char *userpass = NULL; struct url_t url; rtsp_data->path = NULL; rtsp_data->service = NULL; memset(&url, 0, sizeof(url)); if (rtsp_data->high_resolution) { netcam_url_parse(&url, cnt->conf.netcam_high_url); } else { netcam_url_parse(&url, cnt->conf.netcam_url); } if (cnt->conf.netcam_userpass != NULL) { userpass = mystrdup(cnt->conf.netcam_userpass); } else if (url.userpass != NULL) { userpass = mystrdup(url.userpass); } if (mystreq(url.service, "v4l2")) { rtsp_data->path = mymalloc(strlen(url.path) + 1); sprintf(rtsp_data->path, "%s",url.path); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Setting up v4l2 via netcam")); } else if (mystreq(url.service, "file")) { rtsp_data->path = mymalloc(strlen(url.path) + 1); sprintf(rtsp_data->path, "%s",url.path); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Setting up file via netcam")); } else { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Setting up %s via netcam"),url.service); if (userpass != NULL) { rtsp_data->path = mymalloc(strlen(url.service) + 3 + strlen(userpass) + 1 + strlen(url.host) + 6 + strlen(url.path) + 2 ); if (url.port > 0) { sprintf((char *)rtsp_data->path, "%s://%s@%s:%d%s", url.service, userpass, url.host, url.port, url.path); } else { sprintf((char *)rtsp_data->path, "%s://%s@%s%s", url.service, userpass, url.host, url.path); } } else { rtsp_data->path = mymalloc(strlen(url.service) + 3 + strlen(url.host) + 6 + strlen(url.path) + 2); if (url.port > 0) { sprintf((char *)rtsp_data->path, "%s://%s:%d%s" , url.service, url.host, url.port, url.path); } else { sprintf((char *)rtsp_data->path, "%s://%s%s" , url.service, url.host, url.path); } } } rtsp_data->service = mymalloc(strlen(url.service)+1); sprintf(rtsp_data->service, "%s",url.service); netcam_url_free(&url); if (userpass) { free (userpass); } } static void netcam_rtsp_set_parms (struct context *cnt, struct rtsp_context *rtsp_data ) { /* Set the parameters to be used with our camera */ int indx, val_len; rtsp_data->conf = &cnt->conf; if (rtsp_data->high_resolution) { rtsp_data->imgsize.width = 0; rtsp_data->imgsize.height = 0; snprintf(rtsp_data->cameratype,29, "%s",_("highres")); rtsp_data->parameters = mymalloc(sizeof(struct params_context)); rtsp_data->parameters->update_params = TRUE; util_parms_parse(rtsp_data->parameters,(char*)cnt->conf.netcam_high_params, TRUE); } else { rtsp_data->imgsize.width = cnt->conf.width; rtsp_data->imgsize.height = cnt->conf.height; snprintf(rtsp_data->cameratype,29, "%s",_("norm")); rtsp_data->parameters = mymalloc(sizeof(struct params_context)); rtsp_data->parameters->update_params = TRUE; util_parms_parse(rtsp_data->parameters, (char*)cnt->conf.netcam_params, TRUE); } MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("Setting up %s stream."),rtsp_data->cameratype); rtsp_data->status = RTSP_NOTCONNECTED; util_parms_add_default(rtsp_data->parameters,"decoder","NULL"); rtsp_data->camera_name = cnt->conf.camera_name; rtsp_data->img_recv = mymalloc(sizeof(netcam_buff)); rtsp_data->img_recv->ptr = mymalloc(NETCAM_BUFFSIZE); rtsp_data->img_latest = mymalloc(sizeof(netcam_buff)); rtsp_data->img_latest->ptr = mymalloc(NETCAM_BUFFSIZE); rtsp_data->pktarray_size = 0; rtsp_data->pktarray_index = -1; rtsp_data->pktarray = NULL; rtsp_data->packet_recv = NULL; rtsp_data->handler_finished = TRUE; rtsp_data->first_image = TRUE; rtsp_data->reconnect_count = 0; rtsp_data->cnt = cnt; rtsp_data->src_fps = -99; /* Default to invalid value so we can test for whether real value exist */ rtsp_data->capture_rate = -1; for (indx = 0; indx < rtsp_data->parameters->params_count; indx++) { if ( mystreq(rtsp_data->parameters->params_array[indx].param_name,"decoder")) { val_len = strlen(rtsp_data->parameters->params_array[indx].param_value) + 1; rtsp_data->decoder_nm = mymalloc(val_len); snprintf(rtsp_data->decoder_nm, val_len , "%s",rtsp_data->parameters->params_array[indx].param_value); } if ( mystreq(rtsp_data->parameters->params_array[indx].param_name,"capture_rate")) { rtsp_data->capture_rate = atoi(rtsp_data->parameters->params_array[indx].param_value); } } /* If this is the norm and we have a highres, then disable passthru on the norm */ if ((!rtsp_data->high_resolution) && (cnt->conf.netcam_high_url)) { rtsp_data->passthrough = FALSE; } else { rtsp_data->passthrough = util_check_passthrough(cnt); } rtsp_data->interruptduration = 5; rtsp_data->interrupted = FALSE; if (gettimeofday(&rtsp_data->interruptstarttime, NULL) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "gettimeofday"); } if (gettimeofday(&rtsp_data->interruptcurrenttime, NULL) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "gettimeofday"); } if (gettimeofday(&rtsp_data->frame_curr_tm, NULL) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "gettimeofday"); } if (gettimeofday(&rtsp_data->frame_prev_tm, NULL) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "gettimeofday"); } snprintf(rtsp_data->threadname, 15, "%s",_("Unknown")); netcam_rtsp_set_path(cnt, rtsp_data); } static int netcam_rtsp_set_dimensions (struct context *cnt) { cnt->imgs.width = 0; cnt->imgs.height = 0; cnt->imgs.size_norm = 0; cnt->imgs.motionsize = 0; cnt->imgs.width_high = 0; cnt->imgs.height_high = 0; cnt->imgs.size_high = 0; if (cnt->conf.width % 8) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Image width (%d) requested is not modulo 8."), cnt->conf.width); cnt->conf.width = cnt->conf.width - (cnt->conf.width % 8) + 8; MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Adjusting width to next higher multiple of 8 (%d)."), cnt->conf.width); } if (cnt->conf.height % 8) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Image height (%d) requested is not modulo 8."), cnt->conf.height); cnt->conf.height = cnt->conf.height - (cnt->conf.height % 8) + 8; MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Adjusting height to next higher multiple of 8 (%d)."), cnt->conf.height); } /* Fill in camera details into context structure. */ cnt->imgs.width = cnt->conf.width; cnt->imgs.height = cnt->conf.height; cnt->imgs.size_norm = (cnt->conf.width * cnt->conf.height * 3) / 2; cnt->imgs.motionsize = cnt->conf.width * cnt->conf.height; return 0; } static int netcam_rtsp_copy_stream(struct rtsp_context *rtsp_data) { /* Make a static copy of the stream information for use in passthrough processing */ #if ( MYFFVER >= 57041) AVStream *transfer_stream, *stream_in; int retcd; pthread_mutex_lock(&rtsp_data->mutex_transfer); if (rtsp_data->transfer_format != NULL) { avformat_close_input(&rtsp_data->transfer_format); } rtsp_data->transfer_format = avformat_alloc_context(); transfer_stream = avformat_new_stream(rtsp_data->transfer_format, NULL); stream_in = rtsp_data->format_context->streams[rtsp_data->video_stream_index]; retcd = avcodec_parameters_copy(transfer_stream->codecpar, stream_in->codecpar); if (retcd < 0) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("Unable to copy codec parameters")); pthread_mutex_unlock(&rtsp_data->mutex_transfer); return -1; } transfer_stream->time_base = stream_in->time_base; pthread_mutex_unlock(&rtsp_data->mutex_transfer); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO, _("Stream copied for pass-through")); return 0; #else AVStream *transfer_stream, *stream_in; int retcd; pthread_mutex_lock(&rtsp_data->mutex_transfer); if (rtsp_data->transfer_format != NULL) { avformat_close_input(&rtsp_data->transfer_format); } rtsp_data->transfer_format = avformat_alloc_context(); transfer_stream = avformat_new_stream(rtsp_data->transfer_format, NULL); stream_in = rtsp_data->format_context->streams[rtsp_data->video_stream_index]; retcd = avcodec_copy_context(transfer_stream->codec, stream_in->codec); if (retcd < 0) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, _("Unable to copy codec parameters")); pthread_mutex_unlock(&rtsp_data->mutex_transfer); return -1; } transfer_stream->time_base = stream_in->time_base; pthread_mutex_unlock(&rtsp_data->mutex_transfer); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO, _("Stream copied for pass-through")); return 0; #endif } static int netcam_rtsp_open_context(struct rtsp_context *rtsp_data) { int retcd; char errstr[128]; if (rtsp_data->finish) { return -1; } if (rtsp_data->path == NULL) { if (rtsp_data->status == RTSP_NOTCONNECTED) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, _("Null path passed to connect")); } return -1; } rtsp_data->opts = NULL; rtsp_data->format_context = avformat_alloc_context(); rtsp_data->format_context->interrupt_callback.callback = netcam_rtsp_interrupt; rtsp_data->format_context->interrupt_callback.opaque = rtsp_data; rtsp_data->interrupted = FALSE; if (gettimeofday(&rtsp_data->interruptstarttime, NULL) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "gettimeofday"); } rtsp_data->interruptduration = 20; netcam_rtsp_set_options(rtsp_data); retcd = avformat_open_input(&rtsp_data->format_context, rtsp_data->path, NULL, &rtsp_data->opts); if ((retcd < 0) || (rtsp_data->interrupted) || (rtsp_data->finish)) { if (rtsp_data->status == RTSP_NOTCONNECTED) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("%s: Unable to open camera(%s): %s") , rtsp_data->cameratype, rtsp_data->camera_name, errstr); } av_dict_free(&rtsp_data->opts); if (rtsp_data->interrupted) { netcam_rtsp_close_context(rtsp_data); } return -1; } av_dict_free(&rtsp_data->opts); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Opened camera(%s)"), rtsp_data->cameratype, rtsp_data->camera_name); /* fill out stream information */ retcd = avformat_find_stream_info(rtsp_data->format_context, NULL); if ((retcd < 0) || (rtsp_data->interrupted) || (rtsp_data->finish)) { if (rtsp_data->status == RTSP_NOTCONNECTED) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("%s: Unable to find stream info: %s") ,rtsp_data->cameratype, errstr); } netcam_rtsp_close_context(rtsp_data); return -1; } /* there is no way to set the avcodec thread names, but they inherit * our thread name - so temporarily change our thread name to the * desired name */ util_threadname_get(rtsp_data->threadname); util_threadname_set("av",rtsp_data->threadnbr,rtsp_data->camera_name); retcd = netcam_rtsp_open_codec(rtsp_data); util_threadname_set(NULL, 0, rtsp_data->threadname); if ((retcd < 0) || (rtsp_data->interrupted) || (rtsp_data->finish)) { if (rtsp_data->status == RTSP_NOTCONNECTED) { av_strerror(retcd, errstr, sizeof(errstr)); MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("%s: Unable to open codec context: %s") ,rtsp_data->cameratype, errstr); } netcam_rtsp_close_context(rtsp_data); return -1; } if (rtsp_data->codec_context->width <= 0 || rtsp_data->codec_context->height <= 0) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("%s: Camera image size is invalid"),rtsp_data->cameratype); netcam_rtsp_close_context(rtsp_data); return -1; } if (rtsp_data->high_resolution) { rtsp_data->imgsize.width = rtsp_data->codec_context->width; rtsp_data->imgsize.height = rtsp_data->codec_context->height; } rtsp_data->frame = my_frame_alloc(); if (rtsp_data->frame == NULL) { if (rtsp_data->status == RTSP_NOTCONNECTED) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("%s: Unable to allocate frame."),rtsp_data->cameratype); } netcam_rtsp_close_context(rtsp_data); return -1; } if (rtsp_data->passthrough) { retcd = netcam_rtsp_copy_stream(rtsp_data); if ((retcd < 0) || (rtsp_data->interrupted)) { if (rtsp_data->status == RTSP_NOTCONNECTED) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("%s: Failed to copy stream for pass-through.") ,rtsp_data->cameratype); } rtsp_data->passthrough = FALSE; } } /* Validate that the previous steps opened the camera */ retcd = netcam_rtsp_read_image(rtsp_data); if ((retcd < 0) || (rtsp_data->interrupted)) { if (rtsp_data->status == RTSP_NOTCONNECTED) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("%s: Failed to read first image"),rtsp_data->cameratype); } netcam_rtsp_close_context(rtsp_data); return -1; } return 0; } static int netcam_rtsp_connect(struct rtsp_context *rtsp_data) { if (netcam_rtsp_open_context(rtsp_data) < 0) { return -1; } if (netcam_rtsp_ntc(rtsp_data) < 0) { return -1; } if (netcam_rtsp_read_image(rtsp_data) < 0) { return -1; } /* We use the status for determining whether to grab a image from * the Motion loop(see "next" function). When we are initially starting, * we open and close the context and during this process we do not want the * Motion loop to start quite yet on this first image so we do * not set the status to connected */ if (!rtsp_data->first_image) { rtsp_data->status = RTSP_CONNECTED; MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("%s: Camera (%s) connected") ,rtsp_data->cameratype,rtsp_data->camera_name); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Netcam capture_rate is %d.") ,rtsp_data->cameratype, rtsp_data->capture_rate); if (rtsp_data->src_fps > 0) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Camera source is %d FPS") ,rtsp_data->cameratype, rtsp_data->src_fps); } else { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("%s: Unable to determine the camera source FPS.") ,rtsp_data->cameratype); } if (rtsp_data->capture_rate < rtsp_data->src_fps) { MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO ,_("%s: capture_rate is less than camera FPS.") , rtsp_data->cameratype); MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO ,_("%s: Decoding errors will occur.") , rtsp_data->cameratype); MOTION_LOG(WRN, TYPE_NETCAM, NO_ERRNO , _("%s: capture_rate slightly larger than camera FPS is recommended.") , rtsp_data->cameratype); } } return 0; } static void netcam_rtsp_shutdown(struct rtsp_context *rtsp_data) { if (rtsp_data) { netcam_rtsp_close_context(rtsp_data); if (rtsp_data->path != NULL) { free(rtsp_data->path); } rtsp_data->path = NULL; if (rtsp_data->service != NULL) { free(rtsp_data->service); } rtsp_data->service = NULL; if (rtsp_data->img_latest != NULL) { free(rtsp_data->img_latest->ptr); free(rtsp_data->img_latest); } rtsp_data->img_latest = NULL; if (rtsp_data->img_recv != NULL) { free(rtsp_data->img_recv->ptr); free(rtsp_data->img_recv); } rtsp_data->img_recv = NULL; if (rtsp_data->decoder_nm != NULL) { free(rtsp_data->decoder_nm); } rtsp_data->decoder_nm = NULL; util_parms_free (rtsp_data->parameters); if (rtsp_data->parameters != NULL) { free(rtsp_data->parameters); } rtsp_data->parameters = NULL; } } static void netcam_rtsp_handler_wait(struct rtsp_context *rtsp_data) { long usec_maxrate, usec_delay; if (rtsp_data->capture_rate < 1 ) { rtsp_data->capture_rate = 1; } usec_maxrate = (1000000L / rtsp_data->capture_rate); if (gettimeofday(&rtsp_data->frame_curr_tm, NULL) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "gettimeofday"); } usec_delay = usec_maxrate - ((rtsp_data->frame_curr_tm.tv_sec - rtsp_data->frame_prev_tm.tv_sec) * 1000000L) - (rtsp_data->frame_curr_tm.tv_usec - rtsp_data->frame_prev_tm.tv_usec); if ((usec_delay > 0) && (usec_delay < 1000000L)) { SLEEP(0, usec_delay * 1000); } } static void netcam_rtsp_handler_reconnect(struct rtsp_context *rtsp_data) { int retcd; if ((rtsp_data->status == RTSP_CONNECTED) || (rtsp_data->status == RTSP_READINGIMAGE)) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("%s: Reconnecting with camera...."),rtsp_data->cameratype); } rtsp_data->status = RTSP_RECONNECTING; /* * The retry count of 100 is arbritrary. * We want to try many times quickly to not lose too much information * before we go into the long wait phase */ retcd = netcam_rtsp_connect(rtsp_data); if (retcd < 0) { if (rtsp_data->reconnect_count < 100) { rtsp_data->reconnect_count++; } else if (rtsp_data->reconnect_count == 100) { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("%s: Camera did not reconnect."), rtsp_data->cameratype); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("%s: Checking for camera every 10 seconds."),rtsp_data->cameratype); rtsp_data->reconnect_count++; SLEEP(10,0); } else { SLEEP(10,0); } } else { rtsp_data->reconnect_count = 0; } } static void *netcam_rtsp_handler(void *arg) { struct rtsp_context *rtsp_data = arg; rtsp_data->handler_finished = FALSE; util_threadname_set("nc",rtsp_data->threadnbr, rtsp_data->camera_name); pthread_setspecific(tls_key_threadnr, (void *)((unsigned long)rtsp_data->threadnbr)); MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("%s: Camera handler thread [%d] started") ,rtsp_data->cameratype, rtsp_data->threadnbr); while (!rtsp_data->finish) { if (!rtsp_data->format_context) { /* We must have disconnected. Try to reconnect */ if (gettimeofday(&rtsp_data->frame_prev_tm, NULL) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "gettimeofday"); } netcam_rtsp_handler_reconnect(rtsp_data); continue; } else { /* We think we are connected...*/ if (gettimeofday(&rtsp_data->frame_prev_tm, NULL) < 0) { MOTION_LOG(ERR, TYPE_NETCAM, SHOW_ERRNO, "gettimeofday"); } if (netcam_rtsp_read_image(rtsp_data) < 0) { if (!rtsp_data->finish) { /* Nope. We are not or got bad image. Reconnect*/ netcam_rtsp_handler_reconnect(rtsp_data); } continue; } netcam_rtsp_handler_wait(rtsp_data); } } MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Handler loop finished."),rtsp_data->cameratype); netcam_rtsp_shutdown(rtsp_data); SLEEP(1,0); /* Our thread is finished - decrement motion's thread count. */ pthread_mutex_lock(&global_lock); threads_running--; pthread_mutex_unlock(&global_lock); MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("netcam camera handler: finish set, exiting")); rtsp_data->handler_finished = TRUE; pthread_exit(NULL); } static int netcam_rtsp_start_handler(struct rtsp_context *rtsp_data) { int retcd, wait_counter; pthread_attr_t handler_attribute; pthread_mutex_init(&rtsp_data->mutex, NULL); pthread_mutex_init(&rtsp_data->mutex_pktarray, NULL); pthread_mutex_init(&rtsp_data->mutex_transfer, NULL); pthread_attr_init(&handler_attribute); pthread_attr_setdetachstate(&handler_attribute, PTHREAD_CREATE_DETACHED); pthread_mutex_lock(&global_lock); rtsp_data->threadnbr = ++threads_running; pthread_mutex_unlock(&global_lock); retcd = pthread_create(&rtsp_data->thread_id, &handler_attribute, &netcam_rtsp_handler, rtsp_data); if (retcd < 0) { MOTION_LOG(ALR, TYPE_NETCAM, SHOW_ERRNO ,_("%s: Error starting handler thread"),rtsp_data->cameratype); pthread_attr_destroy(&handler_attribute); return -1; } pthread_attr_destroy(&handler_attribute); /* Now give a few tries to check that an image has been captured. * This ensures that by the time the setup routine exits, the * handler is completely set up and has images available */ wait_counter = 60; while (wait_counter > 0) { pthread_mutex_lock(&rtsp_data->mutex); if (rtsp_data->img_latest->ptr != NULL) { wait_counter = -1; } pthread_mutex_unlock(&rtsp_data->mutex); if (wait_counter > 0) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Waiting for first image from the handler."),rtsp_data->cameratype); SLEEP(0,5000000); wait_counter--; } } return 0; } /********************************************************* * This ends the section of functions that rely upon FFmpeg ***********************************************************/ #endif /* End HAVE_FFMPEG */ int netcam_rtsp_setup(struct context *cnt) { #ifdef HAVE_FFMPEG int retcd; int indx_cam, indx_max; struct rtsp_context *rtsp_data; cnt->rtsp = NULL; cnt->rtsp_high = NULL; if (netcam_rtsp_set_dimensions(cnt) < 0) { return -1; } indx_cam = 1; if (cnt->conf.netcam_high_url) { indx_max = 2; } else { indx_max = 1; } while (indx_cam <= indx_max) { if (indx_cam == 1) { cnt->rtsp = rtsp_new_context(); if (cnt->rtsp == NULL) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("unable to create rtsp context")); return -1; } rtsp_data = cnt->rtsp; rtsp_data->high_resolution = FALSE; /* Set flag for this being the normal resolution camera */ } else { cnt->rtsp_high = rtsp_new_context(); if (cnt->rtsp_high == NULL) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("unable to create rtsp high context")); return -1; } rtsp_data = cnt->rtsp_high; rtsp_data->high_resolution = TRUE; /* Set flag for this being the high resolution camera */ } netcam_rtsp_null_context(rtsp_data); netcam_rtsp_set_parms(cnt, rtsp_data); if (netcam_rtsp_connect(rtsp_data) < 0) { return -1; } retcd = netcam_rtsp_read_image(rtsp_data); if (retcd < 0) { MOTION_LOG(CRT, TYPE_NETCAM, NO_ERRNO ,_("Failed trying to read first image - retval:%d"), retcd); rtsp_data->status = RTSP_NOTCONNECTED; return -1; } /* When running dual, there seems to be contamination across norm/high with codec functions. */ netcam_rtsp_close_context(rtsp_data); /* Close in this thread to open it again within handler thread */ rtsp_data->status = RTSP_RECONNECTING; /* Set as reconnecting to avoid excess messages when starting */ rtsp_data->first_image = FALSE; /* Set flag that we are not processing our first image */ /* For normal resolution, we resize the image to the config parms so we do not need * to set the dimension parameters here (it is done in the set_parms). For high res * we must get the dimensions from the first image captured */ if (rtsp_data->high_resolution) { cnt->imgs.width_high = rtsp_data->imgsize.width; cnt->imgs.height_high = rtsp_data->imgsize.height; } if (netcam_rtsp_start_handler(rtsp_data) < 0) { return -1; } indx_cam++; } return 0; #else /* No FFmpeg/Libav */ (void)cnt; MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO, _("No FFmpeg support")); return -1; #endif /* End #ifdef HAVE_FFMPEG */ } int netcam_rtsp_next(struct context *cnt, struct image_data *img_data) { #ifdef HAVE_FFMPEG /* This is called from the motion loop thread */ if ((cnt->rtsp->status == RTSP_RECONNECTING) || (cnt->rtsp->status == RTSP_NOTCONNECTED)) { return 1; } pthread_mutex_lock(&cnt->rtsp->mutex); netcam_rtsp_pktarray_resize(cnt, FALSE); memcpy(img_data->image_norm , cnt->rtsp->img_latest->ptr , cnt->rtsp->img_latest->used); img_data->idnbr_norm = cnt->rtsp->idnbr; pthread_mutex_unlock(&cnt->rtsp->mutex); if (cnt->rtsp_high) { if ((cnt->rtsp_high->status == RTSP_RECONNECTING) || (cnt->rtsp_high->status == RTSP_NOTCONNECTED)) { return 1; } pthread_mutex_lock(&cnt->rtsp_high->mutex); netcam_rtsp_pktarray_resize(cnt, TRUE); if (!cnt->rtsp_high->passthrough) { memcpy(img_data->image_high ,cnt->rtsp_high->img_latest->ptr ,cnt->rtsp_high->img_latest->used); } img_data->idnbr_high = cnt->rtsp_high->idnbr; pthread_mutex_unlock(&cnt->rtsp_high->mutex); } /* Rotate images if requested */ rotate_map(cnt, img_data); return 0; #else /* No FFmpeg/Libav */ (void)cnt; (void)img_data; return -1; #endif /* End #ifdef HAVE_FFMPEG */ } void netcam_rtsp_cleanup(struct context *cnt, int init_retry_flag) { #ifdef HAVE_FFMPEG /* * If the init_retry_flag is not set this function was * called while retrying the initial connection and there is * no camera-handler started yet and thread_running must * not be decremented. */ int wait_counter; int indx_cam, indx_max; struct rtsp_context *rtsp_data; indx_cam = 1; if (cnt->rtsp_high) { indx_max = 2; } else { indx_max = 1; } while (indx_cam <= indx_max) { if (indx_cam == 1) { rtsp_data = cnt->rtsp; } else { rtsp_data = cnt->rtsp_high; } if (rtsp_data) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("%s: Shutting down network camera."),rtsp_data->cameratype); /* Throw the finish flag in context and wait a bit for it to finish its work and close everything * This is shutting down the thread so for the moment, we are not worrying about the * cross threading and protecting these variables with mutex's */ rtsp_data->finish = TRUE; rtsp_data->interruptduration = 0; wait_counter = 0; while ((!rtsp_data->handler_finished) && (wait_counter < 10)) { SLEEP(1,0); wait_counter++; } if (!rtsp_data->handler_finished) { MOTION_LOG(ERR, TYPE_NETCAM, NO_ERRNO ,_("%s: No response from handler thread."),rtsp_data->cameratype); /* Last resort. Kill the thread. Not safe for posix but if no response, what to do...*/ /* pthread_kill(rtsp_data->thread_id); */ pthread_cancel(rtsp_data->thread_id); pthread_kill(rtsp_data->thread_id, SIGVTALRM); /* This allows the cancel to be processed */ if (!init_retry_flag) { pthread_mutex_lock(&global_lock); threads_running--; pthread_mutex_unlock(&global_lock); } } /* If we never connect we don't have a handler but we still need to clean up some */ netcam_rtsp_shutdown(rtsp_data); pthread_mutex_destroy(&rtsp_data->mutex); pthread_mutex_destroy(&rtsp_data->mutex_pktarray); pthread_mutex_destroy(&rtsp_data->mutex_transfer); free(rtsp_data); rtsp_data = NULL; if (indx_cam == 1) { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("Normal resolution: Shut down complete.")); } else { MOTION_LOG(NTC, TYPE_NETCAM, NO_ERRNO ,_("High resolution: Shut down complete.")); } } indx_cam++; } cnt->rtsp = NULL; cnt->rtsp_high = NULL; #else /* No FFmpeg/Libav */ (void)cnt; (void)init_retry_flag; return; #endif /* End #ifdef HAVE_FFMPEG */ } motion-release-4.6.0/src/netcam_rtsp.h000066400000000000000000000162271452402535500177400ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * netcam_rtsp.h * Headers associated with functions in the netcam_rtsp.c module. */ #ifndef _INCLUDE_NETCAM_RTSP_H #define _INCLUDE_NETCAM_RTSP_H struct context; struct image_data; enum RTSP_STATUS { RTSP_CONNECTED, /* The camera is currently connected */ RTSP_READINGIMAGE, /* Motion is reading a image from camera */ RTSP_NOTCONNECTED, /* The camera has never connected */ RTSP_RECONNECTING /* Motion is trying to reconnect to camera */ }; struct imgsize_context { int width; int height; }; #ifdef HAVE_FFMPEG struct packet_item{ AVPacket *packet; int64_t idnbr; int iskey; int iswritten; struct timeval timestamp_tv; }; struct rtsp_context { AVFormatContext *format_context; /* Main format context for the camera */ AVCodecContext *codec_context; /* Codec being sent from the camera */ AVStream *strm; AVFrame *frame; /* Reusable frame for images from camera */ AVFrame *swsframe_in; /* Used when resizing image sent from camera */ AVFrame *swsframe_out; /* Used when resizing image sent from camera */ struct SwsContext *swsctx; /* Context for the resizing of the image */ AVPacket *packet_recv; /* The packet that is currently being processed */ AVFormatContext *transfer_format; /* Format context just for transferring to pass-through */ struct packet_item *pktarray; /* Pointer to array of packets for passthru processing */ int pktarray_size; /* The number of packets in array. 1 based */ int pktarray_index; /* The index to the most current packet in array */ int64_t idnbr; /* A ID number to track the packet vs image */ AVDictionary *opts; /* AVOptions when opening the format context */ int swsframe_size; /* The size of the image after resizing */ int video_stream_index; /* Stream index associated with video from camera */ #if (MYFFVER >= 57083) enum AVHWDeviceType hw_type; enum AVPixelFormat hw_pix_fmt; AVBufferRef *hw_device_ctx; #endif my_AVCodec *decoder; enum RTSP_STATUS status; /* Status of whether the camera is connecting, closed, etc*/ struct timeval interruptstarttime; /* The time set before calling the av functions */ struct timeval interruptcurrenttime; /* Time during the interrupt to determine duration since start*/ int interruptduration; /* Seconds permitted before triggering a interrupt */ netcam_buff_ptr img_recv; /* The image buffer that is currently being processed */ netcam_buff_ptr img_latest; /* The most recent image buffer that finished processing */ int interrupted; /* Boolean for whether interrupt has been tripped */ int finish; /* Boolean for whether we are finishing the application */ int high_resolution; /* Boolean for whether this context is the Norm or High */ int handler_finished; /* Boolean for whether the handler is running or not */ int first_image; /* Boolean for whether we have captured the first image */ int passthrough; /* Boolean for whether we are doing pass-through processing */ char *path; /* The connection string to use for the camera */ char *service; /* String specifying the type of camera http, rtsp, v4l2 */ const char *camera_name; /* The name of the camera as provided in the config file */ char cameratype[30]; /* String specifying Normal or High for use in logging */ struct imgsize_context imgsize; /* The image size parameters */ int rtsp_uses_tcp; /* Flag from config for whether to use tcp transport */ int v4l2_palette; /* Palette from config for v4l2 devices */ int reconnect_count; /* Count of the times reconnection is tried*/ int src_fps; /* The fps provided from source*/ int capture_rate; /* The framerate for the capture rate*/ struct timeval frame_prev_tm; /* The time set before calling the av functions */ struct timeval frame_curr_tm; /* Time during the interrupt to determine duration since start*/ struct params_context *parameters; /* User specified parameters for the camera */ struct config *conf; /* Pointer to conf parms of parent cnt*/ char *decoder_nm; /* User requested decoder */ struct context *cnt; char threadname[16]; /* The thread name*/ int threadnbr; /* The thread number */ pthread_t thread_id; /* thread i.d. for a camera-handling thread (if required). */ pthread_mutex_t mutex; /* mutex used with conditional waits */ pthread_mutex_t mutex_transfer; /* mutex used with transferring stream info for pass-through */ pthread_mutex_t mutex_pktarray; /* mutex used with the packet array */ }; #else /* Do not have FFmpeg */ struct rtsp_context { int dummy; pthread_t thread_id; int handler_finished; }; #endif /* end HAVE_FFMPEG */ int netcam_rtsp_setup(struct context *cnt); int netcam_rtsp_next(struct context *cnt, struct image_data *img_data); void netcam_rtsp_cleanup(struct context *cnt, int init_retry_flag); #endif /* _INCLUDE_NETCAM_RTSP_H */ motion-release-4.6.0/src/netcam_wget.c000066400000000000000000000242471452402535500177120ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002 * Free Software Foundation, Inc. * * Additional Copyright (C) 2004-2005 Christopher Price, * Angel Carpintero, and other contributing authors. * * Major part of this file is reused code from GNU Wget. It has been * merged and modified for use in the program Motion which is also * released under the terms of the GNU General Public License. * */ #include "motion.h" #include "util.h" #include "netcam.h" #include "netcam_wget.h" #include #include #include #define MINVAL(x, y) ((x) < (y) ? (x) : (y)) /* This file contains the generic routines for work with headers. Currently they are used only by HTTP in http.c, but they can be used by anything that cares about RFC822-style headers. Header is defined in RFC2068, as quoted below. Note that this definition is not HTTP-specific -- it is virtually indistinguishable from the one given in RFC822 or RFC1036. message-header = field-name ":" [ field-value ] CRLF field-name = token field-value = *( field-content | LWS ) field-content = The public functions are header_get() and header_process(), which see. */ /* Get a header from read-buffer RBUF and return it in *HDR. As defined in RFC2068 and elsewhere, a header can be folded into multiple lines if the continuation line begins with a space or horizontal TAB. Also, this function will accept a header ending with just LF instead of CRLF. The header may be of arbitrary length; the function will allocate as much memory as necessary for it to fit. It need not contain a `:', thus you can use it to retrieve, say, HTTP status line. All trailing whitespace is stripped from the header, and it is zero-terminated. */ int header_get(netcam_context_ptr netcam, char **hdr, enum header_get_flags flags) { int i; int bufsize = 80; *hdr = mymalloc(bufsize); for (i = 0; 1; i++) { int res; /* #### Use DO_REALLOC? */ if (i > bufsize - 1) { *hdr = (char *)myrealloc(*hdr, (bufsize <<= 1), ""); } res = RBUF_READCHAR (netcam, *hdr + i); if (res == 1) { if ((*hdr)[i] == '\n') { if (!((flags & HG_NO_CONTINUATIONS) || i == 0 || (i == 1 && (*hdr)[0] == '\r'))) { char next; /* * If the header is non-empty, we need to check if * it continues on to the other line. We do that by * peeking at the next character. */ res = rbuf_peek(netcam, &next); if (res == 0) { (*hdr)[i] = '\0'; return HG_EOF; } else if (res == -1) { (*hdr)[i] = '\0'; return HG_ERROR; } /* If the next character is HT or SP, just continue. */ if (next == '\t' || next == ' ') { continue; } } /* * Strip trailing whitespace. (*hdr)[i] is the newline; * decrement I until it points to the last available * whitespace. */ while (i > 0 && isspace((*hdr)[i - 1])) { --i; } (*hdr)[i] = '\0'; break; } } else if (res == 0) { (*hdr)[i] = '\0'; return HG_EOF; } else { (*hdr)[i] = '\0'; return HG_ERROR; } } return HG_OK; } /** * header_process * * Check whether HEADER begins with NAME and, if yes, skip the `:' and * the whitespace, and call PROCFUN with the arguments of HEADER's * contents (after the `:' and space) and ARG. Otherwise, return 0. */ int header_process(const char *header, const char *name , int (*procfun)(const char *, void *), void *arg) { /* Check whether HEADER matches NAME. */ while (*name && (tolower (*name) == tolower (*header))) ++name, ++header; if (*name || *header++ != ':') { return 0; } header += skip_lws (header); return ((*procfun) (header, arg)); } /* Helper functions for use with header_process(). */ /** * header_extract_number * * Extract a long integer from HEADER and store it to CLOSURE. If an * error is encountered, return 0, else 1. */ int header_extract_number(const char *header, void *closure) { const char *p = header; long result; for (result = 0; isdigit (*p); p++) { result = 10 * result + (*p - '0'); } /* Failure if no number present. */ if (p == header) { return 0; } /* Skip trailing whitespace. */ p += skip_lws (p); /* We return the value, even if a format error follows. */ *(long *)closure = result; /* Indicate failure if trailing garbage is present. */ if (*p) { return 0; } return 1; } /** * header_strdup * * Strdup HEADER, and place the pointer to CLOSURE. */ int header_strdup(const char *header, void *closure) { *(char **)closure = mystrdup(header); return 1; } /** * skip_lws * Skip LWS (linear white space), if present. Returns number of * characters to skip. */ int skip_lws(const char *string) { const char *p = string; while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n') { ++p; } return p - string; } /** * motion_base64_encode * * Encode the string S of length LENGTH to base64 format and place it * to STORE. STORE will be 0-terminated, and must point to a writable * buffer of at least 1+BASE64_LENGTH(length) bytes. */ void motion_base64_encode(const char *s, char *store, int length) { /* Conversion table. */ static const char tbl[64] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; int i; unsigned char *p = (unsigned char *)store; /* Transform the 3x8 bits to 4x6 bits, as required by base64. */ for (i = 0; i < length; i += 3) { *p++ = tbl[s[0] >> 2]; *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)]; *p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)]; *p++ = tbl[s[2] & 0x3f]; s += 3; } /* Pad the result if necessary... */ if (i == length + 1) { *(p - 1) = '='; } else if (i == length + 2) { *(p - 1) = *(p - 2) = '='; } /* ...and zero-terminate it. */ *p = '\0'; } /** * strdupdelim */ char *strdupdelim(const char *beg, const char *end) { char *res = mymalloc(end - beg + 1); memcpy (res, beg, end - beg); res[end - beg] = '\0'; return res; } /** * http_process_type */ int http_process_type(const char *hdr, void *arg) { char **result = (char **)arg; /* Locate P on `;' or the terminating zero, whichever comes first. */ const char *p = strchr (hdr, ';'); if (!p) { p = hdr + strlen (hdr); } while (p > hdr && isspace (*(p - 1))) { --p; } *result = strdupdelim (hdr, p); return 1; } /** * rbuf_initialize * * This is a simple implementation of buffering IO-read functions. */ void rbuf_initialize(netcam_context_ptr netcam) { netcam->response->buffer_pos = netcam->response->buffer; netcam->response->buffer_left = 0; } int rbuf_read_bufferful(netcam_context_ptr netcam) { return netcam_recv(netcam, netcam->response->buffer, sizeof (netcam->response->buffer)); } /** * rbuf_peek * * Like rbuf_readchar(), only don't move the buffer position. */ int rbuf_peek(netcam_context_ptr netcam, char *store) { if (!netcam->response->buffer_left) { int res; rbuf_initialize(netcam); res = netcam_recv (netcam, netcam->response->buffer, sizeof (netcam->response->buffer)); if (res <= 0) { *store = '\0'; return res; } netcam->response->buffer_left = res; } *store = *netcam->response->buffer_pos; return 1; } /** * rbuf_flush * * Flush RBUF's buffer to WHERE. Flush MAXSIZE bytes at most. * Returns the number of bytes actually copied. If the buffer is * empty, 0 is returned. */ int rbuf_flush(netcam_context_ptr netcam, char *where, int maxsize) { if (!netcam->response->buffer_left) { return 0; } else { int howmuch = MINVAL ((int)netcam->response->buffer_left, maxsize); if (where) { memcpy(where, netcam->response->buffer_pos, howmuch); } netcam->response->buffer_left -= howmuch; netcam->response->buffer_pos += howmuch; return howmuch; } } /** * http_result_code * * Get the HTTP result code */ int http_result_code(const char *header) { char *cptr; /* Assure the header starts out right. */ if (strncmp(header, "HTTP", 4)) { return -1; } /* Find the space following the HTTP/1.x */ if ((cptr = strchr(header+4, ' ')) == NULL) { return -1; } return atoi(cptr + 1); } motion-release-4.6.0/src/netcam_wget.h000066400000000000000000000073561452402535500177210ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * netcam_wget.h * Headers associated with functions in the netcam_wget.c module. * Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002 * Free Software Foundation, Inc. * Copyright (C) 2004-2005 Christopher Price, * Angel Carpintero, and other contributing authors. * Major part of this file is reused code from GNU Wget. It has been * merged and modified for use in the program Motion which is also * released under the terms of the GNU General Public License. */ #ifndef NETCAM_WGET_H #define NETCAM_WGET_H #include "netcam.h" /* Retrieval stream */ struct rbuf { char buffer[4096]; /* the input buffer */ char *buffer_pos; /* current position in the buffer */ size_t buffer_left; /* number of bytes left in the buffer: buffer_left = buffer_end - buffer_pos */ int ret; /* used by RBUF_READCHAR macro */ }; /* Read a character from RBUF. If there is anything in the buffer, the character is returned from the buffer. Otherwise, refill the buffer and return the first character. The return value is the same as with read(2). On buffered read, the function returns 1. #### That return value is totally screwed up, and is a direct result of historical implementation of header code. The macro should return the character or EOF, and in case of error store it to rbuf->err or something. */ #define RBUF_READCHAR(netcam, store) \ ((netcam)->response->buffer_left ? (--(netcam)->response->buffer_left, \ *((char *) (store)) = *(netcam)->response->buffer_pos++, 1) \ : ((netcam)->response->buffer_pos = (netcam)->response->buffer, \ ((((netcam)->response->ret = rbuf_read_bufferful (netcam)) <= 0) \ ? (netcam)->response->ret : ((netcam)->response->buffer_left = (netcam->response)->ret - 1, \ *((char *) (store)) = *(netcam)->response->buffer_pos++,1)))) /* Function declarations */ void rbuf_initialize(netcam_context_ptr netcam); int rbuf_initialized_p(netcam_context_ptr); void rbuf_uninitialize(netcam_context_ptr); int rbuf_readchar(netcam_context_ptr, char *); int rbuf_peek(netcam_context_ptr netcam, char *store); int rbuf_flush(netcam_context_ptr netcam, char *where, int maxsize); /* Internal, but used by the macro. */ int rbuf_read_bufferful(netcam_context_ptr); /* How many bytes it will take to store LEN bytes in base64. */ #define BASE64_LENGTH(len) (4 * (((len) + 2) / 3)) void motion_base64_encode(const char *, char *, int); char *strdupdelim(const char *, const char *); int http_process_type(const char *, void *); enum { HG_OK, HG_ERROR, HG_EOF }; enum header_get_flags{ HG_NONE = 0, HG_NO_CONTINUATIONS = 0x2 }; int header_get(netcam_context_ptr netcam, char **hdr, enum header_get_flags flags); int header_process(const char *header, const char *name , int (*procfun)(const char *, void *), void *arg); int header_extract_number(const char *header, void *closure); int header_strdup(const char *header, void *closure); int skip_lws(const char *string); int http_result_code(const char *header); #endif /* NETCAM_WGET_H */ motion-release-4.6.0/src/picture.c000066400000000000000000001002451452402535500170610ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* picture.c * * Various funtions for saving/loading pictures. * Copyright 2002 by Jeroen Vreeken (pe1rxq@amsat.org) * Portions of this file are Copyright by Lionnel Maugis * Portions of this file are Copyright 2010 by Wim Lewis (wiml@hhhh.org) * */ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include "picture.h" #include "jpegutils.h" #include "event.h" #include "netcam.h" #include #ifdef HAVE_WEBP #include #include #endif /* HAVE_WEBP */ /* EXIF image data is always in TIFF format, even if embedded in another * file type. This consists of a constant header (TIFF file header, * IFD header) followed by the tags in the IFD and then the data * from any tags which do not fit inline in the IFD. * * The tags we write in the main IFD are: * 0x010E Image description * 0x8769 Exif sub-IFD * 0x882A Time zone of time stamps * and in the Exif sub-IFD: * 0x9000 Exif version * 0x9003 File date and time * 0x9291 File date and time subsecond info * But we omit any empty IFDs. */ #define TIFF_TAG_IMAGE_DESCRIPTION 0x010E #define TIFF_TAG_DATETIME 0x0132 #define TIFF_TAG_EXIF_IFD 0x8769 #define TIFF_TAG_TZ_OFFSET 0x882A #define EXIF_TAG_EXIF_VERSION 0x9000 #define EXIF_TAG_ORIGINAL_DATETIME 0x9003 #define EXIF_TAG_SUBJECT_AREA 0x9214 #define EXIF_TAG_TIFF_DATETIME_SS 0x9290 #define EXIF_TAG_ORIGINAL_DATETIME_SS 0x9291 #define TIFF_TYPE_ASCII 2 /* ASCII text */ #define TIFF_TYPE_USHORT 3 /* Unsigned 16-bit int */ #define TIFF_TYPE_LONG 4 /* Unsigned 32-bit int */ #define TIFF_TYPE_UNDEF 7 /* Byte blob */ #define TIFF_TYPE_SSHORT 8 /* Signed 16-bit int */ static const char exif_marker_start[14] = { 'E', 'x', 'i', 'f', 0, 0, /* EXIF marker signature */ 'M', 'M', 0, 42, /* TIFF file header (big-endian) */ 0, 0, 0, 8, /* Offset to first toplevel IFD */ }; static const char exif_version_tag[12] = { 0x90, 0x00, /* EXIF version tag, 0x9000 */ 0x00, 0x07, /* Data type 7 = "unknown" (raw byte blob) */ 0x00, 0x00, 0x00, 0x04, /* Data length */ 0x30, 0x32, 0x32, 0x30 /* Inline data, EXIF version 2.2 */ }; static const char exif_subifd_tag[8] = { 0x87, 0x69, /* EXIF Sub-IFD tag */ 0x00, 0x04, /* Data type 4 = uint32 */ 0x00, 0x00, 0x00, 0x01, /* Number of values */ }; static const char exif_tzoffset_tag[12] = { 0x88, 0x2A, /* TIFF/EP time zone offset tag */ 0x00, 0x08, /* Data type 8 = sint16 */ 0x00, 0x00, 0x00, 0x01, /* Number of values */ 0, 0, 0, 0 /* Dummy data */ }; static void put_uint16(JOCTET *buf, unsigned value) { buf[0] = ( value & 0xFF00 ) >> 8; buf[1] = ( value & 0x00FF ); } static void put_sint16(JOCTET *buf, int value) { buf[0] = ( value & 0xFF00 ) >> 8; buf[1] = ( value & 0x00FF ); } static void put_uint32(JOCTET *buf, unsigned value) { buf[0] = ( value & 0xFF000000 ) >> 24; buf[1] = ( value & 0x00FF0000 ) >> 16; buf[2] = ( value & 0x0000FF00 ) >> 8; buf[3] = ( value & 0x000000FF ); } struct tiff_writing { JOCTET * const base; JOCTET *buf; unsigned data_offset; }; static void put_direntry(struct tiff_writing *into, const char *data, unsigned length) { if (length <= 4) { /* Entries that fit in the directory entry are stored there */ memset(into->buf, 0, 4); memcpy(into->buf, data, length); } else { /* Longer entries are stored out-of-line */ unsigned offset = into->data_offset; while ((offset & 0x03) != 0) { /* Alignment */ into->base[offset] = 0; offset ++; } put_uint32(into->buf, offset); memcpy(into->base + offset, data, length); into->data_offset = offset + length; } } static void put_stringentry(struct tiff_writing *into, unsigned tag, const char *str, int with_nul) { unsigned stringlength = strlen(str) + (with_nul?1:0); put_uint16(into->buf, tag); put_uint16(into->buf + 2, TIFF_TYPE_ASCII); put_uint32(into->buf + 4, stringlength); into->buf += 8; put_direntry(into, str, stringlength); into->buf += 4; } static void put_subjectarea(struct tiff_writing *into, const struct coord *box) { put_uint16(into->buf , EXIF_TAG_SUBJECT_AREA); put_uint16(into->buf + 2, TIFF_TYPE_USHORT); put_uint32(into->buf + 4, 4 /* Four USHORTs */); put_uint32(into->buf + 8, into->data_offset); into->buf += 12; JOCTET *ool = into->base + into->data_offset; put_uint16(ool , box->x); /* Center.x */ put_uint16(ool+2, box->y); /* Center.y */ put_uint16(ool+4, box->width); put_uint16(ool+6, box->height); into->data_offset += 8; } /* * prepare_exif() is a comon function used to prepare * exif data to be inserted into jpeg or webp files * */ unsigned prepare_exif(unsigned char **exif, const struct context *cnt , const struct timeval *tv_in1, const struct coord *box) { /* description, datetime, and subtime are the values that are actually * put into the EXIF data */ char *description, *datetime, *subtime; char datetime_buf[22]; struct tm timestamp_tm; struct timeval tv1; gettimeofday(&tv1, NULL); if (tv_in1 != NULL) { tv1.tv_sec = tv_in1->tv_sec; tv1.tv_usec = tv_in1->tv_usec; } localtime_r(&tv1.tv_sec, ×tamp_tm); /* Exif requires this exact format */ snprintf(datetime_buf, 21, "%04d:%02d:%02d %02d:%02d:%02d", (timestamp_tm.tm_year + 1900) & 0xffff, (timestamp_tm.tm_mon + 1) & 0x0f, timestamp_tm.tm_mday, timestamp_tm.tm_hour, timestamp_tm.tm_min, timestamp_tm.tm_sec); datetime = datetime_buf; // TODO: Extract subsecond timestamp from somewhere, but only // use as much of it as is indicated by conf->frame_limit subtime = NULL; if (cnt->conf.picture_exif) { description = malloc(PATH_MAX); mystrftime(cnt, description, PATH_MAX-1, cnt->conf.picture_exif, &tv1, NULL, 0); } else { description = NULL; } /* Calculate an upper bound on the size of the APP1 marker so * we can allocate a buffer for it. */ /* Count up the number of tags and max amount of OOL data */ int ifd0_tagcount = 0; int ifd1_tagcount = 0; unsigned datasize = 0; if (description) { ifd0_tagcount ++; datasize += 5 + strlen(description); /* Add 5 for NUL and alignment */ } if (datetime) { /* We write this to both the TIFF datetime tag (which most programs * treat as "last-modified-date") and the EXIF "time of creation of * original image" tag (which many programs ignore). This is * redundant but seems to be the thing to do. */ ifd0_tagcount++; ifd1_tagcount++; /* We also write the timezone-offset tag in IFD0 */ ifd0_tagcount++; /* It would be nice to use the same offset for both tags' values, * but I don't want to write the bookkeeping for that right now */ datasize += 2 * (5 + strlen(datetime)); } if (subtime) { ifd1_tagcount++; datasize += 5 + strlen(subtime); } if (box) { ifd1_tagcount++; datasize += 2 * 4; /* Four 16-bit ints */ } if (ifd1_tagcount > 0) { /* If we're writing the Exif sub-IFD, account for the * two tags that requires */ ifd0_tagcount ++; /* The tag in IFD0 that points to IFD1 */ ifd1_tagcount ++; /* The EXIF version tag */ } /* Each IFD takes 12 bytes per tag, plus six more (the tag count and the * pointer to the next IFD, always zero in our case) */ int ifds_size = ( ifd1_tagcount > 0 ? ( 12 * ifd1_tagcount + 6 ) : 0 ) + ( ifd0_tagcount > 0 ? ( 12 * ifd0_tagcount + 6 ) : 0 ); if (ifds_size == 0) { /* We're not actually going to write any information. */ return 0; } unsigned int buffer_size = 6 /* EXIF marker signature */ + 8 /* TIFF file header */ + ifds_size /* the tag directories */ + datasize; JOCTET *marker = malloc(buffer_size); memcpy(marker, exif_marker_start, 14); /* EXIF and TIFF headers */ struct tiff_writing writing = (struct tiff_writing) { .base = marker + 6, /* base address for intra-TIFF offsets */ .buf = marker + 14, /* current write position */ .data_offset = 8 + ifds_size, /* where to start storing data */ }; /* Write IFD 0 */ /* Note that tags are stored in numerical order */ put_uint16(writing.buf, ifd0_tagcount); writing.buf += 2; if (description) { put_stringentry(&writing, TIFF_TAG_IMAGE_DESCRIPTION, description, 1); } if (datetime) { put_stringentry(&writing, TIFF_TAG_DATETIME, datetime, 1); } if (ifd1_tagcount > 0) { /* Offset of IFD1 - TIFF header + IFD0 size. */ unsigned ifd1_offset = 8 + 6 + ( 12 * ifd0_tagcount ); memcpy(writing.buf, exif_subifd_tag, 8); put_uint32(writing.buf + 8, ifd1_offset); writing.buf += 12; } if (datetime) { memcpy(writing.buf, exif_tzoffset_tag, 12); put_sint16(writing.buf+8, timestamp_tm.tm_gmtoff / 3600); writing.buf += 12; } put_uint32(writing.buf, 0); /* Next IFD offset = 0 (no next IFD) */ writing.buf += 4; /* Write IFD 1 */ if (ifd1_tagcount > 0) { /* (remember that the tags in any IFD must be in numerical order * by tag) */ put_uint16(writing.buf, ifd1_tagcount); memcpy(writing.buf + 2, exif_version_tag, 12); /* tag 0x9000 */ writing.buf += 14; if (datetime) { put_stringentry(&writing, EXIF_TAG_ORIGINAL_DATETIME, datetime, 1); } if (box) { put_subjectarea(&writing, box); } if (subtime) { put_stringentry(&writing, EXIF_TAG_ORIGINAL_DATETIME_SS, subtime, 0); } put_uint32(writing.buf, 0); /* Next IFD = 0 (no next IFD) */ writing.buf += 4; } /* We should have met up with the OOL data */ assert( (writing.buf - writing.base) == 8 + ifds_size ); /* The buffer is complete; write it out */ unsigned marker_len = 6 + writing.data_offset; /* assert we didn't underestimate the original buffer size */ assert(marker_len <= buffer_size); free(description); *exif = marker; return marker_len; } #ifdef HAVE_WEBP /* * put_webp_exif writes the EXIF APP1 chunk to the webp file. * It must be called after WebPEncode() and the result * can then be written out to webp a file */ static void put_webp_exif(WebPMux* webp_mux, const struct context *cnt , const struct timeval *tv1, const struct coord *box) { unsigned char *exif = NULL; unsigned exif_len = prepare_exif(&exif, cnt, tv1, box); if(exif_len > 0) { WebPData webp_exif; /* EXIF in WEBP does not need the EXIF marker signature (6 bytes) that are needed by jpeg */ webp_exif.bytes = exif + 6; webp_exif.size = exif_len - 6; WebPMuxError err = WebPMuxSetChunk(webp_mux, "EXIF", &webp_exif, 1); if (err != WEBP_MUX_OK) { MOTION_LOG(ERR, TYPE_CORE, NO_ERRNO , _("Unable to set set EXIF to webp chunk")); } free(exif); } } #endif /* HAVE_WEBP */ /** * put_webp_yuv420p_file * Converts an YUV420P coded image to a webp image and writes * it to an already open file. * * Inputs: * - image is the image in YUV420P format. * - width and height are the dimensions of the image * - quality is the webp encoding quality 0-100% * * Output: * - The webp is written directly to the file given by the file pointer fp * * Returns nothing */ static void put_webp_yuv420p_file(FILE *fp, unsigned char *image, int width, int height , int quality, struct context *cnt, struct timeval *tv1, struct coord *box) { #ifdef HAVE_WEBP /* Create a config present and check for compatible library version */ WebPConfig webp_config; if (!WebPConfigPreset(&webp_config, WEBP_PRESET_DEFAULT, (float) quality)) { MOTION_LOG(ERR, TYPE_CORE, NO_ERRNO, _("libwebp version error")); return; } /* Create the input data structure and check for compatible library version */ WebPPicture webp_image; if (!WebPPictureInit(&webp_image)) { MOTION_LOG(ERR, TYPE_CORE, NO_ERRNO,_("libwebp version error")); return; } /* Allocate the image buffer based on image width and height */ webp_image.width = width; webp_image.height = height; if (!WebPPictureAlloc(&webp_image)) { MOTION_LOG(ERR, TYPE_CORE, NO_ERRNO,_("libwebp image buffer allocation error")); return; } /* Map the input YUV420P buffer as individual Y, U and V pointers */ webp_image.y = image; webp_image.u = image + width * height; webp_image.v = webp_image.u + (width * height) / 4; /* Setup the memory writting method */ WebPMemoryWriter webp_writer; WebPMemoryWriterInit(&webp_writer); webp_image.writer = WebPMemoryWrite; webp_image.custom_ptr = (void*) &webp_writer; /* Encode the YUV image as webp */ if (!WebPEncode(&webp_config, &webp_image)) { MOTION_LOG(WRN, TYPE_CORE, NO_ERRNO,_("libwebp image compression error")); } /* A bitstream object is needed for the muxing proces */ WebPData webp_bitstream; webp_bitstream.bytes = webp_writer.mem; webp_bitstream.size = webp_writer.size; /* Create a mux from the prepared image data */ WebPMux* webp_mux = WebPMuxCreate(&webp_bitstream, 1); put_webp_exif(webp_mux, cnt, tv1, box); /* Add Exif data to the webp image data */ WebPData webp_output; WebPMuxError err = WebPMuxAssemble(webp_mux, &webp_output); if (err != WEBP_MUX_OK) { MOTION_LOG(ERR, TYPE_CORE, NO_ERRNO,_("unable to assemble webp image")); } /* Write the webp final bitstream to the file */ if (fwrite(webp_output.bytes, sizeof(uint8_t), webp_output.size, fp) != webp_output.size) { MOTION_LOG(ERR, TYPE_CORE, NO_ERRNO,_("unable to save webp image to file")); } #if WEBP_ENCODER_ABI_VERSION > 0x0202 /* writer.mem must be freed by calling WebPMemoryWriterClear */ WebPMemoryWriterClear(&webp_writer); #else /* writer.mem must be freed by calling 'free(writer.mem)' */ free(webp_writer.mem); #endif /* WEBP_ENCODER_ABI_VERSION */ /* free the memory used by webp for image data */ WebPPictureFree(&webp_image); /* free the memory used by webp mux object */ WebPMuxDelete(webp_mux); /* free the memory used by webp for output data */ WebPDataClear(&webp_output); #else (void)fp; (void)image; (void)width; (void)height; (void)quality; (void)cnt; (void)tv1; (void)box; #endif /* HAVE_WEBP */ } /** * put_jpeg_yuv420p_file * Converts an YUV420P coded image to a jpeg image and writes * it to an already open file. * * Inputs: * - image is the image in YUV420P format. * - width and height are the dimensions of the image * - quality is the jpeg encoding quality 0-100% * * Output: * - The jpeg is written directly to the file given by the file pointer fp * * Returns nothing */ static void put_jpeg_yuv420p_file(FILE *fp, unsigned char *image, int width, int height , int quality, struct context *cnt, struct timeval *tv1, struct coord *box) { int sz, image_size; image_size = (width * height * 3)/2; unsigned char *buf = mymalloc(image_size); sz = jpgutl_put_yuv420p(buf, image_size, image, width, height, quality, cnt ,tv1, box); fwrite(buf, sz, 1, fp); free(buf); } /** * put_jpeg_grey_file * Converts an greyscale image to a jpeg image and writes * it to an already open file. * * Inputs: * - image is the image in greyscale format. * - width and height are the dimensions of the image * - quality is the jpeg encoding quality 0-100% * Output: * - The jpeg is written directly to the file given by the file pointer fp * * Returns nothing */ static void put_jpeg_grey_file(FILE *picture, unsigned char *image, int width, int height, int quality, struct context *cnt, struct timeval *tv1, struct coord *box) { int sz, image_size; image_size = (width * height * 3)/2; unsigned char *buf = mymalloc(image_size); sz = jpgutl_put_grey(buf, image_size, image, width, height, quality, cnt ,tv1, box); fwrite(buf, sz, 1, picture); free(buf); } /** * put_ppm_bgr24_file * Converts an greyscale image to a PPM image and writes * it to an already open file. * Inputs: * - image is the image in YUV420P format. * - width and height are the dimensions of the image * * Output: * - The PPM is written directly to the file given by the file pointer fp * * Returns nothing */ static void put_ppm_bgr24_file(FILE *picture, unsigned char *image, int width, int height) { int x, y; unsigned char *l = image; unsigned char *u = image + width * height; unsigned char *v = u + (width * height) / 4; int r, g, b; unsigned char rgb[3]; /* * ppm header * width height * maxval */ fprintf(picture, "P6\n"); fprintf(picture, "%d %d\n", width, height); fprintf(picture, "%d\n", 255); for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { r = 76283 * (((int)*l) - 16)+104595*(((int)*u) - 128); g = 76283 * (((int)*l) - 16)- 53281*(((int)*u) - 128) - 25625 * (((int)*v) - 128); b = 76283 * (((int)*l) - 16) + 132252 * (((int)*v) - 128); r = r >> 16; g = g >> 16; b = b >> 16; if (r < 0) { r = 0; } else if (r > 255) { r = 255; } if (g < 0) { g = 0; } else if (g > 255) { g = 255; } if (b < 0) { b = 0; } else if (b > 255) { b = 255; } rgb[0] = b; rgb[1] = g; rgb[2] = r; l++; if (x%2 != 0) { u++; v++; } /* ppm is rgb not bgr */ fwrite(rgb, 1, 3, picture); } if (y%2 == 0) { u -= width / 2; v -= width / 2; } } } /** * overlay_smartmask * Copies smartmask as an overlay into motion images and movies. * * Returns nothing. */ void overlay_smartmask(struct context *cnt, unsigned char *out) { int i, x, v, width, height, line; struct images *imgs = &cnt->imgs; unsigned char *smartmask = imgs->smartmask_final; unsigned char *out_y, *out_u, *out_v; i = imgs->motionsize; v = i + ((imgs->motionsize) / 4); width = imgs->width; height = imgs->height; /* Set V to 255 to make smartmask appear red. */ out_v = out + v; out_u = out + i; for (i = 0; i < height; i += 2) { line = i * width; for (x = 0; x < width; x += 2) { if (smartmask[line + x] == 0 || smartmask[line + x + 1] == 0 || smartmask[line + width + x] == 0 || smartmask[line + width + x + 1] == 0) { *out_v = 255; *out_u = 128; } out_v++; out_u++; } } out_y = out; /* Set colour intensity for smartmask. */ for (i = 0; i < imgs->motionsize; i++) { if (smartmask[i] == 0) { *out_y = 0; } out_y++; } } /** * overlay_fixed_mask * Copies fixed mask as green overlay into motion images and movies. * * Returns nothing. */ void overlay_fixed_mask(struct context *cnt, unsigned char *out) { int i, x, v, width, height, line; struct images *imgs = &cnt->imgs; unsigned char *mask = imgs->mask; unsigned char *out_y, *out_u, *out_v; i = imgs->motionsize; v = i + ((imgs->motionsize) / 4); width = imgs->width; height = imgs->height; /* Set U and V to 0 to make fixed mask appear green. */ out_v = out + v; out_u = out + i; for (i = 0; i < height; i += 2) { line = i * width; for (x = 0; x < width; x += 2) { if (mask[line + x] == 0 || mask[line + x + 1] == 0 || mask[line + width + x] == 0 || mask[line + width + x + 1] == 0) { *out_v = 0; *out_u = 0; } out_v++; out_u++; } } out_y = out; /* Set colour intensity for mask. */ for (i = 0; i < imgs->motionsize; i++) { if (mask[i] == 0) { *out_y = 0; } out_y++; } } /** * overlay_largest_label * Copies largest label as an overlay into motion images and movies. * * Returns nothing. */ void overlay_largest_label(struct context *cnt, unsigned char *out) { int i, x, v, width, height, line; struct images *imgs = &cnt->imgs; int *labels = imgs->labels; unsigned char *out_y, *out_u, *out_v; i = imgs->motionsize; v = i + ((imgs->motionsize) / 4); width = imgs->width; height = imgs->height; /* Set U to 255 to make label appear blue. */ out_u = out + i; out_v = out + v; for (i = 0; i < height; i += 2) { line = i * width; for (x = 0; x < width; x += 2) { if (labels[line + x] & 32768 || labels[line + x + 1] & 32768 || labels[line + width + x] & 32768 || labels[line + width + x + 1] & 32768) { *out_u = 255; *out_v = 128; } out_u++; out_v++; } } out_y = out; /* Set intensity for coloured label to have better visibility. */ for (i = 0; i < imgs->motionsize; i++) { if (*labels++ & 32768) { *out_y = 0; } out_y++; } } /** * put_picture_mem * Is used for the webcam feature. Depending on the image type * (colour YUV420P or greyscale) the corresponding put_jpeg_X_memory function is called. * Inputs: * - cnt is the thread context struct * - image_size is the size of the input image buffer * - *image points to the image buffer that contains the YUV420P or Grayscale image about to be put * - quality is the jpeg quality setting from the config file. * * Output: * - **dest_image is a pointer to a pointer that points to the destination buffer in which the * converted image it put * * Returns the dest_image_size if successful. Otherwise 0. */ int put_picture_memory(struct context *cnt, unsigned char* dest_image, int image_size , unsigned char *image, int quality, int width, int height) { struct timeval tv1; /* * Reset the time for the current image since it is not reliable * for putting images to memory. */ gettimeofday(&tv1, NULL); if (!cnt->conf.stream_grey) { return jpgutl_put_yuv420p(dest_image, image_size, image, width, height, quality, cnt ,&tv1,NULL); } else { return jpgutl_put_grey(dest_image, image_size, image, width, height, quality, cnt,&tv1,NULL); } return 0; } static void put_picture_fd(struct context *cnt, FILE *picture, unsigned char *image , int quality, int ftype) { int width, height, passthrough; passthrough = util_check_passthrough(cnt); if (((ftype == FTYPE_IMAGE) || (ftype == FTYPE_IMAGE_SNAPSHOT)) && (cnt->imgs.size_high > 0) && (!passthrough)) { width = cnt->imgs.width_high; height = cnt->imgs.height_high; } else { width = cnt->imgs.width; height = cnt->imgs.height; } if (cnt->imgs.picture_type == IMAGE_TYPE_PPM) { put_ppm_bgr24_file(picture, image, width, height); } else if (cnt->imgs.picture_type == IMAGE_TYPE_WEBP) { put_webp_yuv420p_file(picture, image, width, height, quality, cnt , &(cnt->current_image->timestamp_tv), &(cnt->current_image->location)); } else if (cnt->imgs.picture_type == IMAGE_TYPE_GREY) { put_jpeg_grey_file(picture, image, width, height, quality, cnt , &(cnt->current_image->timestamp_tv), &(cnt->current_image->location)); } else { put_jpeg_yuv420p_file(picture, image, width, height, quality, cnt , &(cnt->current_image->timestamp_tv), &(cnt->current_image->location)); } } void put_picture(struct context *cnt, char *file, unsigned char *image, int ftype) { FILE *picture; picture = myfopen(file, "wbe"); if (!picture) { /* Report to syslog - suggest solution if the problem is access rights to target dir. */ if (errno == EACCES) { MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO ,_("Can't write picture to file %s - check access rights to target directory\n" "Thread is going to finish due to this fatal error"), file); cnt->finish = 1; cnt->restart = 0; return; } else { /* If target dir is temporarily unavailable we may survive. */ MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO ,_("Can't write picture to file %s"), file); return; } } put_picture_fd(cnt, picture, image, cnt->conf.picture_quality, ftype); myfclose(picture); } /** * get_pgm * Get the pgm file used as fixed mask * */ unsigned char *get_pgm(FILE *picture, int width, int height) { int x, y, mask_width, mask_height, maxval; unsigned char *image, *resized_image; char byte, magic[256], w[256], h[256], mx[256]; int vars, comment, retcd, indx; memset(&magic,0,255); memset(&w,0,255); memset(&h, 0, 255); memset(&mx, 0, 255); //CR = 0x0D , LF = '0x0A' space = 0x20, # = 0x23, tab = 0x09 vars = 0; comment = 0; indx= 0; retcd = 1; while (retcd != 0) { retcd = fread(&byte, 1, 1, picture); if (retcd !=0) { if (comment == 0) { /* Not in a comment */ if (byte == 0x23) { /* Start of a comment */ comment = 1; } else if ((byte == 0x0d) || (byte == 0x0a) || (byte == 0x20) || (byte == 0x09)) { /* White space, reset indx */ indx = 0; if (vars == 4) { retcd = 0; } } else { /* All other characters */ if (indx == 0) { vars++; } if (vars == 1) { magic[indx] = byte; indx++; } else if (vars == 2) { w[indx] = byte; indx++; } else if (vars == 3) { h[indx] = byte; indx++; } else if (vars == 4) { mx[indx] = byte; indx++; } } } else { /* Processing a comment */ if ((byte == 0x0d) || (byte == 0x0a)) { /* End of line for the comment */ comment = 0; } } } } if (vars != 4) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error getting PGM vars.")); return NULL; } if (mystrne(magic,"P5")) { MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO ,_("This is not a pgm file, starts with '%s'"), magic); return NULL; } mask_width = atoi(w); mask_height = atoi(h); maxval = atoi(mx); MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO , _("Magic %s: Width %s(%d): Height %s(%d): MaxVal: %s(%d)") , magic, w, mask_width, h, mask_height, mx, maxval); /* Read data into image*/ image = mymalloc((mask_width * mask_height * 3) / 2); for (y = 0; y < mask_height; y++) { if ((int)fread(&image[y * mask_width], 1, mask_width, picture) != mask_width) { MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO, _("Failed reading image data from pgm file")); } for (x = 0; x < mask_width; x++) { image[y * mask_width + x] = (int)image[y * mask_width + x] * 255 / maxval; } } /* Resize mask if required */ if (mask_width != width || mask_height != height) { MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("The mask file specified is not the same size as image from camera.")); MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("Attempting to resize mask image from %dx%d to %dx%d") ,mask_width, mask_height, width, height); resized_image = mymalloc((width * height * 3) / 2); for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { resized_image[y * width + x] = image[ (mask_height - 1) * y / (height - 1) * mask_width + (mask_width - 1) * x / (width - 1)]; } } free(image); image = resized_image; } return image; } /** * put_fixed_mask * If a mask file is asked for but does not exist this function * creates an empty mask file in the right binary pgm format and * and the right size - easy to edit with Gimp or similar tool. * * Returns nothing. */ void put_fixed_mask(struct context *cnt, const char *file) { FILE *picture; picture = myfopen(file, "wbe"); if (!picture) { /* Report to syslog - suggest solution if the problem is access rights to target dir. */ if (errno == EACCES) { MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO ,_("can't write mask file %s - check access rights to target directory") ,file); } else { /* If target dir is temporarily unavailable we may survive. */ MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO ,_("can't write mask file %s"), file); } return; } memset(cnt->imgs.img_motion.image_norm, 255, cnt->imgs.motionsize); /* Initialize to unset */ /* Write pgm-header. */ fprintf(picture, "P5\n"); fprintf(picture, "%d %d\n", cnt->conf.width, cnt->conf.height); fprintf(picture, "%d\n", 255); /* Write pgm image data at once. */ if ((int)fwrite(cnt->imgs.img_motion.image_norm, cnt->conf.width, cnt->conf.height, picture) != cnt->conf.height) { MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO ,_("Failed writing default mask as pgm file")); return; } myfclose(picture); MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Creating empty mask %s\nPlease edit this file and " "re-run motion to enable mask feature"), cnt->conf.mask_file); } void pic_scale_img(int width_src, int height_src, unsigned char *img_src, unsigned char *img_dst) { int i = 0, x, y; for (y = 0; y < height_src; y+=2) { for (x = 0; x < width_src; x+=2) { img_dst[i++] = img_src[y * width_src + x]; } } for (y = 0; y < height_src / 2; y+=2) { for (x = 0; x < width_src; x += 4) { img_dst[i++] = img_src[(width_src * height_src) + (y * width_src) + x]; img_dst[i++] = img_src[(width_src * height_src) + (y * width_src) + (x + 1)]; } } return; } motion-release-4.6.0/src/picture.h000066400000000000000000000033771452402535500170760ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * picture.h * Headers associated with functions in the picture.c module. * Copyright 2002 by Jeroen Vreeken (pe1rxq@amsat.org) * Portions of this file are Copyright by Lionnel Maugis */ #ifndef _INCLUDE_PICTURE_H_ #define _INCLUDE_PICTURE_H_ void overlay_smartmask(struct context *cnt, unsigned char *out); void overlay_fixed_mask(struct context *cnt, unsigned char *out); void put_fixed_mask(struct context *cnt, const char *file); void overlay_largest_label(struct context *cnt, unsigned char *out); int put_picture_memory(struct context *cnt, unsigned char* dest_image, int image_size , unsigned char *image, int quality, int width, int height); void put_picture(struct context *cnt, char *file, unsigned char *image, int ftype); unsigned char *get_pgm(FILE *picture, int width, int height); void pic_scale_img(int width_src, int height_src, unsigned char *img_src, unsigned char *img_dst); unsigned prepare_exif(unsigned char **exif, const struct context *cnt , const struct timeval *tv_in1, const struct coord *box); #endif /* _INCLUDE_PICTURE_H_ */ motion-release-4.6.0/src/pwc-ioctl.h000066400000000000000000000264001452402535500173140ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ #ifndef PWC_IOCTL_H #define PWC_IOCTL_H /* (C) 2001-2004 Nemosoft Unv. (C) 2004-2006 Luc Saillard (luc@saillard.org) NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx driver and thus may have bugs that are not present in the original version. Please send bug reports and support requests to . The decompression routines have been implemented by reverse-engineering the Nemosoft binary pwcx module. Caveat emptor. */ /* This is pwc-ioctl.h belonging to PWC 10.0.10 It contains structures and defines to communicate from user space directly to the driver. */ /* Changes 2001/08/03 Alvarado Added ioctl constants to access methods for changing white balance and red/blue gains 2002/12/15 G. H. Fernandez-Toribio VIDIOCGREALSIZE 2003/12/13 Nemosft Unv. Some modifications to make interfacing to PWCX easier 2006/01/01 Luc Saillard Add raw format definition */ /* These are private ioctl() commands, specific for the Philips webcams. They contain functions not found in other webcams, and settings not specified in the Video4Linux API. The #define names are built up like follows: VIDIOC VIDeo IOCtl prefix PWC Philps WebCam G optional: Get S optional: Set ... the function */ #if defined(__linux__) #include #include #endif /* Enumeration of image sizes */ #define PSZ_SQCIF 0x00 #define PSZ_QSIF 0x01 #define PSZ_QCIF 0x02 #define PSZ_SIF 0x03 #define PSZ_CIF 0x04 #define PSZ_VGA 0x05 #define PSZ_MAX 6 /* The frame rate is encoded in the video_window.flags parameter using the upper 16 bits, since some flags are defined nowadays. The following defines provide a mask and shift to filter out this value. This value can also be passing using the private flag when using v4l2 and VIDIOC_S_FMT ioctl. In 'Snapshot' mode the camera freezes its automatic exposure and colour balance controls. */ #define PWC_FPS_SHIFT 16 #define PWC_FPS_MASK 0x00FF0000 #define PWC_FPS_FRMASK 0x003F0000 #define PWC_FPS_SNAPSHOT 0x00400000 #define PWC_QLT_MASK 0x03000000 #define PWC_QLT_SHIFT 24 /* structure for transferring x & y coordinates */ struct pwc_coord { int x, y; /* guess what */ int size; /* size, or offset */ }; /* Used with VIDIOCPWCPROBE */ struct pwc_probe { char name[32]; int type; }; struct pwc_serial { char serial[30]; /* String with serial number. Contains terminating 0 */ }; /* pwc_whitebalance.mode values */ #define PWC_WB_INDOOR 0 #define PWC_WB_OUTDOOR 1 #define PWC_WB_FL 2 #define PWC_WB_MANUAL 3 #define PWC_WB_AUTO 4 /* Used with VIDIOCPWC[SG]AWB (Auto White Balance). Set mode to one of the PWC_WB_* values above. *red and *blue are the respective gains of these colour components inside the camera; range 0..65535 When 'mode' == PWC_WB_MANUAL, 'manual_red' and 'manual_blue' are set or read; otherwise undefined. 'read_red' and 'read_blue' are read-only. */ struct pwc_whitebalance { int mode; int manual_red, manual_blue; /* R/W */ int read_red, read_blue; /* R/O */ }; /* 'control_speed' and 'control_delay' are used in automatic whitebalance mode, and tell the camera how fast it should react to changes in lighting, and with how much delay. Valid values are 0..65535. */ struct pwc_wb_speed { int control_speed; int control_delay; }; /* Used with VIDIOCPWC[SG]LED */ struct pwc_leds { int led_on; /* Led on-time; range = 0..25000 */ int led_off; /* Led off-time; range = 0..25000 */ }; /* Image size (used with GREALSIZE) */ struct pwc_imagesize { int width; int height; }; /* Defines and structures for Motorized Pan & Tilt */ #define PWC_MPT_PAN 0x01 #define PWC_MPT_TILT 0x02 #define PWC_MPT_TIMEOUT 0x04 /* for status */ /* Set angles; when absolute != 0, the angle is absolute and the driver calculates the relative offset for you. This can only be used with VIDIOCPWCSANGLE; VIDIOCPWCGANGLE always returns absolute angles. */ struct pwc_mpt_angles { int absolute; /* write-only */ int pan; /* degrees * 100 */ int tilt; /* degress * 100 */ }; /* Range of angles of the camera, both horizontally and vertically. */ struct pwc_mpt_range { int pan_min, pan_max; /* degrees * 100 */ int tilt_min, tilt_max; }; struct pwc_mpt_status { int status; int time_pan; int time_tilt; }; /* This is used for out-of-kernel decompression. With it, you can get all the necessary information to initialize and use the decompressor routines in standalone applications. */ struct pwc_video_command { int type; /* camera type (645, 675, 730, etc.) */ int release; /* release number */ int size; /* one of PSZ_* */ int alternate; int command_len; /* length of USB video command */ unsigned char command_buf[13]; /* Actual USB video command */ int bandlength; /* >0 = compressed */ int frame_size; /* Size of one (un)compressed frame */ }; /* Flags for PWCX subroutines. Not all modules honour all flags. */ #define PWCX_FLAG_PLANAR 0x0001 #define PWCX_FLAG_BAYER 0x0008 /* IOCTL definitions */ /* Restore user settings */ #define VIDIOCPWCRUSER _IO('v', 192) /* Save user settings */ #define VIDIOCPWCSUSER _IO('v', 193) /* Restore factory settings */ #define VIDIOCPWCFACTORY _IO('v', 194) /* You can manipulate the compression factor. A compression preference of 0 means use uncompressed modes when available; 1 is low compression, 2 is medium and 3 is high compression preferred. Of course, the higher the compression, the lower the bandwidth used but more chance of artefacts in the image. The driver automatically chooses a higher compression when the preferred mode is not available. */ /* Set preferred compression quality (0 = uncompressed, 3 = highest compression) */ #define VIDIOCPWCSCQUAL _IOW('v', 195, int) /* Get preferred compression quality */ #define VIDIOCPWCGCQUAL _IOR('v', 195, int) /* Retrieve serial number of camera */ #define VIDIOCPWCGSERIAL _IOR('v', 198, struct pwc_serial) /* This is a probe function; since so many devices are supported, it becomes difficult to include all the names in programs that want to check for the enhanced Philips stuff. So in stead, try this PROBE; it returns a structure with the original name, and the corresponding Philips type. To use, fill the structure with zeroes, call PROBE and if that succeeds, compare the name with that returned from VIDIOCGCAP; they should be the same. If so, you can be assured it is a Philips (OEM) cam and the type is valid. */ #define VIDIOCPWCPROBE _IOR('v', 199, struct pwc_probe) /* Set AGC (Automatic Gain Control); int < 0 = auto, 0..65535 = fixed */ #define VIDIOCPWCSAGC _IOW('v', 200, int) /* Get AGC; int < 0 = auto; >= 0 = fixed, range 0..65535 */ #define VIDIOCPWCGAGC _IOR('v', 200, int) /* Set shutter speed; int < 0 = auto; >= 0 = fixed, range 0..65535 */ #define VIDIOCPWCSSHUTTER _IOW('v', 201, int) /* Color compensation (Auto White Balance) */ #define VIDIOCPWCSAWB _IOW('v', 202, struct pwc_whitebalance) #define VIDIOCPWCGAWB _IOR('v', 202, struct pwc_whitebalance) /* Auto WB speed */ #define VIDIOCPWCSAWBSPEED _IOW('v', 203, struct pwc_wb_speed) #define VIDIOCPWCGAWBSPEED _IOR('v', 203, struct pwc_wb_speed) /* LEDs on/off/blink; int range 0..65535 */ #define VIDIOCPWCSLED _IOW('v', 205, struct pwc_leds) #define VIDIOCPWCGLED _IOR('v', 205, struct pwc_leds) /* Contour (sharpness); int < 0 = auto, 0..65536 = fixed */ #define VIDIOCPWCSCONTOUR _IOW('v', 206, int) #define VIDIOCPWCGCONTOUR _IOR('v', 206, int) /* Backlight compensation; 0 = off, otherwise on */ #define VIDIOCPWCSBACKLIGHT _IOW('v', 207, int) #define VIDIOCPWCGBACKLIGHT _IOR('v', 207, int) /* Flickerless mode; = 0 off, otherwise on */ #define VIDIOCPWCSFLICKER _IOW('v', 208, int) #define VIDIOCPWCGFLICKER _IOR('v', 208, int) /* Dynamic noise reduction; 0 off, 3 = high noise reduction */ #define VIDIOCPWCSDYNNOISE _IOW('v', 209, int) #define VIDIOCPWCGDYNNOISE _IOR('v', 209, int) /* Real image size as used by the camera; tells you whether or not there's a gray border around the image */ #define VIDIOCPWCGREALSIZE _IOR('v', 210, struct pwc_imagesize) /* Motorized pan & tilt functions */ #define VIDIOCPWCMPTRESET _IOW('v', 211, int) #define VIDIOCPWCMPTGRANGE _IOR('v', 211, struct pwc_mpt_range) #define VIDIOCPWCMPTSANGLE _IOW('v', 212, struct pwc_mpt_angles) #define VIDIOCPWCMPTGANGLE _IOR('v', 212, struct pwc_mpt_angles) #define VIDIOCPWCMPTSTATUS _IOR('v', 213, struct pwc_mpt_status) /* Get the USB set-video command; needed for initializing libpwcx */ #define VIDIOCPWCGVIDCMD _IOR('v', 215, struct pwc_video_command) struct pwc_table_init_buffer { int len; char *buffer; }; #define VIDIOCPWCGVIDTABLE _IOR('v', 216, struct pwc_table_init_buffer) /* * This is private command used when communicating with v4l2. * In the future all private ioctl will be remove/replace to * use interface offer by v4l2. */ #if (defined(HAVE_V4L2)) && defined(__linux__) #define V4L2_CID_PRIVATE_SAVE_USER (V4L2_CID_PRIVATE_BASE + 0) #define V4L2_CID_PRIVATE_RESTORE_USER (V4L2_CID_PRIVATE_BASE + 1) #define V4L2_CID_PRIVATE_RESTORE_FACTORY (V4L2_CID_PRIVATE_BASE + 2) #define V4L2_CID_PRIVATE_COLOUR_MODE (V4L2_CID_PRIVATE_BASE + 3) #define V4L2_CID_PRIVATE_AUTOCONTOUR (V4L2_CID_PRIVATE_BASE + 4) #define V4L2_CID_PRIVATE_CONTOUR (V4L2_CID_PRIVATE_BASE + 5) #define V4L2_CID_PRIVATE_BACKLIGHT (V4L2_CID_PRIVATE_BASE + 6) #define V4L2_CID_PRIVATE_FLICKERLESS (V4L2_CID_PRIVATE_BASE + 7) #define V4L2_CID_PRIVATE_NOISE_REDUCTION (V4L2_CID_PRIVATE_BASE + 8) struct pwc_raw_frame { __le16 type; /* type of the webcam */ __le16 vbandlength; /* Size of 4lines compressed (used by the decompressor) */ __u8 cmd[4]; /* the four byte of the command (in case of nala, only the first 3 bytes is filled) */ __u8 rawframe[0]; /* frame_size = H/4*vbandlength */ } __attribute__ ((packed)); #endif /* HAVE_V4L2 && __linux__ */ #endif motion-release-4.6.0/src/raspicam/000077500000000000000000000000001452402535500170375ustar00rootroot00000000000000motion-release-4.6.0/src/raspicam/README.txt000066400000000000000000000014111452402535500205320ustar00rootroot00000000000000The files in this directory are used in the MMAL/RaspberryPI camera support code. The files were taken from the Raspberry PI userland git repository: https://github.com/raspberrypi/userland The files are mostly a straight copy from the userland versions. Only the "RaspiCamControl.c" file was altered to include the "mmal_status_to_int" function defined in the helper module "RaspiHelpers.h". The callout to the helper module was therefore removed. The inserted "mmal_status_to_int" function is an exact copy from the helper module. Additional Revision: Added more default values to raspicamcontrol_set_defaults They are used to parse an options string and setup the camera parameters appropriately. The format of the string is the same as other raspberry pi camera tools. motion-release-4.6.0/src/raspicam/RaspiCLI.c000066400000000000000000000103761452402535500206200ustar00rootroot00000000000000/* Copyright (c) 2013, Broadcom Europe Ltd Copyright (c) 2013, James Hughes All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * \file RaspiCLI.c * Code for handling command line parameters * * \date 4th March 2013 * \Author: James Hughes * * Description * * Some functions/structures for command line parameter parsing * */ #include #include #include #include #include "interface/vcos/vcos.h" #include "RaspiCLI.h" /** * Convert a string from command line to a comand_id from the list * * @param commands Array of command to check * @param num_command Number of commands in the array * @param arg String to search for in the list * @param num_parameters Returns the number of parameters used by the command * * @return command ID if found, -1 if not found * */ int raspicli_get_command_id(const COMMAND_LIST *commands, const int num_commands, const char *arg, int *num_parameters) { int command_id = -1; int j; vcos_assert(commands); vcos_assert(num_parameters); vcos_assert(arg); if (!commands || !num_parameters || !arg) return -1; for (j = 0; j < num_commands; j++) { if (!strcmp(arg, commands[j].command) || !strcmp(arg, commands[j].abbrev)) { // match command_id = commands[j].id; *num_parameters = commands[j].num_parameters; break; } } return command_id; } /** * Display the list of commands in help format * * @param commands Array of command to check * @param num_command Number of commands in the arry * * */ void raspicli_display_help(const COMMAND_LIST *commands, const int num_commands) { int i; vcos_assert(commands); if (!commands) return; for (i = 0; i < num_commands; i++) { fprintf(stdout, "-%s, -%s\t: %s\n", commands[i].abbrev, commands[i].command, commands[i].help); } } /** * Function to take a string, a mapping, and return the int equivalent * @param str Incoming string to match * @param map Mapping data * @param num_refs The number of items in the mapping data * @return The integer match for the string, or -1 if no match */ int raspicli_map_xref(const char *str, const XREF_T *map, int num_refs) { int i; for (i=0; i #include #include #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wredundant-decls" #pragma GCC diagnostic ignored "-Wdiscarded-qualifiers" #pragma GCC diagnostic ignored "-Wunused" #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #pragma GCC diagnostic ignored "-Wsign-compare" #pragma GCC diagnostic ignored "-Wstrict-prototypes" #pragma GCC diagnostic ignored "-Wmissing-prototypes" #pragma GCC diagnostic ignored "-Wunused-parameter" #include "interface/vcos/vcos.h" #include "interface/vmcs_host/vc_vchi_gencmd.h" #include "interface/mmal/mmal.h" #include "interface/mmal/mmal_logging.h" #include "interface/mmal/util/mmal_util.h" #include "interface/mmal/util/mmal_util_params.h" #include "interface/mmal/util/mmal_default_components.h" #include "interface/mmal/util/mmal_connection.h" #include "RaspiCamControl.h" #include "RaspiCLI.h" /// Structure to cross reference exposure strings against the MMAL parameter equivalent static XREF_T exposure_map[] = { {"off", MMAL_PARAM_EXPOSUREMODE_OFF}, {"auto", MMAL_PARAM_EXPOSUREMODE_AUTO}, {"night", MMAL_PARAM_EXPOSUREMODE_NIGHT}, {"nightpreview", MMAL_PARAM_EXPOSUREMODE_NIGHTPREVIEW}, {"backlight", MMAL_PARAM_EXPOSUREMODE_BACKLIGHT}, {"spotlight", MMAL_PARAM_EXPOSUREMODE_SPOTLIGHT}, {"sports", MMAL_PARAM_EXPOSUREMODE_SPORTS}, {"snow", MMAL_PARAM_EXPOSUREMODE_SNOW}, {"beach", MMAL_PARAM_EXPOSUREMODE_BEACH}, {"verylong", MMAL_PARAM_EXPOSUREMODE_VERYLONG}, {"fixedfps", MMAL_PARAM_EXPOSUREMODE_FIXEDFPS}, {"antishake", MMAL_PARAM_EXPOSUREMODE_ANTISHAKE}, {"fireworks", MMAL_PARAM_EXPOSUREMODE_FIREWORKS} }; static const int exposure_map_size = sizeof(exposure_map) / sizeof(exposure_map[0]); /// Structure to cross reference flicker avoid strings against the MMAL parameter equivalent static XREF_T flicker_avoid_map[] = { {"off", MMAL_PARAM_FLICKERAVOID_OFF}, {"auto", MMAL_PARAM_FLICKERAVOID_AUTO}, {"50hz", MMAL_PARAM_FLICKERAVOID_50HZ}, {"60hz", MMAL_PARAM_FLICKERAVOID_60HZ} }; static const int flicker_avoid_map_size = sizeof(flicker_avoid_map) / sizeof(flicker_avoid_map[0]); /// Structure to cross reference awb strings against the MMAL parameter equivalent static XREF_T awb_map[] = { {"off", MMAL_PARAM_AWBMODE_OFF}, {"auto", MMAL_PARAM_AWBMODE_AUTO}, {"sun", MMAL_PARAM_AWBMODE_SUNLIGHT}, {"cloud", MMAL_PARAM_AWBMODE_CLOUDY}, {"shade", MMAL_PARAM_AWBMODE_SHADE}, {"tungsten", MMAL_PARAM_AWBMODE_TUNGSTEN}, {"fluorescent", MMAL_PARAM_AWBMODE_FLUORESCENT}, {"incandescent", MMAL_PARAM_AWBMODE_INCANDESCENT}, {"flash", MMAL_PARAM_AWBMODE_FLASH}, {"horizon", MMAL_PARAM_AWBMODE_HORIZON}, {"greyworld", MMAL_PARAM_AWBMODE_GREYWORLD} }; static const int awb_map_size = sizeof(awb_map) / sizeof(awb_map[0]); /// Structure to cross reference image effect against the MMAL parameter equivalent static XREF_T imagefx_map[] = { {"none", MMAL_PARAM_IMAGEFX_NONE}, {"negative", MMAL_PARAM_IMAGEFX_NEGATIVE}, {"solarise", MMAL_PARAM_IMAGEFX_SOLARIZE}, {"sketch", MMAL_PARAM_IMAGEFX_SKETCH}, {"denoise", MMAL_PARAM_IMAGEFX_DENOISE}, {"emboss", MMAL_PARAM_IMAGEFX_EMBOSS}, {"oilpaint", MMAL_PARAM_IMAGEFX_OILPAINT}, {"hatch", MMAL_PARAM_IMAGEFX_HATCH}, {"gpen", MMAL_PARAM_IMAGEFX_GPEN}, {"pastel", MMAL_PARAM_IMAGEFX_PASTEL}, {"watercolour", MMAL_PARAM_IMAGEFX_WATERCOLOUR}, {"film", MMAL_PARAM_IMAGEFX_FILM}, {"blur", MMAL_PARAM_IMAGEFX_BLUR}, {"saturation", MMAL_PARAM_IMAGEFX_SATURATION}, {"colourswap", MMAL_PARAM_IMAGEFX_COLOURSWAP}, {"washedout", MMAL_PARAM_IMAGEFX_WASHEDOUT}, {"posterise", MMAL_PARAM_IMAGEFX_POSTERISE}, {"colourpoint", MMAL_PARAM_IMAGEFX_COLOURPOINT}, {"colourbalance", MMAL_PARAM_IMAGEFX_COLOURBALANCE}, {"cartoon", MMAL_PARAM_IMAGEFX_CARTOON} }; static const int imagefx_map_size = sizeof(imagefx_map) / sizeof(imagefx_map[0]); static XREF_T metering_mode_map[] = { {"average", MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE}, {"spot", MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT}, {"backlit", MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT}, {"matrix", MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX} }; static const int metering_mode_map_size = sizeof(metering_mode_map)/sizeof(metering_mode_map[0]); static XREF_T drc_mode_map[] = { {"off", MMAL_PARAMETER_DRC_STRENGTH_OFF}, {"low", MMAL_PARAMETER_DRC_STRENGTH_LOW}, {"med", MMAL_PARAMETER_DRC_STRENGTH_MEDIUM}, {"high", MMAL_PARAMETER_DRC_STRENGTH_HIGH} }; static const int drc_mode_map_size = sizeof(drc_mode_map)/sizeof(drc_mode_map[0]); static XREF_T stereo_mode_map[] = { {"off", MMAL_STEREOSCOPIC_MODE_NONE}, {"sbs", MMAL_STEREOSCOPIC_MODE_SIDE_BY_SIDE}, {"tb", MMAL_STEREOSCOPIC_MODE_TOP_BOTTOM}, }; static const int stereo_mode_map_size = sizeof(stereo_mode_map)/sizeof(stereo_mode_map[0]); enum { CommandSharpness, CommandContrast, CommandBrightness, CommandSaturation, CommandISO, CommandVideoStab, CommandEVComp, CommandExposure, CommandAWB, CommandImageFX, CommandColourFX, CommandMeterMode, CommandRotation, CommandHFlip, CommandVFlip, CommandROI, CommandShutterSpeed, CommandAwbGains, CommandDRCLevel, CommandStatsPass, CommandAnnotate, CommandStereoMode, CommandStereoDecimate, CommandStereoSwap, CommandAnnotateExtras, CommandFlicker, CommandAnalogGain, CommandDigitalGain, CommandSettings }; static COMMAND_LIST cmdline_commands[] = { {CommandSharpness, "-sharpness", "sh", "Set image sharpness (-100 to 100)", 1}, {CommandContrast, "-contrast", "co", "Set image contrast (-100 to 100)", 1}, {CommandBrightness, "-brightness","br", "Set image brightness (0 to 100)", 1}, {CommandSaturation, "-saturation","sa", "Set image saturation (-100 to 100)", 1}, {CommandISO, "-ISO", "ISO","Set capture ISO", 1}, {CommandVideoStab, "-vstab", "vs", "Turn on video stabilisation", 0}, {CommandEVComp, "-ev", "ev", "Set EV compensation - steps of 1/6 stop", 1}, {CommandExposure, "-exposure", "ex", "Set exposure mode (see Notes)", 1}, {CommandFlicker, "-flicker", "fli","Set flicker avoid mode (see Notes)", 1}, {CommandAWB, "-awb", "awb","Set AWB mode (see Notes)", 1}, {CommandImageFX, "-imxfx", "ifx","Set image effect (see Notes)", 1}, {CommandColourFX, "-colfx", "cfx","Set colour effect (U:V)", 1}, {CommandMeterMode, "-metering", "mm", "Set metering mode (see Notes)", 1}, {CommandRotation, "-rotation", "rot","Set image rotation (0-359)", 1}, {CommandHFlip, "-hflip", "hf", "Set horizontal flip", 0}, {CommandVFlip, "-vflip", "vf", "Set vertical flip", 0}, {CommandROI, "-roi", "roi","Set region of interest (x,y,w,d as normalised coordinates [0.0-1.0])", 1}, {CommandShutterSpeed,"-shutter", "ss", "Set shutter speed in microseconds", 1}, {CommandAwbGains, "-awbgains", "awbg", "Set AWB gains - AWB mode must be off", 1}, {CommandDRCLevel, "-drc", "drc", "Set DRC Level (see Notes)", 1}, {CommandStatsPass, "-stats", "st", "Force recomputation of statistics on stills capture pass"}, {CommandAnnotate, "-annotate", "a", "Enable/Set annotate flags or text", 1}, {CommandStereoMode, "-stereo", "3d", "Select stereoscopic mode", 1}, {CommandStereoDecimate,"-decimate","dec", "Half width/height of stereo image"}, {CommandStereoSwap, "-3dswap", "3dswap", "Swap camera order for stereoscopic"}, {CommandAnnotateExtras,"-annotateex","ae", "Set extra annotation parameters (text size, text colour(hex YUV), bg colour(hex YUV), justify, x, y)", 2}, {CommandAnalogGain, "-analoggain", "ag", "Set the analog gain (floating point)", 1}, {CommandDigitalGain, "-digitalgain", "dg", "Set the digital gain (floating point)", 1}, {CommandSettings, "-settings", "set","Retrieve camera settings and write to stdout", 0}, }; static int cmdline_commands_size = sizeof(cmdline_commands) / sizeof(cmdline_commands[0]); #define parameter_reset -99999 #define zoom_full_16P16 ((unsigned int)(65536 * 0.15)) #define zoom_increment_16P16 (65536UL / 10) /** * Update the passed in parameter according to the rest of the parameters * passed in. * * * @return 0 if reached end of cycle for this parameter, !0 otherwise */ static int update_cycle_parameter(int *option, int min, int max, int increment) { vcos_assert(option); if (!option) return 0; if (*option == parameter_reset) *option = min - increment; *option += increment; if (*option > max) { *option = parameter_reset; return 0; } else return 1; } /** * Test/Demo code to cycle through a bunch of camera settings * This code is pretty hacky so please don't complain!! * It only does stuff that should have a visual impact (hence demo!) * This will override any user supplied parameters * * Each call of this function will move on to the next setting * * @param camera Pointer to the camera to change settings on. * @return 0 if reached end of complete sequence, !0 otherwise */ int raspicamcontrol_cycle_test(MMAL_COMPONENT_T *camera) { static int parameter = 0; static int parameter_option = parameter_reset; // which value the parameter currently has vcos_assert(camera); // We are going to cycle through all the relevant entries in the parameter block // and send options to the camera. if (parameter == 0) { // sharpness if (update_cycle_parameter(¶meter_option, -100, 100, 10)) raspicamcontrol_set_sharpness(camera, parameter_option); else { raspicamcontrol_set_sharpness(camera, 0); parameter++; } } else if (parameter == 1) { // contrast if (update_cycle_parameter(¶meter_option, -100, 100, 10)) raspicamcontrol_set_contrast(camera, parameter_option); else { raspicamcontrol_set_contrast(camera, 0); parameter++; } } else if (parameter == 2) { // brightness if (update_cycle_parameter(¶meter_option, 0, 100, 10)) raspicamcontrol_set_brightness(camera, parameter_option); else { raspicamcontrol_set_brightness(camera, 50); parameter++; } } else if (parameter == 3) { // contrast if (update_cycle_parameter(¶meter_option, -100, 100, 10)) raspicamcontrol_set_saturation(camera, parameter_option); else { parameter++; raspicamcontrol_set_saturation(camera, 0); } } else if (parameter == 4) { // EV if (update_cycle_parameter(¶meter_option, -10, 10, 4)) raspicamcontrol_set_exposure_compensation(camera, parameter_option); else { raspicamcontrol_set_exposure_compensation(camera, 0); parameter++; } } else if (parameter == 5) { // MMAL_PARAM_EXPOSUREMODE_T if (update_cycle_parameter(¶meter_option, 0, exposure_map_size, 1)) raspicamcontrol_set_exposure_mode(camera, exposure_map[parameter_option].mmal_mode); else { raspicamcontrol_set_exposure_mode(camera, MMAL_PARAM_EXPOSUREMODE_AUTO); parameter++; } } else if (parameter == 6) { // MMAL_PARAM_AWB_T if (update_cycle_parameter(¶meter_option, 0, awb_map_size, 1)) raspicamcontrol_set_awb_mode(camera, awb_map[parameter_option].mmal_mode); else { raspicamcontrol_set_awb_mode(camera, MMAL_PARAM_AWBMODE_AUTO); parameter++; } } if (parameter == 7) { // MMAL_PARAM_IMAGEFX_T if (update_cycle_parameter(¶meter_option, 0, imagefx_map_size, 1)) raspicamcontrol_set_imageFX(camera, imagefx_map[parameter_option].mmal_mode); else { raspicamcontrol_set_imageFX(camera, MMAL_PARAM_IMAGEFX_NONE); parameter++; } } if (parameter == 8) { MMAL_PARAM_COLOURFX_T colfx = {0,0,0}; switch (parameter_option) { case parameter_reset : parameter_option = 1; colfx.u = 128; colfx.v = 128; break; case 1 : parameter_option = 2; colfx.u = 100; colfx.v = 200; break; case 2 : parameter_option = parameter_reset; colfx.enable = 0; parameter++; break; } raspicamcontrol_set_colourFX(camera, &colfx); } // Orientation if (parameter == 9) { switch (parameter_option) { case parameter_reset: raspicamcontrol_set_rotation(camera, 90); parameter_option = 1; break; case 1 : raspicamcontrol_set_rotation(camera, 180); parameter_option = 2; break; case 2 : raspicamcontrol_set_rotation(camera, 270); parameter_option = 3; break; case 3 : { raspicamcontrol_set_rotation(camera, 0); raspicamcontrol_set_flips(camera, 1,0); parameter_option = 4; break; } case 4 : { raspicamcontrol_set_flips(camera, 0,1); parameter_option = 5; break; } case 5 : { raspicamcontrol_set_flips(camera, 1, 1); parameter_option = 6; break; } case 6 : { raspicamcontrol_set_flips(camera, 0, 0); parameter_option = parameter_reset; parameter++; break; } } } if (parameter == 10) { parameter = 1; return 0; } return 1; } /** * Convert string to the MMAL parameter for exposure mode * @param str Incoming string to match * @return MMAL parameter matching the string, or the AUTO option if no match found */ static MMAL_PARAM_EXPOSUREMODE_T exposure_mode_from_string(const char *str) { int i = raspicli_map_xref(str, exposure_map, exposure_map_size); if( i != -1) return (MMAL_PARAM_EXPOSUREMODE_T)i; vcos_log_error("Unknown exposure mode: %s", str); return MMAL_PARAM_EXPOSUREMODE_AUTO; } /** * Convert string to the MMAL parameter for flicker avoid mode * @param str Incoming string to match * @return MMAL parameter matching the string, or the AUTO option if no match found */ static MMAL_PARAM_FLICKERAVOID_T flicker_avoid_mode_from_string(const char *str) { int i = raspicli_map_xref(str, flicker_avoid_map, flicker_avoid_map_size); if( i != -1) return (MMAL_PARAM_FLICKERAVOID_T)i; vcos_log_error("Unknown flicker avoid mode: %s", str); return MMAL_PARAM_FLICKERAVOID_OFF; } /** * Convert string to the MMAL parameter for AWB mode * @param str Incoming string to match * @return MMAL parameter matching the string, or the AUTO option if no match found */ static MMAL_PARAM_AWBMODE_T awb_mode_from_string(const char *str) { int i = raspicli_map_xref(str, awb_map, awb_map_size); if( i != -1) return (MMAL_PARAM_AWBMODE_T)i; vcos_log_error("Unknown awb mode: %s", str); return MMAL_PARAM_AWBMODE_AUTO; } /** * Convert string to the MMAL parameter for image effects mode * @param str Incoming string to match * @return MMAL parameter matching the strong, or the AUTO option if no match found */ MMAL_PARAM_IMAGEFX_T imagefx_mode_from_string(const char *str) { int i = raspicli_map_xref(str, imagefx_map, imagefx_map_size); if( i != -1) return (MMAL_PARAM_IMAGEFX_T)i; vcos_log_error("Unknown image fx: %s", str); return MMAL_PARAM_IMAGEFX_NONE; } /** * Convert string to the MMAL parameter for exposure metering mode * @param str Incoming string to match * @return MMAL parameter matching the string, or the AUTO option if no match found */ static MMAL_PARAM_EXPOSUREMETERINGMODE_T metering_mode_from_string(const char *str) { int i = raspicli_map_xref(str, metering_mode_map, metering_mode_map_size); if( i != -1) return (MMAL_PARAM_EXPOSUREMETERINGMODE_T)i; vcos_log_error("Unknown metering mode: %s", str); return MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE; } /** * Convert string to the MMAL parameter for DRC level * @param str Incoming string to match * @return MMAL parameter matching the string, or the AUTO option if no match found */ static MMAL_PARAMETER_DRC_STRENGTH_T drc_mode_from_string(const char *str) { int i = raspicli_map_xref(str, drc_mode_map, drc_mode_map_size); if( i != -1) return (MMAL_PARAMETER_DRC_STRENGTH_T)i; vcos_log_error("Unknown DRC level: %s", str); return MMAL_PARAMETER_DRC_STRENGTH_OFF; } /** * Convert string to the MMAL parameter for exposure metering mode * @param str Incoming string to match * @return MMAL parameter matching the string, or the AUTO option if no match found */ static MMAL_STEREOSCOPIC_MODE_T stereo_mode_from_string(const char *str) { int i = raspicli_map_xref(str, stereo_mode_map, stereo_mode_map_size); if( i != -1) return (MMAL_STEREOSCOPIC_MODE_T)i; vcos_log_error("Unknown metering mode: %s", str); return MMAL_STEREOSCOPIC_MODE_NONE; } /** * Parse a possible command pair - command and parameter * @param arg1 Command * @param arg2 Parameter (could be NULL) * @return How many parameters were used, 0,1,2 */ int raspicamcontrol_parse_cmdline(RASPICAM_CAMERA_PARAMETERS *params, const char *arg1, const char *arg2) { int command_id, used = 0, num_parameters; if (!arg1) return 0; command_id = raspicli_get_command_id(cmdline_commands, cmdline_commands_size, arg1, &num_parameters); // If invalid command, or we are missing a parameter, drop out if (command_id==-1 || (command_id != -1 && num_parameters > 0 && arg2 == NULL)) return 0; switch (command_id) { case CommandSharpness : // sharpness - needs single number parameter sscanf(arg2, "%d", ¶ms->sharpness); used = 2; break; case CommandContrast : // contrast - needs single number parameter sscanf(arg2, "%d", ¶ms->contrast); used = 2; break; case CommandBrightness : // brightness - needs single number parameter sscanf(arg2, "%d", ¶ms->brightness); used = 2; break; case CommandSaturation : // saturation - needs single number parameter sscanf(arg2, "%d", ¶ms->saturation); used = 2; break; case CommandISO : // ISO - needs single number parameter sscanf(arg2, "%d", ¶ms->ISO); used = 2; break; case CommandVideoStab : // video stabilisation - if here, its on params->videoStabilisation = 1; used = 1; break; case CommandEVComp : // EV - needs single number parameter sscanf(arg2, "%d", ¶ms->exposureCompensation); used = 2; break; case CommandExposure : // exposure mode - needs string params->exposureMode = exposure_mode_from_string(arg2); used = 2; break; case CommandFlicker : // flicker avoid mode - needs string params->flickerAvoidMode = flicker_avoid_mode_from_string(arg2); used = 2; break; case CommandAWB : // AWB mode - needs single number parameter params->awbMode = awb_mode_from_string(arg2); used = 2; break; case CommandImageFX : // Image FX - needs string params->imageEffect = imagefx_mode_from_string(arg2); used = 2; break; case CommandColourFX : // Colour FX - needs string "u:v" sscanf(arg2, "%d:%d", ¶ms->colourEffects.u, ¶ms->colourEffects.v); params->colourEffects.enable = 1; used = 2; break; case CommandMeterMode: params->exposureMeterMode = metering_mode_from_string(arg2); used = 2; break; case CommandRotation : // Rotation - degree sscanf(arg2, "%d", ¶ms->rotation); used = 2; break; case CommandHFlip : params->hflip = 1; used = 1; break; case CommandVFlip : params->vflip = 1; used = 1; break; case CommandROI : { double x,y,w,h; int args; args = sscanf(arg2, "%lf,%lf,%lf,%lf", &x,&y,&w,&h); if (args != 4 || x > 1.0 || y > 1.0 || w > 1.0 || h > 1.0) { return 0; } // Make sure we stay within bounds if (x + w > 1.0) w = 1 - x; if (y + h > 1.0) h = 1 - y; params->roi.x = x; params->roi.y = y; params->roi.w = w; params->roi.h = h; used = 2; break; } case CommandShutterSpeed : // Shutter speed needs single number parameter { sscanf(arg2, "%d", ¶ms->shutter_speed); used = 2; break; } case CommandAwbGains : { double r,b; int args; args = sscanf(arg2, "%lf,%lf", &r,&b); if (args != 2 || r > 8.0 || b > 8.0) { return 0; } params->awb_gains_r = r; params->awb_gains_b = b; used = 2; break; } case CommandDRCLevel: { params->drc_level = drc_mode_from_string(arg2); used = 2; break; } case CommandStatsPass: { params->stats_pass = MMAL_TRUE; used = 1; break; } case CommandAnnotate: { char dummy; unsigned int bitmask; // If parameter is a number, assume its a bitmask, otherwise a string if (sscanf(arg2, "%u%c", &bitmask, &dummy) == 1) { params->enable_annotate |= bitmask; } else { params->enable_annotate |= ANNOTATE_USER_TEXT; //copy string char by char and replace "\n" with newline character unsigned char c; char const *s = arg2; char *t = ¶ms->annotate_string[0]; int n=0; while ((c = *s++) && n < MMAL_CAMERA_ANNOTATE_MAX_TEXT_LEN_V3-1) { if (c == '\\' && *s) { switch (c = *s++) { case 'n': c = '\n'; break; default: c = '\\'; s--; break; } } *(t++) = c; n++; } *t='\0'; //params->annotate_string[MMAL_CAMERA_ANNOTATE_MAX_TEXT_LEN_V3-1] = '\0'; } used=2; break; } case CommandAnnotateExtras: { // 3 parameters - text size (6-80), text colour (Hex VVUUYY) and background colour (Hex VVUUYY) sscanf(arg2, "%u,%X,%X,%u,%u,%u", ¶ms->annotate_text_size, ¶ms->annotate_text_colour, ¶ms->annotate_bg_colour, ¶ms->annotate_justify, ¶ms->annotate_x, ¶ms->annotate_y ); used=2; break; } case CommandStereoMode: { params->stereo_mode.mode = stereo_mode_from_string(arg2); used = 2; break; } case CommandStereoDecimate: { params->stereo_mode.decimate = MMAL_TRUE; used = 1; break; } case CommandStereoSwap: { params->stereo_mode.swap_eyes = MMAL_TRUE; used = 1; break; } case CommandAnalogGain: { double gain; int args; args = sscanf(arg2, "%lf", &gain); if (args != 1 || gain > 16.0) { return 0; } params->analog_gain = gain; used = 2; break; } case CommandDigitalGain: { double gain; int args; args = sscanf(arg2, "%lf", &gain); if (args != 1 || gain > 64.0) { return 0; } params->digital_gain = gain; used = 2; break; } case CommandSettings: { params->settings = 1; used = 1; break; } } return used; } /** * Display help for command line options */ void raspicamcontrol_display_help() { int i; fprintf(stdout, "\nImage parameter commands\n\n"); raspicli_display_help(cmdline_commands, cmdline_commands_size); fprintf(stdout, "\n\nNotes\n\nExposure mode options :\n%s", exposure_map[0].mode ); for (i=1; iexposureMode, exposure_map, exposure_map_size); const char *fl_mode = raspicli_unmap_xref(params->flickerAvoidMode, flicker_avoid_map, flicker_avoid_map_size); const char *awb_mode = raspicli_unmap_xref(params->awbMode, awb_map, awb_map_size); const char *image_effect = raspicli_unmap_xref(params->imageEffect, imagefx_map, imagefx_map_size); const char *metering_mode = raspicli_unmap_xref(params->exposureMeterMode, metering_mode_map, metering_mode_map_size); fprintf(stderr, "Sharpness %d, Contrast %d, Brightness %d\n", params->sharpness, params->contrast, params->brightness); fprintf(stderr, "Saturation %d, ISO %d, Video Stabilisation %s, Exposure compensation %d\n", params->saturation, params->ISO, params->videoStabilisation ? "Yes": "No", params->exposureCompensation); fprintf(stderr, "Exposure Mode '%s', AWB Mode '%s', Image Effect '%s'\n", exp_mode, awb_mode, image_effect); fprintf(stderr, "Flicker Avoid Mode '%s'\n", fl_mode); fprintf(stderr, "Metering Mode '%s', Colour Effect Enabled %s with U = %d, V = %d\n", metering_mode, params->colourEffects.enable ? "Yes":"No", params->colourEffects.u, params->colourEffects.v); fprintf(stderr, "Rotation %d, hflip %s, vflip %s\n", params->rotation, params->hflip ? "Yes":"No",params->vflip ? "Yes":"No"); fprintf(stderr, "ROI x %lf, y %f, w %f h %f\n", params->roi.x, params->roi.y, params->roi.w, params->roi.h); } /** * This function is copied from "RaspiHelpers.h" module, without any changes * It is inserted here only for usage with motion project * * Convert a MMAL status return value to a simple boolean of success * ALso displays a fault if code is not success * * @param status The error code to convert * @return 0 if status is success, 1 otherwise */ int mmal_status_to_int(MMAL_STATUS_T status) { if (status == MMAL_SUCCESS) return 0; else { switch (status) { case MMAL_ENOMEM : vcos_log_error("Out of memory"); break; case MMAL_ENOSPC : vcos_log_error("Out of resources (other than memory)"); break; case MMAL_EINVAL: vcos_log_error("Argument is invalid"); break; case MMAL_ENOSYS : vcos_log_error("Function not implemented"); break; case MMAL_ENOENT : vcos_log_error("No such file or directory"); break; case MMAL_ENXIO : vcos_log_error("No such device or address"); break; case MMAL_EIO : vcos_log_error("I/O error"); break; case MMAL_ESPIPE : vcos_log_error("Illegal seek"); break; case MMAL_ECORRUPT : vcos_log_error("Data is corrupt \attention FIXME: not POSIX"); break; case MMAL_ENOTREADY : vcos_log_error("Component is not ready \attention FIXME: not POSIX"); break; case MMAL_ECONFIG : vcos_log_error("Component is not configured \attention FIXME: not POSIX"); break; case MMAL_EISCONN : vcos_log_error("Port is already connected "); break; case MMAL_ENOTCONN : vcos_log_error("Port is disconnected"); break; case MMAL_EAGAIN : vcos_log_error("Resource temporarily unavailable. Try again later"); break; case MMAL_EFAULT : vcos_log_error("Bad address"); break; default : vcos_log_error("Unknown status error"); break; } return 1; } } /** * Give the supplied parameter block a set of default values * @params Pointer to parameter block */ void raspicamcontrol_set_defaults(RASPICAM_CAMERA_PARAMETERS *params) { vcos_assert(params); params->sharpness = 0; params->contrast = 0; params->brightness = 50; params->saturation = 0; params->ISO = 0; // 0 = auto params->videoStabilisation = 0; params->exposureCompensation = 0; params->exposureMode = MMAL_PARAM_EXPOSUREMODE_AUTO; params->flickerAvoidMode = MMAL_PARAM_FLICKERAVOID_OFF; params->exposureMeterMode = MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE; params->awbMode = MMAL_PARAM_AWBMODE_AUTO; params->imageEffect = MMAL_PARAM_IMAGEFX_NONE; params->colourEffects.enable = 0; params->colourEffects.u = 128; params->colourEffects.v = 128; params->rotation = 0; params->hflip = params->vflip = 0; params->roi.x = params->roi.y = 0.0; params->roi.w = params->roi.h = 1.0; params->shutter_speed = 0; // 0 = auto params->awb_gains_r = 0; // Only have any function if AWB OFF is used. params->awb_gains_b = 0; params->drc_level = MMAL_PARAMETER_DRC_STRENGTH_OFF; params->stats_pass = MMAL_FALSE; params->enable_annotate = 0; params->annotate_string[0] = '\0'; params->annotate_text_size = 0; //Use firmware default params->annotate_text_colour = -1; //Use firmware default params->annotate_bg_colour = -1; //Use firmware default params->stereo_mode.mode = MMAL_STEREOSCOPIC_MODE_NONE; params->stereo_mode.decimate = MMAL_FALSE; params->stereo_mode.swap_eyes = MMAL_FALSE; params->annotate_justify = 0; params->annotate_x = 0; params->annotate_y = 0; params->analog_gain = 0; params->digital_gain = 0; params->settings = 0; } /** * Get all the current camera parameters from specified camera component * @param camera Pointer to camera component * @param params Pointer to parameter block to accept settings * @return 0 if successful, non-zero if unsuccessful */ int raspicamcontrol_get_all_parameters(MMAL_COMPONENT_T *camera, RASPICAM_CAMERA_PARAMETERS *params) { vcos_assert(camera); vcos_assert(params); if (!camera || !params) return 1; /* TODO : Write these get functions params->sharpness = raspicamcontrol_get_sharpness(camera); params->contrast = raspicamcontrol_get_contrast(camera); params->brightness = raspicamcontrol_get_brightness(camera); params->saturation = raspicamcontrol_get_saturation(camera); params->ISO = raspicamcontrol_get_ISO(camera); params->videoStabilisation = raspicamcontrol_get_video_stabilisation(camera); params->exposureCompensation = raspicamcontrol_get_exposure_compensation(camera); params->exposureMode = raspicamcontrol_get_exposure_mode(camera); params->flickerAvoidMode = raspicamcontrol_get_flicker_avoid_mode(camera); params->awbMode = raspicamcontrol_get_awb_mode(camera); params->imageEffect = raspicamcontrol_get_image_effect(camera); params->colourEffects = raspicamcontrol_get_colour_effect(camera); params->thumbnailConfig = raspicamcontrol_get_thumbnail_config(camera); */ return 0; } /** * Set the specified camera to all the specified settings * @param camera Pointer to camera component * @param params Pointer to parameter block containing parameters * @return 0 if successful, none-zero if unsuccessful. */ int raspicamcontrol_set_all_parameters(MMAL_COMPONENT_T *camera, const RASPICAM_CAMERA_PARAMETERS *params) { int result; result = raspicamcontrol_set_saturation(camera, params->saturation); result += raspicamcontrol_set_sharpness(camera, params->sharpness); result += raspicamcontrol_set_contrast(camera, params->contrast); result += raspicamcontrol_set_brightness(camera, params->brightness); result += raspicamcontrol_set_ISO(camera, params->ISO); result += raspicamcontrol_set_video_stabilisation(camera, params->videoStabilisation); result += raspicamcontrol_set_exposure_compensation(camera, params->exposureCompensation); result += raspicamcontrol_set_exposure_mode(camera, params->exposureMode); result += raspicamcontrol_set_flicker_avoid_mode(camera, params->flickerAvoidMode); result += raspicamcontrol_set_metering_mode(camera, params->exposureMeterMode); result += raspicamcontrol_set_awb_mode(camera, params->awbMode); result += raspicamcontrol_set_awb_gains(camera, params->awb_gains_r, params->awb_gains_b); result += raspicamcontrol_set_imageFX(camera, params->imageEffect); result += raspicamcontrol_set_colourFX(camera, ¶ms->colourEffects); //result += raspicamcontrol_set_thumbnail_parameters(camera, ¶ms->thumbnailConfig); TODO Not working for some reason result += raspicamcontrol_set_rotation(camera, params->rotation); result += raspicamcontrol_set_flips(camera, params->hflip, params->vflip); result += raspicamcontrol_set_ROI(camera, params->roi); result += raspicamcontrol_set_shutter_speed(camera, params->shutter_speed); result += raspicamcontrol_set_DRC(camera, params->drc_level); result += raspicamcontrol_set_stats_pass(camera, params->stats_pass); result += raspicamcontrol_set_annotate(camera, params->enable_annotate, params->annotate_string, params->annotate_text_size, params->annotate_text_colour, params->annotate_bg_colour, params->annotate_justify, params->annotate_x, params->annotate_y); result += raspicamcontrol_set_gains(camera, params->analog_gain, params->digital_gain); if (params->settings) { MMAL_PARAMETER_CHANGE_EVENT_REQUEST_T change_event_request = { {MMAL_PARAMETER_CHANGE_EVENT_REQUEST, sizeof(MMAL_PARAMETER_CHANGE_EVENT_REQUEST_T)}, MMAL_PARAMETER_CAMERA_SETTINGS, 1 }; MMAL_STATUS_T status = mmal_port_parameter_set(camera->control, &change_event_request.hdr); if ( status != MMAL_SUCCESS ) { vcos_log_error("No camera settings events"); } result += status; } return result; } /** * Adjust the saturation level for images * @param camera Pointer to camera component * @param saturation Value to adjust, -100 to 100 * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_saturation(MMAL_COMPONENT_T *camera, int saturation) { int ret = 0; if (!camera) return 1; if (saturation >= -100 && saturation <= 100) { MMAL_RATIONAL_T value = {saturation, 100}; ret = mmal_status_to_int(mmal_port_parameter_set_rational(camera->control, MMAL_PARAMETER_SATURATION, value)); } else { vcos_log_error("Invalid saturation value"); ret = 1; } return ret; } /** * Set the sharpness of the image * @param camera Pointer to camera component * @param sharpness Sharpness adjustment -100 to 100 */ int raspicamcontrol_set_sharpness(MMAL_COMPONENT_T *camera, int sharpness) { int ret = 0; if (!camera) return 1; if (sharpness >= -100 && sharpness <= 100) { MMAL_RATIONAL_T value = {sharpness, 100}; ret = mmal_status_to_int(mmal_port_parameter_set_rational(camera->control, MMAL_PARAMETER_SHARPNESS, value)); } else { vcos_log_error("Invalid sharpness value"); ret = 1; } return ret; } /** * Set the contrast adjustment for the image * @param camera Pointer to camera component * @param contrast Contrast adjustment -100 to 100 * @return */ int raspicamcontrol_set_contrast(MMAL_COMPONENT_T *camera, int contrast) { int ret = 0; if (!camera) return 1; if (contrast >= -100 && contrast <= 100) { MMAL_RATIONAL_T value = {contrast, 100}; ret = mmal_status_to_int(mmal_port_parameter_set_rational(camera->control, MMAL_PARAMETER_CONTRAST, value)); } else { vcos_log_error("Invalid contrast value"); ret = 1; } return ret; } /** * Adjust the brightness level for images * @param camera Pointer to camera component * @param brightness Value to adjust, 0 to 100 * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_brightness(MMAL_COMPONENT_T *camera, int brightness) { int ret = 0; if (!camera) return 1; if (brightness >= 0 && brightness <= 100) { MMAL_RATIONAL_T value = {brightness, 100}; ret = mmal_status_to_int(mmal_port_parameter_set_rational(camera->control, MMAL_PARAMETER_BRIGHTNESS, value)); } else { vcos_log_error("Invalid brightness value"); ret = 1; } return ret; } /** * Adjust the ISO used for images * @param camera Pointer to camera component * @param ISO Value to set TODO : * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_ISO(MMAL_COMPONENT_T *camera, int ISO) { if (!camera) return 1; return mmal_status_to_int(mmal_port_parameter_set_uint32(camera->control, MMAL_PARAMETER_ISO, ISO)); } /** * Adjust the metering mode for images * @param camera Pointer to camera component * @param saturation Value from following * - MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE, * - MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT, * - MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT, * - MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_metering_mode(MMAL_COMPONENT_T *camera, MMAL_PARAM_EXPOSUREMETERINGMODE_T m_mode ) { MMAL_PARAMETER_EXPOSUREMETERINGMODE_T meter_mode = {{MMAL_PARAMETER_EXP_METERING_MODE,sizeof(meter_mode)}, m_mode }; if (!camera) return 1; return mmal_status_to_int(mmal_port_parameter_set(camera->control, &meter_mode.hdr)); } /** * Set the video stabilisation flag. Only used in video mode * @param camera Pointer to camera component * @param saturation Flag 0 off 1 on * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_video_stabilisation(MMAL_COMPONENT_T *camera, int vstabilisation) { if (!camera) return 1; return mmal_status_to_int(mmal_port_parameter_set_boolean(camera->control, MMAL_PARAMETER_VIDEO_STABILISATION, vstabilisation)); } /** * Adjust the exposure compensation for images (EV) * @param camera Pointer to camera component * @param exp_comp Value to adjust, -10 to +10 * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_exposure_compensation(MMAL_COMPONENT_T *camera, int exp_comp) { if (!camera) return 1; return mmal_status_to_int(mmal_port_parameter_set_int32(camera->control, MMAL_PARAMETER_EXPOSURE_COMP, exp_comp)); } /** * Set exposure mode for images * @param camera Pointer to camera component * @param mode Exposure mode to set from * - MMAL_PARAM_EXPOSUREMODE_OFF, * - MMAL_PARAM_EXPOSUREMODE_AUTO, * - MMAL_PARAM_EXPOSUREMODE_NIGHT, * - MMAL_PARAM_EXPOSUREMODE_NIGHTPREVIEW, * - MMAL_PARAM_EXPOSUREMODE_BACKLIGHT, * - MMAL_PARAM_EXPOSUREMODE_SPOTLIGHT, * - MMAL_PARAM_EXPOSUREMODE_SPORTS, * - MMAL_PARAM_EXPOSUREMODE_SNOW, * - MMAL_PARAM_EXPOSUREMODE_BEACH, * - MMAL_PARAM_EXPOSUREMODE_VERYLONG, * - MMAL_PARAM_EXPOSUREMODE_FIXEDFPS, * - MMAL_PARAM_EXPOSUREMODE_ANTISHAKE, * - MMAL_PARAM_EXPOSUREMODE_FIREWORKS, * * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_exposure_mode(MMAL_COMPONENT_T *camera, MMAL_PARAM_EXPOSUREMODE_T mode) { MMAL_PARAMETER_EXPOSUREMODE_T exp_mode = {{MMAL_PARAMETER_EXPOSURE_MODE,sizeof(exp_mode)}, mode}; if (!camera) return 1; return mmal_status_to_int(mmal_port_parameter_set(camera->control, &exp_mode.hdr)); } /** * Set flicker avoid mode for images * @param camera Pointer to camera component * @param mode Exposure mode to set from * - MMAL_PARAM_FLICKERAVOID_OFF, * - MMAL_PARAM_FLICKERAVOID_AUTO, * - MMAL_PARAM_FLICKERAVOID_50HZ, * - MMAL_PARAM_FLICKERAVOID_60HZ, * * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_flicker_avoid_mode(MMAL_COMPONENT_T *camera, MMAL_PARAM_FLICKERAVOID_T mode) { MMAL_PARAMETER_FLICKERAVOID_T fl_mode = {{MMAL_PARAMETER_FLICKER_AVOID,sizeof(fl_mode)}, mode}; if (!camera) return 1; return mmal_status_to_int(mmal_port_parameter_set(camera->control, &fl_mode.hdr)); } /** * Set the aWB (auto white balance) mode for images * @param camera Pointer to camera component * @param awb_mode Value to set from * - MMAL_PARAM_AWBMODE_OFF, * - MMAL_PARAM_AWBMODE_AUTO, * - MMAL_PARAM_AWBMODE_SUNLIGHT, * - MMAL_PARAM_AWBMODE_CLOUDY, * - MMAL_PARAM_AWBMODE_SHADE, * - MMAL_PARAM_AWBMODE_TUNGSTEN, * - MMAL_PARAM_AWBMODE_FLUORESCENT, * - MMAL_PARAM_AWBMODE_INCANDESCENT, * - MMAL_PARAM_AWBMODE_FLASH, * - MMAL_PARAM_AWBMODE_HORIZON, * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_awb_mode(MMAL_COMPONENT_T *camera, MMAL_PARAM_AWBMODE_T awb_mode) { MMAL_PARAMETER_AWBMODE_T param = {{MMAL_PARAMETER_AWB_MODE,sizeof(param)}, awb_mode}; if (!camera) return 1; return mmal_status_to_int(mmal_port_parameter_set(camera->control, ¶m.hdr)); } int raspicamcontrol_set_awb_gains(MMAL_COMPONENT_T *camera, float r_gain, float b_gain) { MMAL_PARAMETER_AWB_GAINS_T param = {{MMAL_PARAMETER_CUSTOM_AWB_GAINS,sizeof(param)}, {0,0}, {0,0}}; if (!camera) return 1; if (!r_gain || !b_gain) return 0; param.r_gain.num = (unsigned int)(r_gain * 65536); param.b_gain.num = (unsigned int)(b_gain * 65536); param.r_gain.den = param.b_gain.den = 65536; return mmal_status_to_int(mmal_port_parameter_set(camera->control, ¶m.hdr)); } /** * Set the image effect for the images * @param camera Pointer to camera component * @param imageFX Value from * - MMAL_PARAM_IMAGEFX_NONE, * - MMAL_PARAM_IMAGEFX_NEGATIVE, * - MMAL_PARAM_IMAGEFX_SOLARIZE, * - MMAL_PARAM_IMAGEFX_POSTERIZE, * - MMAL_PARAM_IMAGEFX_WHITEBOARD, * - MMAL_PARAM_IMAGEFX_BLACKBOARD, * - MMAL_PARAM_IMAGEFX_SKETCH, * - MMAL_PARAM_IMAGEFX_DENOISE, * - MMAL_PARAM_IMAGEFX_EMBOSS, * - MMAL_PARAM_IMAGEFX_OILPAINT, * - MMAL_PARAM_IMAGEFX_HATCH, * - MMAL_PARAM_IMAGEFX_GPEN, * - MMAL_PARAM_IMAGEFX_PASTEL, * - MMAL_PARAM_IMAGEFX_WATERCOLOUR, * - MMAL_PARAM_IMAGEFX_FILM, * - MMAL_PARAM_IMAGEFX_BLUR, * - MMAL_PARAM_IMAGEFX_SATURATION, * - MMAL_PARAM_IMAGEFX_COLOURSWAP, * - MMAL_PARAM_IMAGEFX_WASHEDOUT, * - MMAL_PARAM_IMAGEFX_POSTERISE, * - MMAL_PARAM_IMAGEFX_COLOURPOINT, * - MMAL_PARAM_IMAGEFX_COLOURBALANCE, * - MMAL_PARAM_IMAGEFX_CARTOON, * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_imageFX(MMAL_COMPONENT_T *camera, MMAL_PARAM_IMAGEFX_T imageFX) { MMAL_PARAMETER_IMAGEFX_T imgFX = {{MMAL_PARAMETER_IMAGE_EFFECT,sizeof(imgFX)}, imageFX}; if (!camera) return 1; return mmal_status_to_int(mmal_port_parameter_set(camera->control, &imgFX.hdr)); } /* TODO :what to do with the image effects parameters? MMAL_PARAMETER_IMAGEFX_PARAMETERS_T imfx_param = {{MMAL_PARAMETER_IMAGE_EFFECT_PARAMETERS,sizeof(imfx_param)}, imageFX, 0, {0}}; mmal_port_parameter_set(camera->control, &imfx_param.hdr); */ /** * Set the colour effect for images (Set UV component) * @param camera Pointer to camera component * @param colourFX Contains enable state and U and V numbers to set (e.g. 128,128 = Black and white) * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_colourFX(MMAL_COMPONENT_T *camera, const MMAL_PARAM_COLOURFX_T *colourFX) { MMAL_PARAMETER_COLOURFX_T colfx = {{MMAL_PARAMETER_COLOUR_EFFECT,sizeof(colfx)}, 0, 0, 0}; if (!camera) return 1; colfx.enable = colourFX->enable; colfx.u = colourFX->u; colfx.v = colourFX->v; return mmal_status_to_int(mmal_port_parameter_set(camera->control, &colfx.hdr)); } /** * Set the rotation of the image * @param camera Pointer to camera component * @param rotation Degree of rotation (any number, but will be converted to 0,90,180 or 270 only) * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_rotation(MMAL_COMPONENT_T *camera, int rotation) { int ret; int my_rotation = ((rotation % 360 ) / 90) * 90; ret = mmal_port_parameter_set_int32(camera->output[0], MMAL_PARAMETER_ROTATION, my_rotation); mmal_port_parameter_set_int32(camera->output[1], MMAL_PARAMETER_ROTATION, my_rotation); mmal_port_parameter_set_int32(camera->output[2], MMAL_PARAMETER_ROTATION, my_rotation); return mmal_status_to_int(ret); } /** * Set the flips state of the image * @param camera Pointer to camera component * @param hflip If true, horizontally flip the image * @param vflip If true, vertically flip the image * * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_flips(MMAL_COMPONENT_T *camera, int hflip, int vflip) { MMAL_PARAMETER_MIRROR_T mirror = {{MMAL_PARAMETER_MIRROR, sizeof(MMAL_PARAMETER_MIRROR_T)}, MMAL_PARAM_MIRROR_NONE}; if (hflip && vflip) mirror.value = MMAL_PARAM_MIRROR_BOTH; else if (hflip) mirror.value = MMAL_PARAM_MIRROR_HORIZONTAL; else if (vflip) mirror.value = MMAL_PARAM_MIRROR_VERTICAL; mmal_port_parameter_set(camera->output[0], &mirror.hdr); mmal_port_parameter_set(camera->output[1], &mirror.hdr); return mmal_status_to_int(mmal_port_parameter_set(camera->output[2], &mirror.hdr)); } /** * Set the ROI of the sensor to use for captures/preview * @param camera Pointer to camera component * @param rect Normalised coordinates of ROI rectangle * * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_ROI(MMAL_COMPONENT_T *camera, PARAM_FLOAT_RECT_T rect) { MMAL_PARAMETER_INPUT_CROP_T crop = {{MMAL_PARAMETER_INPUT_CROP, sizeof(MMAL_PARAMETER_INPUT_CROP_T)}}; crop.rect.x = (65536 * rect.x); crop.rect.y = (65536 * rect.y); crop.rect.width = (65536 * rect.w); crop.rect.height = (65536 * rect.h); return mmal_status_to_int(mmal_port_parameter_set(camera->control, &crop.hdr)); } /** * Zoom in and Zoom out by changing ROI * @param camera Pointer to camera component * @param zoom_command zoom command enum * @return 0 if successful, non-zero otherwise */ int raspicamcontrol_zoom_in_zoom_out(MMAL_COMPONENT_T *camera, ZOOM_COMMAND_T zoom_command, PARAM_FLOAT_RECT_T *roi) { MMAL_PARAMETER_INPUT_CROP_T crop; crop.hdr.id = MMAL_PARAMETER_INPUT_CROP; crop.hdr.size = sizeof(crop); if (mmal_port_parameter_get(camera->control, &crop.hdr) != MMAL_SUCCESS) { vcos_log_error("mmal_port_parameter_get(camera->control, &crop.hdr) failed, skip it"); return 0; } if (zoom_command == ZOOM_IN) { if (crop.rect.width <= (zoom_full_16P16 + zoom_increment_16P16)) { crop.rect.width = zoom_full_16P16; crop.rect.height = zoom_full_16P16; } else { crop.rect.width -= zoom_increment_16P16; crop.rect.height -= zoom_increment_16P16; } } else if (zoom_command == ZOOM_OUT) { unsigned int increased_size = crop.rect.width + zoom_increment_16P16; if (increased_size < crop.rect.width) //overflow { crop.rect.width = 65536; crop.rect.height = 65536; } else { crop.rect.width = increased_size; crop.rect.height = increased_size; } } if (zoom_command == ZOOM_RESET) { crop.rect.x = 0; crop.rect.y = 0; crop.rect.width = 65536; crop.rect.height = 65536; } else { unsigned int centered_top_coordinate = (65536 - crop.rect.width) / 2; crop.rect.x = centered_top_coordinate; crop.rect.y = centered_top_coordinate; } int ret = mmal_status_to_int(mmal_port_parameter_set(camera->control, &crop.hdr)); if (ret == 0) { roi->x = roi->y = (double)crop.rect.x/65536; roi->w = roi->h = (double)crop.rect.width/65536; } else { vcos_log_error("Failed to set crop values, x/y: %u, w/h: %u", crop.rect.x, crop.rect.width); ret = 1; } return ret; } /** * Adjust the exposure time used for images * @param camera Pointer to camera component * @param shutter speed in microseconds * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_shutter_speed(MMAL_COMPONENT_T *camera, int speed) { if (!camera) return 1; return mmal_status_to_int(mmal_port_parameter_set_uint32(camera->control, MMAL_PARAMETER_SHUTTER_SPEED, speed)); } /** * Adjust the Dynamic range compression level * @param camera Pointer to camera component * @param strength Strength of DRC to apply * MMAL_PARAMETER_DRC_STRENGTH_OFF * MMAL_PARAMETER_DRC_STRENGTH_LOW * MMAL_PARAMETER_DRC_STRENGTH_MEDIUM * MMAL_PARAMETER_DRC_STRENGTH_HIGH * * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_DRC(MMAL_COMPONENT_T *camera, MMAL_PARAMETER_DRC_STRENGTH_T strength) { MMAL_PARAMETER_DRC_T drc = {{MMAL_PARAMETER_DYNAMIC_RANGE_COMPRESSION, sizeof(MMAL_PARAMETER_DRC_T)}, strength}; if (!camera) return 1; return mmal_status_to_int(mmal_port_parameter_set(camera->control, &drc.hdr)); } int raspicamcontrol_set_stats_pass(MMAL_COMPONENT_T *camera, int stats_pass) { if (!camera) return 1; return mmal_status_to_int(mmal_port_parameter_set_boolean(camera->control, MMAL_PARAMETER_CAPTURE_STATS_PASS, stats_pass)); } /** * Set the annotate data * @param camera Pointer to camera component * @param Bitmask of required annotation data. 0 for off. * @param If set, a pointer to text string to use instead of bitmask, max length 32 characters * * @return 0 if successful, non-zero if any parameters out of range */ int raspicamcontrol_set_annotate(MMAL_COMPONENT_T *camera, const int settings, const char *string, const int text_size, const int text_colour, const int bg_colour, const unsigned int justify, const unsigned int x, const unsigned int y) { MMAL_PARAMETER_CAMERA_ANNOTATE_V4_T annotate = {{MMAL_PARAMETER_ANNOTATE, sizeof(MMAL_PARAMETER_CAMERA_ANNOTATE_V4_T)}}; if (settings) { time_t t = time(NULL); struct tm tm = *localtime(&t); char tmp[MMAL_CAMERA_ANNOTATE_MAX_TEXT_LEN_V4]; int process_datetime = 1; annotate.enable = 1; if (settings & (ANNOTATE_APP_TEXT | ANNOTATE_USER_TEXT)) { if ((settings & (ANNOTATE_TIME_TEXT | ANNOTATE_DATE_TEXT)) && strchr(string,'%') != NULL) { //string contains strftime parameter? strftime(annotate.text, MMAL_CAMERA_ANNOTATE_MAX_TEXT_LEN_V3, string, &tm ); process_datetime = 0; } else { strncpy(annotate.text, string, MMAL_CAMERA_ANNOTATE_MAX_TEXT_LEN_V3); } annotate.text[MMAL_CAMERA_ANNOTATE_MAX_TEXT_LEN_V3-1] = '\0'; } if (process_datetime && (settings & ANNOTATE_TIME_TEXT)) { if(strlen(annotate.text)) { strftime(tmp, 32, " %X", &tm ); } else { strftime(tmp, 32, "%X", &tm ); } strncat(annotate.text, tmp, MMAL_CAMERA_ANNOTATE_MAX_TEXT_LEN_V3 - strlen(annotate.text) - 1); } if (process_datetime && (settings & ANNOTATE_DATE_TEXT)) { if(strlen(annotate.text)) { strftime(tmp, 32, " %x", &tm ); } else { strftime(tmp, 32, "%x", &tm ); } strncat(annotate.text, tmp, MMAL_CAMERA_ANNOTATE_MAX_TEXT_LEN_V3 - strlen(annotate.text) - 1); } if (settings & ANNOTATE_SHUTTER_SETTINGS) annotate.show_shutter = MMAL_TRUE; if (settings & ANNOTATE_GAIN_SETTINGS) annotate.show_analog_gain = MMAL_TRUE; if (settings & ANNOTATE_LENS_SETTINGS) annotate.show_lens = MMAL_TRUE; if (settings & ANNOTATE_CAF_SETTINGS) annotate.show_caf = MMAL_TRUE; if (settings & ANNOTATE_MOTION_SETTINGS) annotate.show_motion = MMAL_TRUE; if (settings & ANNOTATE_FRAME_NUMBER) annotate.show_frame_num = MMAL_TRUE; if (settings & ANNOTATE_BLACK_BACKGROUND) annotate.enable_text_background = MMAL_TRUE; annotate.text_size = text_size; if (text_colour != -1) { annotate.custom_text_colour = MMAL_TRUE; annotate.custom_text_Y = text_colour&0xff; annotate.custom_text_U = (text_colour>>8)&0xff; annotate.custom_text_V = (text_colour>>16)&0xff; } else annotate.custom_text_colour = MMAL_FALSE; if (bg_colour != -1) { annotate.custom_background_colour = MMAL_TRUE; annotate.custom_background_Y = bg_colour&0xff; annotate.custom_background_U = (bg_colour>>8)&0xff; annotate.custom_background_V = (bg_colour>>16)&0xff; } else annotate.custom_background_colour = MMAL_FALSE; annotate.justify = justify; annotate.x_offset = x; annotate.y_offset = y; } else annotate.enable = 0; return mmal_status_to_int(mmal_port_parameter_set(camera->control, &annotate.hdr)); } int raspicamcontrol_set_stereo_mode(MMAL_PORT_T *port, MMAL_PARAMETER_STEREOSCOPIC_MODE_T *stereo_mode) { MMAL_PARAMETER_STEREOSCOPIC_MODE_T stereo = { {MMAL_PARAMETER_STEREOSCOPIC_MODE, sizeof(stereo)}, MMAL_STEREOSCOPIC_MODE_NONE, MMAL_FALSE, MMAL_FALSE }; if (stereo_mode->mode != MMAL_STEREOSCOPIC_MODE_NONE) { stereo.mode = stereo_mode->mode; stereo.decimate = stereo_mode->decimate; stereo.swap_eyes = stereo_mode->swap_eyes; } return mmal_status_to_int(mmal_port_parameter_set(port, &stereo.hdr)); } int raspicamcontrol_set_gains(MMAL_COMPONENT_T *camera, float analog, float digital) { MMAL_RATIONAL_T rational = {0,65536}; MMAL_STATUS_T status; if (!camera) return 1; rational.num = (unsigned int)(analog * 65536); status = mmal_port_parameter_set_rational(camera->control, MMAL_PARAMETER_ANALOG_GAIN, rational); if (status != MMAL_SUCCESS) return mmal_status_to_int(status); rational.num = (unsigned int)(digital * 65536); status = mmal_port_parameter_set_rational(camera->control, MMAL_PARAMETER_DIGITAL_GAIN, rational); return mmal_status_to_int(status); } /** * Asked GPU how much memory it has allocated * * @return amount of memory in MB */ static int raspicamcontrol_get_mem_gpu(void) { char response[80] = ""; int gpu_mem = 0; if (vc_gencmd(response, sizeof response, "get_mem gpu") == 0) vc_gencmd_number_property(response, "gpu", &gpu_mem); return gpu_mem; } /** * Ask GPU about its camera abilities * @param supported None-zero if software supports the camera * @param detected None-zero if a camera has been detected */ static void raspicamcontrol_get_camera(int *supported, int *detected) { char response[80] = ""; if (vc_gencmd(response, sizeof response, "get_camera") == 0) { if (supported) vc_gencmd_number_property(response, "supported", supported); if (detected) vc_gencmd_number_property(response, "detected", detected); } } /** * Check to see if camera is supported, and we have allocated enough memory * Ask GPU about its camera abilities * @param supported None-zero if software supports the camera * @param detected None-zero if a camera has been detected */ void raspicamcontrol_check_configuration(int min_gpu_mem) { int gpu_mem = raspicamcontrol_get_mem_gpu(); int supported = 0, detected = 0; raspicamcontrol_get_camera(&supported, &detected); if (!supported) vcos_log_error("Camera is not enabled in this build. Try running \"sudo raspi-config\" and ensure that \"camera\" has been enabled\n"); else if (gpu_mem < min_gpu_mem) vcos_log_error("Only %dM of gpu_mem is configured. Try running \"sudo raspi-config\" and ensure that \"memory_split\" has a value of %d or greater\n", gpu_mem, min_gpu_mem); else if (!detected) vcos_log_error("Camera is not detected. Please check carefully the camera module is installed correctly\n"); else vcos_log_error("Failed to run camera app. Please check for firmware updates\n"); } /** Default camera callback function * Handles the --settings * @param port * @param Callback data */ void default_camera_control_callback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) { fprintf(stderr, "Camera control callback cmd=0x%08x", buffer->cmd); if (buffer->cmd == MMAL_EVENT_PARAMETER_CHANGED) { MMAL_EVENT_PARAMETER_CHANGED_T *param = (MMAL_EVENT_PARAMETER_CHANGED_T *)buffer->data; switch (param->hdr.id) { case MMAL_PARAMETER_CAMERA_SETTINGS: { MMAL_PARAMETER_CAMERA_SETTINGS_T *settings = (MMAL_PARAMETER_CAMERA_SETTINGS_T*)param; vcos_log_error("Exposure now %u, analog gain %u/%u, digital gain %u/%u", settings->exposure, settings->analog_gain.num, settings->analog_gain.den, settings->digital_gain.num, settings->digital_gain.den); vcos_log_error("AWB R=%u/%u, B=%u/%u", settings->awb_red_gain.num, settings->awb_red_gain.den, settings->awb_blue_gain.num, settings->awb_blue_gain.den); } break; } } else if (buffer->cmd == MMAL_EVENT_ERROR) { vcos_log_error("No data received from sensor. Check all connections, including the Sunny one on the camera board"); } else { vcos_log_error("Received unexpected camera control callback event, 0x%08x", buffer->cmd); } mmal_buffer_header_release(buffer); } #pragma GCC diagnostic pop motion-release-4.6.0/src/raspicam/RaspiCamControl.h000066400000000000000000000260361452402535500222570ustar00rootroot00000000000000/* Copyright (c) 2013, Broadcom Europe Ltd Copyright (c) 2013, James Hughes All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef RASPICAMCONTROL_H_ #define RASPICAMCONTROL_H_ /* Various parameters * * Exposure Mode * MMAL_PARAM_EXPOSUREMODE_OFF, MMAL_PARAM_EXPOSUREMODE_AUTO, MMAL_PARAM_EXPOSUREMODE_NIGHT, MMAL_PARAM_EXPOSUREMODE_NIGHTPREVIEW, MMAL_PARAM_EXPOSUREMODE_BACKLIGHT, MMAL_PARAM_EXPOSUREMODE_SPOTLIGHT, MMAL_PARAM_EXPOSUREMODE_SPORTS, MMAL_PARAM_EXPOSUREMODE_SNOW, MMAL_PARAM_EXPOSUREMODE_BEACH, MMAL_PARAM_EXPOSUREMODE_VERYLONG, MMAL_PARAM_EXPOSUREMODE_FIXEDFPS, MMAL_PARAM_EXPOSUREMODE_ANTISHAKE, MMAL_PARAM_EXPOSUREMODE_FIREWORKS, * * Flicker Avoid Mode * MMAL_PARAM_FLICKERAVOID_OFF, MMAL_PARAM_FLICKERAVOID_AUTO, MMAL_PARAM_FLICKERAVOID_50HZ, MMAL_PARAM_FLICKERAVOID_60HZ, * * AWB Mode * MMAL_PARAM_AWBMODE_OFF, MMAL_PARAM_AWBMODE_AUTO, MMAL_PARAM_AWBMODE_SUNLIGHT, MMAL_PARAM_AWBMODE_CLOUDY, MMAL_PARAM_AWBMODE_SHADE, MMAL_PARAM_AWBMODE_TUNGSTEN, MMAL_PARAM_AWBMODE_FLUORESCENT, MMAL_PARAM_AWBMODE_INCANDESCENT, MMAL_PARAM_AWBMODE_FLASH, MMAL_PARAM_AWBMODE_HORIZON, MMAL_PARAM_AWBMODE_GREYWORLD * * Image FX MMAL_PARAM_IMAGEFX_NONE, MMAL_PARAM_IMAGEFX_NEGATIVE, MMAL_PARAM_IMAGEFX_SOLARIZE, MMAL_PARAM_IMAGEFX_POSTERIZE, MMAL_PARAM_IMAGEFX_WHITEBOARD, MMAL_PARAM_IMAGEFX_BLACKBOARD, MMAL_PARAM_IMAGEFX_SKETCH, MMAL_PARAM_IMAGEFX_DENOISE, MMAL_PARAM_IMAGEFX_EMBOSS, MMAL_PARAM_IMAGEFX_OILPAINT, MMAL_PARAM_IMAGEFX_HATCH, MMAL_PARAM_IMAGEFX_GPEN, MMAL_PARAM_IMAGEFX_PASTEL, MMAL_PARAM_IMAGEFX_WATERCOLOUR, MMAL_PARAM_IMAGEFX_FILM, MMAL_PARAM_IMAGEFX_BLUR, MMAL_PARAM_IMAGEFX_SATURATION, MMAL_PARAM_IMAGEFX_COLOURSWAP, MMAL_PARAM_IMAGEFX_WASHEDOUT, MMAL_PARAM_IMAGEFX_POSTERISE, MMAL_PARAM_IMAGEFX_COLOURPOINT, MMAL_PARAM_IMAGEFX_COLOURBALANCE, MMAL_PARAM_IMAGEFX_CARTOON, */ /// Annotate bitmask options /// Supplied by user on command line #define ANNOTATE_USER_TEXT 1 /// Supplied by app using this module #define ANNOTATE_APP_TEXT 2 /// Insert current date #define ANNOTATE_DATE_TEXT 4 // Insert current time #define ANNOTATE_TIME_TEXT 8 #define ANNOTATE_SHUTTER_SETTINGS 16 #define ANNOTATE_CAF_SETTINGS 32 #define ANNOTATE_GAIN_SETTINGS 64 #define ANNOTATE_LENS_SETTINGS 128 #define ANNOTATE_MOTION_SETTINGS 256 #define ANNOTATE_FRAME_NUMBER 512 #define ANNOTATE_BLACK_BACKGROUND 1024 // There isn't actually a MMAL structure for the following, so make one typedef struct mmal_param_colourfx_s { int enable; /// Turn colourFX on or off int u,v; /// U and V to use } MMAL_PARAM_COLOURFX_T; typedef struct mmal_param_thumbnail_config_s { int enable; int width,height; int quality; } MMAL_PARAM_THUMBNAIL_CONFIG_T; typedef struct param_float_rect_s { double x; double y; double w; double h; } PARAM_FLOAT_RECT_T; /// struct contain camera settings typedef struct raspicam_camera_parameters_s { int sharpness; /// -100 to 100 int contrast; /// -100 to 100 int brightness; /// 0 to 100 int saturation; /// -100 to 100 int ISO; /// TODO : what range? int videoStabilisation; /// 0 or 1 (false or true) int exposureCompensation; /// -10 to +10 ? MMAL_PARAM_EXPOSUREMODE_T exposureMode; MMAL_PARAM_EXPOSUREMETERINGMODE_T exposureMeterMode; MMAL_PARAM_AWBMODE_T awbMode; MMAL_PARAM_IMAGEFX_T imageEffect; MMAL_PARAMETER_IMAGEFX_PARAMETERS_T imageEffectsParameters; MMAL_PARAM_COLOURFX_T colourEffects; MMAL_PARAM_FLICKERAVOID_T flickerAvoidMode; int rotation; /// 0-359 int hflip; /// 0 or 1 int vflip; /// 0 or 1 PARAM_FLOAT_RECT_T roi; /// region of interest to use on the sensor. Normalised [0,1] values in the rect int shutter_speed; /// 0 = auto, otherwise the shutter speed in ms float awb_gains_r; /// AWB red gain float awb_gains_b; /// AWB blue gain MMAL_PARAMETER_DRC_STRENGTH_T drc_level; // Strength of Dynamic Range compression to apply MMAL_BOOL_T stats_pass; /// Stills capture statistics pass on/off int enable_annotate; /// Flag to enable the annotate, 0 = disabled, otherwise a bitmask of what needs to be displayed char annotate_string[MMAL_CAMERA_ANNOTATE_MAX_TEXT_LEN_V2]; /// String to use for annotate - overrides certain bitmask settings int annotate_text_size; // Text size for annotation int annotate_text_colour; // Text colour for annotation int annotate_bg_colour; // Background colour for annotation unsigned int annotate_justify; unsigned int annotate_x; unsigned int annotate_y; MMAL_PARAMETER_STEREOSCOPIC_MODE_T stereo_mode; float analog_gain; // Analog gain float digital_gain; // Digital gain int settings; } RASPICAM_CAMERA_PARAMETERS; typedef enum { ZOOM_IN, ZOOM_OUT, ZOOM_RESET } ZOOM_COMMAND_T; void raspicamcontrol_check_configuration(int min_gpu_mem); int raspicamcontrol_parse_cmdline(RASPICAM_CAMERA_PARAMETERS *params, const char *arg1, const char *arg2); //void raspicamcontrol_display_help(); int raspicamcontrol_cycle_test(MMAL_COMPONENT_T *camera); int raspicamcontrol_set_all_parameters(MMAL_COMPONENT_T *camera, const RASPICAM_CAMERA_PARAMETERS *params); int raspicamcontrol_get_all_parameters(MMAL_COMPONENT_T *camera, RASPICAM_CAMERA_PARAMETERS *params); void raspicamcontrol_dump_parameters(const RASPICAM_CAMERA_PARAMETERS *params); void raspicamcontrol_set_defaults(RASPICAM_CAMERA_PARAMETERS *params); void raspicamcontrol_check_configuration(int min_gpu_mem); // Individual setting functions int raspicamcontrol_set_saturation(MMAL_COMPONENT_T *camera, int saturation); int raspicamcontrol_set_sharpness(MMAL_COMPONENT_T *camera, int sharpness); int raspicamcontrol_set_contrast(MMAL_COMPONENT_T *camera, int contrast); int raspicamcontrol_set_brightness(MMAL_COMPONENT_T *camera, int brightness); int raspicamcontrol_set_ISO(MMAL_COMPONENT_T *camera, int ISO); int raspicamcontrol_set_metering_mode(MMAL_COMPONENT_T *camera, MMAL_PARAM_EXPOSUREMETERINGMODE_T mode); int raspicamcontrol_set_video_stabilisation(MMAL_COMPONENT_T *camera, int vstabilisation); int raspicamcontrol_set_exposure_compensation(MMAL_COMPONENT_T *camera, int exp_comp); int raspicamcontrol_set_exposure_mode(MMAL_COMPONENT_T *camera, MMAL_PARAM_EXPOSUREMODE_T mode); int raspicamcontrol_set_flicker_avoid_mode(MMAL_COMPONENT_T *camera, MMAL_PARAM_FLICKERAVOID_T mode); int raspicamcontrol_set_awb_mode(MMAL_COMPONENT_T *camera, MMAL_PARAM_AWBMODE_T awb_mode); int raspicamcontrol_set_awb_gains(MMAL_COMPONENT_T *camera, float r_gain, float b_gain); int raspicamcontrol_set_imageFX(MMAL_COMPONENT_T *camera, MMAL_PARAM_IMAGEFX_T imageFX); int raspicamcontrol_set_colourFX(MMAL_COMPONENT_T *camera, const MMAL_PARAM_COLOURFX_T *colourFX); int raspicamcontrol_set_rotation(MMAL_COMPONENT_T *camera, int rotation); int raspicamcontrol_set_flips(MMAL_COMPONENT_T *camera, int hflip, int vflip); int raspicamcontrol_set_ROI(MMAL_COMPONENT_T *camera, PARAM_FLOAT_RECT_T rect); int raspicamcontrol_zoom_in_zoom_out(MMAL_COMPONENT_T *camera, ZOOM_COMMAND_T zoom_command, PARAM_FLOAT_RECT_T *roi); int raspicamcontrol_set_shutter_speed(MMAL_COMPONENT_T *camera, int speed_ms); int raspicamcontrol_set_DRC(MMAL_COMPONENT_T *camera, MMAL_PARAMETER_DRC_STRENGTH_T strength); int raspicamcontrol_set_stats_pass(MMAL_COMPONENT_T *camera, int stats_pass); int raspicamcontrol_set_annotate(MMAL_COMPONENT_T *camera, const int bitmask, const char *string, const int text_size, const int text_colour, const int bg_colour, const unsigned int justify, const unsigned int x, const unsigned int y); int raspicamcontrol_set_stereo_mode(MMAL_PORT_T *port, MMAL_PARAMETER_STEREOSCOPIC_MODE_T *stereo_mode); int raspicamcontrol_set_gains(MMAL_COMPONENT_T *camera, float analog, float digital); //Individual getting functions int raspicamcontrol_get_saturation(MMAL_COMPONENT_T *camera); int raspicamcontrol_get_sharpness(MMAL_COMPONENT_T *camera); int raspicamcontrol_get_contrast(MMAL_COMPONENT_T *camera); int raspicamcontrol_get_brightness(MMAL_COMPONENT_T *camera); int raspicamcontrol_get_ISO(MMAL_COMPONENT_T *camera); MMAL_PARAM_EXPOSUREMETERINGMODE_T raspicamcontrol_get_metering_mode(MMAL_COMPONENT_T *camera); int raspicamcontrol_get_video_stabilisation(MMAL_COMPONENT_T *camera); int raspicamcontrol_get_exposure_compensation(MMAL_COMPONENT_T *camera); MMAL_PARAM_THUMBNAIL_CONFIG_T raspicamcontrol_get_thumbnail_parameters(MMAL_COMPONENT_T *camera); MMAL_PARAM_EXPOSUREMODE_T raspicamcontrol_get_exposure_mode(MMAL_COMPONENT_T *camera); MMAL_PARAM_FLICKERAVOID_T raspicamcontrol_get_flicker_avoid_mode(MMAL_COMPONENT_T *camera); MMAL_PARAM_AWBMODE_T raspicamcontrol_get_awb_mode(MMAL_COMPONENT_T *camera); MMAL_PARAM_IMAGEFX_T raspicamcontrol_get_imageFX(MMAL_COMPONENT_T *camera); MMAL_PARAM_COLOURFX_T raspicamcontrol_get_colourFX(MMAL_COMPONENT_T *camera); /** Default camera callback function */ void default_camera_control_callback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer); #endif /* RASPICAMCONTROL_H_ */ motion-release-4.6.0/src/rotate.c000066400000000000000000000315671452402535500167160ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * rotate.c * * Module for handling image rotation. * * Copyright 2004-2005, Per Jonsson (per@pjd.nu) * * Image rotation is a feature of Motion that can be used when the * camera is mounted upside-down or on the side. The module only * supports rotation in multiples of 90 degrees. Using rotation * increases the Motion CPU usage slightly. * * Version history: * v6 (29-Aug-2005) - simplified the code as Motion now requires * that width and height are multiples of 16 * v5 (3-Aug-2005) - cleanup in code comments * - better adherence to coding standard * - fix for __bswap_32 macro collision * - fixed bug where initialization would be * incomplete for invalid degrees of rotation * - now uses MOTION_LOG for error reporting * v4 (26-Oct-2004) - new fix for width/height from imgs/conf due to * earlier misinterpretation * v3 (11-Oct-2004) - cleanup of width/height from imgs/conf * v2 (26-Sep-2004) - separation of capture/internal dimensions * - speed optimization, including bswap * v1 (28-Aug-2004) - initial version */ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include "rotate.h" #include #if defined(__APPLE__) #include #define bswap_32(x) OSSwapInt32(x) #elif defined(__FreeBSD__) #include #define bswap_32(x) bswap32(x) #elif defined(__OpenBSD__) #include #define bswap_32(x) swap32(x) #elif defined(__NetBSD__) #include #define bswap_32(x) bswap32(x) #else #include #endif /** * reverse_inplace_quad * * Reverses a block of memory in-place, 4 bytes at a time. This function * requires the uint32_t type, which is 32 bits wide. * * Parameters: * * src - the memory block to reverse * size - the size (in bytes) of the memory block * * Returns: nothing */ static void reverse_inplace_quad(unsigned char *src, int size) { uint32_t *nsrc = (uint32_t *)src; /* first quad */ uint32_t *ndst = (uint32_t *)(src + size - 4); /* last quad */ register uint32_t tmp; while (nsrc < ndst) { tmp = bswap_32(*ndst); *ndst-- = bswap_32(*nsrc); *nsrc++ = tmp; } } static void flip_inplace_horizontal(unsigned char *src, int width, int height) { uint8_t *nsrc, *ndst; register uint8_t tmp; int l,w; for(l=0; l < height/2; l++) { nsrc = (uint8_t *)(src + l*width); ndst = (uint8_t *)(src + (width*(height-l-1))); for(w=0; w < width; w++) { tmp =*ndst; *ndst++ = *nsrc; *nsrc++ = tmp; } } } static void flip_inplace_vertical(unsigned char *src, int width, int height) { uint8_t *nsrc, *ndst; register uint8_t tmp; int l; for(l=0; l < height; l++) { nsrc = (uint8_t *)src + l*width; ndst = nsrc + width - 1; while (nsrc < ndst) { tmp = *ndst; *ndst-- = *nsrc; *nsrc++ = tmp; } } } /** * rot90cw * * Performs a 90 degrees clockwise rotation of the memory block pointed to * by src. The rotation is NOT performed in-place; dst must point to a * receiving memory block the same size as src. * * Parameters: * * src - pointer to the memory block (image) to rotate clockwise * dst - where to put the rotated memory block * size - the size (in bytes) of the memory blocks (both src and dst) * width - the width of the memory block when seen as an image * height - the height of the memory block when seen as an image * * Returns: nothing */ static void rot90cw(unsigned char *src, register unsigned char *dst ,int size, int width, int height) { unsigned char *endp; register unsigned char *base; int j; endp = src + size; for (base = endp - width; base < endp; base++) { src = base; for (j = 0; j < height; j++, src -= width) { *dst++ = *src; } } } /** * rot90ccw * * Performs a 90 degrees counterclockwise rotation of the memory block pointed * to by src. The rotation is not performed in-place; dst must point to a * receiving memory block the same size as src. * * Parameters: * * src - pointer to the memory block (image) to rotate counterclockwise * dst - where to put the rotated memory block * size - the size (in bytes) of the memory blocks (both src and dst) * width - the width of the memory block when seen as an image * height - the height of the memory block when seen as an image * * Returns: nothing */ static inline void rot90ccw(unsigned char *src, register unsigned char *dst ,int size, int width, int height) { unsigned char *endp; register unsigned char *base; int j; endp = src + size; dst = dst + size - 1; for (base = endp - width; base < endp; base++) { src = base; for (j = 0; j < height; j++, src -= width) { *dst-- = *src; } } } /** * rotate_init * * Initializes rotation data - allocates memory and determines which function * to use for 180 degrees rotation. * * Parameters: * * cnt - the current thread's context structure * * Returns: nothing */ void rotate_init(struct context *cnt) { int size_norm, size_high; /* Make sure buffer_norm isn't freed if it hasn't been allocated. */ cnt->rotate_data.buffer_norm = NULL; cnt->rotate_data.buffer_high = NULL; /* * Assign the value in conf.rotate to rotate_data.degrees. This way, * we have a value that is safe from changes caused by motion-control. */ if ((cnt->conf.rotate % 90) > 0) { MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("Config option \"rotate\" not a multiple of 90: %d") ,cnt->conf.rotate); cnt->conf.rotate = 0; /* Disable rotation. */ cnt->rotate_data.degrees = 0; /* Force return below. */ } else { cnt->rotate_data.degrees = cnt->conf.rotate % 360; /* Range: 0..359 */ } if (cnt->conf.flip_axis[0]=='h') { cnt->rotate_data.axis = FLIP_TYPE_HORIZONTAL; } else if (cnt->conf.flip_axis[0]=='v') { cnt->rotate_data.axis = FLIP_TYPE_VERTICAL; } else { cnt->rotate_data.axis = FLIP_TYPE_NONE; } /* * Upon entrance to this function, imgs.width and imgs.height contain the * capture dimensions (as set in the configuration file, or read from a * netcam source). * * If rotating 90 or 270 degrees, the capture dimensions and output dimensions * are not the same. Capture dimensions will be contained in capture_width_norm and * capture_height_norm in cnt->rotate_data, while output dimensions will be contained * in imgs.width and imgs.height. */ /* 1. Transfer capture dimensions into capture_width_norm and capture_height_norm. */ cnt->rotate_data.capture_width_norm = cnt->imgs.width; cnt->rotate_data.capture_height_norm = cnt->imgs.height; cnt->rotate_data.capture_width_high = cnt->imgs.width_high; cnt->rotate_data.capture_height_high = cnt->imgs.height_high; size_norm = cnt->imgs.width * cnt->imgs.height * 3 / 2; size_high = cnt->imgs.width_high * cnt->imgs.height_high * 3 / 2; if ((cnt->rotate_data.degrees == 90) || (cnt->rotate_data.degrees == 270)) { /* 2. "Swap" imgs.width and imgs.height. */ cnt->imgs.width = cnt->rotate_data.capture_height_norm; cnt->imgs.height = cnt->rotate_data.capture_width_norm; if (size_high > 0 ) { cnt->imgs.width_high = cnt->rotate_data.capture_height_high; cnt->imgs.height_high = cnt->rotate_data.capture_width_high; } } /* * If we're not rotating, let's exit once we have setup the capture dimensions * and output dimensions properly. */ if (cnt->rotate_data.degrees == 0) { return; } /* * Allocate memory if rotating 90 or 270 degrees, because those rotations * cannot be performed in-place (they can, but it would be too slow). */ if ((cnt->rotate_data.degrees == 90) || (cnt->rotate_data.degrees == 270)) { cnt->rotate_data.buffer_norm = mymalloc(size_norm); if (size_high > 0) { cnt->rotate_data.buffer_high = mymalloc(size_high); } } } /** * rotate_deinit * * Frees resources previously allocated by rotate_init. * * Parameters: * * cnt - the current thread's context structure * * Returns: nothing */ void rotate_deinit(struct context *cnt) { if (cnt->rotate_data.buffer_norm) { free(cnt->rotate_data.buffer_norm); } if (cnt->rotate_data.buffer_high) { free(cnt->rotate_data.buffer_high); } } /** * rotate_map * * Main entry point for rotation. * * Parameters: * * img_data- pointer to the image data to rotate * cnt - the current thread's context structure * * Returns: * * 0 - success * -1 - failure (shouldn't happen) */ int rotate_map(struct context *cnt, struct image_data *img_data) { /* * The image format is YUV 4:2:0 planar, which has the pixel * data is divided in three parts: * Y - width x height bytes * U - width x height / 4 bytes * V - as U */ int indx, indx_max; int wh, wh4 = 0, w2 = 0, h2 = 0; /* width * height, width * height / 4 etc. */ int size, deg; enum FLIP_TYPE axis; int width, height; unsigned char *img; unsigned char *temp_buff; if (cnt->rotate_data.degrees == 0 && cnt->rotate_data.axis == FLIP_TYPE_NONE) { return 0; } indx = 0; indx_max = 0; if ((cnt->rotate_data.capture_width_high != 0) && (cnt->rotate_data.capture_height_high != 0)) { indx_max = 1; } while (indx <= indx_max) { deg = cnt->rotate_data.degrees; axis = cnt->rotate_data.axis; wh4 = 0; w2 = 0; h2 = 0; if (indx == 0) { img = img_data->image_norm; width = cnt->rotate_data.capture_width_norm; height = cnt->rotate_data.capture_height_norm; temp_buff = cnt->rotate_data.buffer_norm; } else { img = img_data->image_high; width = cnt->rotate_data.capture_width_high; height = cnt->rotate_data.capture_height_high; temp_buff = cnt->rotate_data.buffer_high; } /* * Pre-calculate some stuff: * wh - size of the Y plane * size - size of the entire memory block * wh4 - size of the U plane, and the V plane * w2 - width of the U plane, and the V plane * h2 - as w2, but height instead */ wh = width * height; size = wh * 3 / 2; wh4 = wh / 4; w2 = width / 2; h2 = height / 2; switch (axis) { case FLIP_TYPE_HORIZONTAL: flip_inplace_horizontal(img,width, height); flip_inplace_horizontal(img + wh, w2, h2); flip_inplace_horizontal(img + wh + wh4, w2, h2); break; case FLIP_TYPE_VERTICAL: flip_inplace_vertical(img,width, height); flip_inplace_vertical(img + wh, w2, h2); flip_inplace_vertical(img + wh + wh4, w2, h2); break; default: break; } switch (deg) { case 90: rot90cw(img, temp_buff, wh, width, height); rot90cw(img + wh, temp_buff + wh, wh4, w2, h2); rot90cw(img + wh + wh4, temp_buff + wh + wh4, wh4, w2, h2); memcpy(img, temp_buff, size); break; case 180: reverse_inplace_quad(img, wh); reverse_inplace_quad(img + wh, wh4); reverse_inplace_quad(img + wh + wh4, wh4); break; case 270: rot90ccw(img, temp_buff, wh, width, height); rot90ccw(img + wh, temp_buff + wh, wh4, w2, h2); rot90ccw(img + wh + wh4, temp_buff + wh + wh4, wh4, w2, h2); memcpy(img, temp_buff, size); break; default: /* Invalid */ return -1; } indx++; } return 0; } motion-release-4.6.0/src/rotate.h000066400000000000000000000041771452402535500167200ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * rotate.h * Headers associated with functions in the rotate.c module. * Copyright 2004-2005, Per Jonsson (per@pjd.nu) */ #ifndef _INCLUDE_ROTATE_H #define _INCLUDE_ROTATE_H /** * rotate_init * * Sets up rotation data by allocating a temporary buffer for 90/270 degrees * rotation, and by determining the right rotate-180-degrees function. * * Parameters: * * cnt - current thread's context structure * * Returns: nothing */ void rotate_init(struct context *cnt); /** * rotate_deinit * * Frees memory allocated by rotate_init. * * Parameters: * * cnt - current thread's context structure */ void rotate_deinit(struct context *cnt); /** * rotate_map * * Rotates the image stored in img according to the rotation data * available in cnt. Rotation is performed clockwise. Supports 90, * 180 and 270 degrees rotation. 180 degrees rotation is performed * in-place by simply reversing the image data, which is a very * fast operation. 90 and 270 degrees rotation are performed using * a temporary buffer and a somewhat more complicated algorithm, * which makes them slower. * * Note that to the caller, all rotations will seem as they are * performed in-place. * * Parameters: * * img_data - the image data to rotate * cnt - current thread's context structure * * Returns: * * 0 - success * -1 - failure (rare, shouldn't happen) */ int rotate_map(struct context *cnt, struct image_data *img_data); #endif motion-release-4.6.0/src/track.c000066400000000000000000001345101452402535500165140ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* track.c * * Experimental motion tracking. * * Copyright 2000, Jeroen Vreeken */ #include #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #ifdef HAVE_V4L2 #if defined(HAVE_LINUX_VIDEODEV2_H) #include #else #include #endif #include "pwc-ioctl.h" #endif struct trackoptions track_template = { .dev = -1, /* dev open */ .port = NULL, /* char *port */ .motorx = 0, /* int motorx */ .motory = 0, /* int motory */ .maxx = 0, /* int maxx; */ .maxy = 0, /* int maxy; */ .minx = 0, /* int minx; */ .miny = 0, /* int miny; */ .homex = 128, /* int homex; */ .homey = 128, /* int homey; */ .motorx_reverse = 0, /* int reversed x servo; */ .motory_reverse = 0, /* int reversed y servo; */ .speed = TRACK_SPEED, /* speed */ .stepsize = TRACK_STEPSIZE, /* stepsize */ .active = 0, /* auto tracking active */ .minmaxfound = 0, /* flag for minmax values stored for pwc based camera */ .step_angle_x = 10, /* UVC step angle in degrees X-axis that camera moves during auto tracking */ .step_angle_y = 10, /* UVC step angle in degrees Y-axis that camera moves during auto tracking */ .move_wait = 10, /* number of frames to disable motion detection after camera moving */ .generic_move = NULL /* command to execute to move a generic camera */ }; /* Add your own center and move functions here: */ static unsigned int servo_position(struct context *cnt, unsigned int motor); static unsigned int servo_center(struct context *cnt, int xoff, int yoff); static unsigned int stepper_center(struct context *cnt, int xoff, int yoff); static unsigned int iomojo_center(struct context *cnt, int xoff, int yoff); static unsigned int stepper_move(struct context *cnt, struct coord *cent, struct images *imgs); static unsigned int servo_move(struct context *cnt, struct coord *cent ,struct images *imgs, unsigned int manual); static unsigned int iomojo_move(struct context *cnt, int dev, struct coord *cent, struct images *imgs); #ifdef HAVE_V4L2 static unsigned int lqos_center(struct context *cnt, int dev, int xoff, int yoff); static unsigned int lqos_move(struct context *cnt, int dev, struct coord *cent ,struct images *imgs, unsigned int manual); static unsigned int uvc_center(struct context *cnt, int dev, int xoff, int yoff); static unsigned int uvc_move(struct context *cnt, int dev, struct coord *cent ,struct images *imgs, unsigned int manual); #endif /* HAVE_V4L2 */ static unsigned int generic_move(struct context *cnt, enum track_action action, unsigned int manual , int xoff, int yoff, struct coord *cent, struct images *imgs); /* Add a call to your functions here: */ unsigned int track_center(struct context *cnt, int dev, unsigned int manual, int xoff, int yoff) { struct coord cent; (void)dev; if (!manual && !cnt->track.active) { return 0; } if (cnt->track.type == TRACK_TYPE_STEPPER) { unsigned int ret; ret = stepper_center(cnt, xoff, yoff); if (!ret) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO,_("internal error")); return 0; } else { return ret; } } else if (cnt->track.type == TRACK_TYPE_SERVO) { return servo_center(cnt, xoff, yoff); #ifdef HAVE_V4L2 /*dreadful coding method imo */ } else if (cnt->track.type == TRACK_TYPE_PWC) { return lqos_center(cnt, dev, xoff, yoff); } else if (cnt->track.type == TRACK_TYPE_UVC) { return uvc_center(cnt, dev, xoff, yoff); #endif } else if (cnt->track.type == TRACK_TYPE_IOMOJO) { return iomojo_center(cnt, xoff, yoff); } else if (cnt->track.type == TRACK_TYPE_GENERIC) { if (cnt->track.generic_move) { cent.x = -cnt->track_posx; cent.y = -cnt->track_posy; return generic_move(cnt, TRACK_CENTER, manual,0 ,0 ,¢ , NULL); } else { return 10; // FIX ME. I chose to return something reasonable. } } MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("internal error, %hu is not a known track-type"), cnt->track.type); return 0; } /* Add a call to your functions here: */ unsigned int track_move(struct context *cnt, int dev, struct coord *cent , struct images *imgs, unsigned int manual) { if (!manual && !cnt->track.active) { return 0; } if (cnt->track.type == TRACK_TYPE_STEPPER) { return stepper_move(cnt, cent, imgs); } else if (cnt->track.type == TRACK_TYPE_SERVO) { return servo_move(cnt, cent, imgs, manual); #ifdef HAVE_V4L2 } else if (cnt->track.type == TRACK_TYPE_PWC) { return lqos_move(cnt, dev, cent, imgs, manual); } else if (cnt->track.type == TRACK_TYPE_UVC) { return uvc_move(cnt, dev, cent, imgs, manual); #endif } else if (cnt->track.type == TRACK_TYPE_IOMOJO) { return iomojo_move(cnt, dev, cent, imgs); } else if (cnt->track.type == TRACK_TYPE_GENERIC) { if (cnt->track.generic_move) { return generic_move(cnt, TRACK_MOVE, manual, 0, 0, cent, imgs); } else { return cnt->track.move_wait; // FIX ME. I chose to return something reasonable. } } MOTION_LOG(WRN, TYPE_TRACK, SHOW_ERRNO ,_("internal error, %hu is not a known track-type"), cnt->track.type); return 0; } /****************************************************************************** Stepper motor on serial port http://www.lavrsen.dk/twiki/bin/view/Motion/MotionTracking http://www.lavrsen.dk/twiki/bin/view/Motion/MotionTrackerAPI ******************************************************************************/ static unsigned int stepper_command(struct context *cnt, unsigned int motor , unsigned int command, unsigned int data) { char buffer[3]; time_t timeout = time(NULL); buffer[0] = motor; buffer[1] = command; buffer[2] = data; if (write(cnt->track.dev, buffer, 3) != 3) { MOTION_LOG(NTC, TYPE_TRACK, SHOW_ERRNO ,_("port %s dev fd %i, motor %hu command %hu data %hu") ,cnt->track.port, cnt->track.dev, motor, command, data); return 0; } while (read(cnt->track.dev, buffer, 1) != 1 && time(NULL) < timeout + 1) { continue; } if (time(NULL) >= timeout + 2) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO,_("Status byte timeout!")); return 0; } return buffer[0]; } static unsigned int stepper_status(struct context *cnt, unsigned int motor) { return stepper_command(cnt, motor, STEPPER_COMMAND_STATUS, 0); } static unsigned int stepper_center(struct context *cnt, int x_offset, int y_offset) { struct termios adtio; if (cnt->track.dev < 0) { MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("Try to open serial device %s"), cnt->track.port); if ((cnt->track.dev = open(cnt->track.port, O_RDWR|O_CLOEXEC | O_NOCTTY)) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Unable to open serial device %s"), cnt->track.port); return 0; } bzero (&adtio, sizeof(adtio)); adtio.c_cflag= STEPPER_BAUDRATE | CS8 | CLOCAL | CREAD; adtio.c_iflag= IGNPAR; adtio.c_oflag= 0; adtio.c_lflag= 0; /* non-canon, no echo */ adtio.c_cc[VTIME] = 0; /* timer unused */ adtio.c_cc[VMIN] = 0; /* blocking read until 1 char */ tcflush (cnt->track.dev, TCIFLUSH); if (tcsetattr(cnt->track.dev, TCSANOW, &adtio) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Unable to initialize serial device %s"), cnt->track.port); cnt->track.dev = -1; return 0; } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("Opened serial device %s and initialize, fd %i") ,cnt->track.port, cnt->track.dev); } /* x-axis */ stepper_command(cnt, cnt->track.motorx, STEPPER_COMMAND_SPEED, cnt->track.speed); stepper_command(cnt, cnt->track.motorx, STEPPER_COMMAND_LEFT_N, cnt->track.maxx); while (stepper_status(cnt, cnt->track.motorx) & STEPPER_STATUS_LEFT) { continue; } stepper_command(cnt, cnt->track.motorx, STEPPER_COMMAND_RIGHT_N, cnt->track.maxx / 2 + x_offset * cnt->track.stepsize); while (stepper_status(cnt, cnt->track.motorx) & STEPPER_STATUS_RIGHT) { continue; } /* y-axis */ stepper_command(cnt, cnt->track.motory, STEPPER_COMMAND_SPEED, cnt->track.speed); stepper_command(cnt, cnt->track.motory, STEPPER_COMMAND_UP_N, cnt->track.maxy); while (stepper_status(cnt, cnt->track.motory) & STEPPER_STATUS_UP) { continue; } stepper_command(cnt, cnt->track.motory, STEPPER_COMMAND_DOWN_N, cnt->track.maxy / 2 + y_offset * cnt->track.stepsize); while (stepper_status(cnt, cnt->track.motory) & STEPPER_STATUS_DOWN) { continue; } return cnt->track.move_wait; } static unsigned int stepper_move(struct context *cnt, struct coord *cent, struct images *imgs) { unsigned int command = 0, data = 0; if (cnt->track.dev < 0) { MOTION_LOG(WRN, TYPE_TRACK, NO_ERRNO ,_("No device %s started yet , trying stepper_center()") ,cnt->track.port); if (!stepper_center(cnt, 0, 0)) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("failed to initialize stepper device on %s , fd [%i].") ,cnt->track.port, cnt->track.dev); return 0; } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("succeed , device started %s , fd [%i]") ,cnt->track.port, cnt->track.dev); } /* x-axis */ if (cent->x < imgs->width / 2) { command = STEPPER_COMMAND_LEFT_N; data = imgs->width / 2 - cent->x; } if (cent->x > imgs->width / 2) { command = STEPPER_COMMAND_RIGHT_N; data = cent->x - imgs->width / 2; } data = data * cnt->track.stepsize / imgs->width; if (data) { stepper_command(cnt, cnt->track.motorx, command, data); } /* y-axis */ if (cent->y < imgs->height / 2) { command = STEPPER_COMMAND_UP_N; data = imgs->height / 2 - cent->y; } if (cent->y > imgs->height / 2) { command = STEPPER_COMMAND_DOWN_N; data = cent->y - imgs->height / 2; } data = data * cnt->track.stepsize / imgs->height; if (data) { stepper_command(cnt, cnt->track.motory, command, data); } return cnt->track.move_wait; } /****************************************************************************** * Servo motor on serial port * http://www.lavrsen.dk/twiki/bin/view/Motion/MotionTracking * http://www.lavrsen.dk/twiki/bin/view/Motion/MotionTrackerServoAPI ******************************************************************************/ static int servo_open(struct context *cnt) { struct termios adtio; if ((cnt->track.dev = open(cnt->track.port, O_RDWR|O_CLOEXEC | O_NOCTTY)) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Unable to open serial device %s"),cnt->track.port); return 0; } bzero (&adtio, sizeof(adtio)); adtio.c_cflag= SERVO_BAUDRATE | CS8 | CLOCAL | CREAD; adtio.c_iflag= IGNPAR; adtio.c_oflag= 0; adtio.c_lflag= 0; /* non-canon, no echo */ adtio.c_cc[VTIME] = 0; /* timer unused */ adtio.c_cc[VMIN] = 0; /* blocking read until 1 char */ tcflush (cnt->track.dev, TCIFLUSH); if (tcsetattr(cnt->track.dev, TCSANOW, &adtio) < 0) { MOTION_LOG(ERR, TYPE_TRACK, NO_ERRNO ,_("Unable to initialize serial device %s"), cnt->track.port); cnt->track.dev = -1; return 0; } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("Opened serial device %s and initialize, fd %i") ,cnt->track.port, cnt->track.dev); return 1; } static unsigned int servo_command(struct context *cnt, unsigned int motor , unsigned int command, unsigned int data) { unsigned char buffer[3]; time_t timeout = time(NULL); buffer[0] = motor; buffer[1] = command; buffer[2] = data; MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("SENDS port %s dev fd %i, motor %hu command %hu data %hu") ,cnt->track.port, cnt->track.dev, buffer[0], buffer[1], buffer[2]); if (write(cnt->track.dev, buffer, 3) != 3) { MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("port %s dev fd %i, motor %hu command %hu data %hu") ,cnt->track.port, cnt->track.dev, motor, command, data); return 0; } while (read(cnt->track.dev, buffer, 1) != 1 && time(NULL) < timeout + 1) { continue; } if (time(NULL) >= timeout + 2) { MOTION_LOG(ERR, TYPE_TRACK, NO_ERRNO,_("Status byte timeout!")); return 0; } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("Command return %d"), buffer[0]); return buffer[0]; } static unsigned int servo_position(struct context *cnt, unsigned int motor) { unsigned int ret = 0; ret = servo_command(cnt, motor, SERVO_COMMAND_POSITION, 0); return ret; } /** * servo_move * Does relative movements to current position. * */ static unsigned int servo_move(struct context *cnt, struct coord *cent , struct images *imgs, unsigned int manual) { unsigned int command = 0; unsigned int data = 0; unsigned int position; /* If device is not open yet , open and center */ if (cnt->track.dev < 0) { if (!servo_center(cnt, 0, 0)) { MOTION_LOG(ERR, TYPE_TRACK, NO_ERRNO,_("Problem opening servo!")); return 0; } } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("cent->x %d, cent->y %d, reversex %d, reversey %d manual %d") ,cent->x , cent->y, cnt->track.motorx_reverse ,cnt->track.motory_reverse, manual); if (manual) { int offset; if (cent->x) { position = servo_position(cnt, cnt->track.motorx); offset = cent->x * cnt->track.stepsize; if ((cnt->track.motorx_reverse && (offset > 0)) || (!cnt->track.motorx_reverse && (offset < 0))) { command = SERVO_COMMAND_LEFT_N; } else { command = SERVO_COMMAND_RIGHT_N; } data = abs(offset); if ((data + position > (unsigned)cnt->track.maxx) || (position - offset < (unsigned)cnt->track.minx)) { MOTION_LOG(ERR, TYPE_TRACK, NO_ERRNO ,_("x %d value out of range! (%d - %d)") ,data, cnt->track.minx, cnt->track.maxx); return 0; } /* Set Speed , TODO : it should be done only when speed changes */ servo_command(cnt, cnt->track.motorx, SERVO_COMMAND_SPEED, cnt->track.speed); servo_command(cnt, cnt->track.motorx, command, data); } if (cent->y) { position = servo_position(cnt, cnt->track.motory); offset = cent->y * cnt->track.stepsize; if ((cnt->track.motory_reverse && (offset > 0)) || (!cnt->track.motory_reverse && (offset < 0))) { command = SERVO_COMMAND_UP_N; } else { command = SERVO_COMMAND_DOWN_N; } data = abs(offset); if ((data + position > (unsigned)cnt->track.maxy) || (position - offset < (unsigned)cnt->track.miny)) { MOTION_LOG(ERR, TYPE_TRACK, NO_ERRNO ,_("y %d value out of range! (%d - %d)") ,data, cnt->track.miny, cnt->track.maxy); return 0; } /* Set Speed , TODO : it should be done only when speed changes */ servo_command(cnt, cnt->track.motory, SERVO_COMMAND_SPEED, cnt->track.speed); servo_command(cnt, cnt->track.motory, command, data); } } else { /***** x-axis *****/ /* Move left */ if (cent->x < imgs->width / 2) { if (cnt->track.motorx_reverse) { command = SERVO_COMMAND_RIGHT_N; } else { command = SERVO_COMMAND_LEFT_N; } data = imgs->width / 2 - cent->x; } /* Move right */ if (cent->x > imgs->width / 2) { if (cnt->track.motorx_reverse) { command = SERVO_COMMAND_LEFT_N; } else { command = SERVO_COMMAND_RIGHT_N; } data = cent->x - imgs->width / 2; } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO,_("X offset %d"), data); data = data * cnt->track.stepsize / imgs->width; if (data && command) { // TODO: need to get position to avoid overflow limits position = servo_position(cnt, cnt->track.motorx); if ((position + data > (unsigned)cnt->track.maxx) || (position - data < (unsigned)cnt->track.minx)) { MOTION_LOG(ERR, TYPE_TRACK, NO_ERRNO ,_("x %d value out of range! (%d - %d)") ,data, cnt->track.minx, cnt->track.maxx); return 0; } /* Set Speed , TODO : it should be done only when speed changes */ servo_command(cnt, cnt->track.motorx, SERVO_COMMAND_SPEED, cnt->track.speed); servo_command(cnt, cnt->track.motorx, command, data); MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("X cent->x %d, cent->y %d, reversex %d," "reversey %d motorx %d data %d command %d") ,cent->x, cent->y, cnt->track.motorx_reverse ,cnt->track.motory_reverse, cnt->track.motorx, data, command); } /***** y-axis *****/ /* Move down */ if (cent->y < imgs->height / 2) { if (cnt->track.motory_reverse) { command = SERVO_COMMAND_UP_N; } else { command = SERVO_COMMAND_DOWN_N; } data = imgs->height / 2 - cent->y; } /* Move up */ if (cent->y > imgs->height / 2) { if (cnt->track.motory_reverse) { command = SERVO_COMMAND_DOWN_N; } else { command = SERVO_COMMAND_UP_N; } data = cent->y - imgs->height / 2; } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO,_("Y offset %d"), data); data = data * cnt->track.stepsize / imgs->height; if (data && command) { // TODO: need to get position to avoid overflow limits position = servo_position(cnt, cnt->track.motory); if ((position + data > (unsigned)cnt->track.maxy) || (position - data < (unsigned)cnt->track.miny)) { MOTION_LOG(ERR, TYPE_TRACK, NO_ERRNO ,_("y %d value out of range! (%d - %d)") ,data, cnt->track.miny, cnt->track.maxy); return 0; } /* Set Speed , TODO : it should be done only when speed changes */ servo_command(cnt, cnt->track.motory, SERVO_COMMAND_SPEED, cnt->track.speed); servo_command(cnt, cnt->track.motory, command, data); MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("Y cent->x %d, cent->y %d, reversex %d," "reversey %d motory %d data %d command %d") ,cent->x, cent->y, cnt->track.motorx_reverse ,cnt->track.motory_reverse, cnt->track.motory, command); } } return cnt->track.move_wait; } #if 0 static unsigned int servo_status(struct context *cnt, unsigned int motor) { return servo_command(cnt, motor, SERVO_COMMAND_STATUS, 0); } #endif /** * servo_center * Moves servo to home position. * Does absolute movements ( offsets relative to home position ). * * Note : Using Clockwise as a convention for right , left , up , down * so left minx , right maxx , down miny , up maxy * */ static unsigned int servo_center(struct context *cnt, int x_offset, int y_offset) { int x_offset_abs; int y_offset_abs; /* If device is not open yet */ if (cnt->track.dev < 0) { if (!servo_open(cnt)) { MOTION_LOG(ERR, TYPE_TRACK, NO_ERRNO,_("Problem opening servo!")); return 0; } } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("X-offset %d, Y-offset %d, x-position %d. y-position %d," "reversex %d, reversey %d , stepsize %d") ,x_offset, y_offset ,cnt->track.homex + (x_offset * cnt->track.stepsize) ,cnt->track.homey + (y_offset * cnt->track.stepsize) ,cnt->track.motorx_reverse, cnt->track.motory_reverse ,cnt->track.stepsize); /* x-axis */ if (cnt->track.motorx_reverse) { x_offset_abs = (128 - cnt->track.homex) - (x_offset * cnt->track.stepsize) + 128; } else { x_offset_abs = cnt->track.homex + (x_offset * cnt->track.stepsize); } if (x_offset_abs <= cnt->track.maxx && x_offset_abs >= cnt->track.minx) { /* Set Speed , TODO : it should be done only when speed changes */ servo_command(cnt, cnt->track.motorx, SERVO_COMMAND_SPEED, cnt->track.speed); servo_command(cnt, cnt->track.motorx, SERVO_COMMAND_ABSOLUTE, x_offset_abs); } /* y-axis */ if (cnt->track.motory_reverse) { y_offset_abs = (128 - cnt->track.homey) - (y_offset * cnt->track.stepsize) + 128; } else { y_offset_abs = cnt->track.homey + (y_offset * cnt->track.stepsize); } if (y_offset_abs <= cnt->track.maxy && y_offset_abs >= cnt->track.minx) { /* Set Speed , TODO : it should be done only when speed changes */ servo_command(cnt, cnt->track.motory, SERVO_COMMAND_SPEED, cnt->track.speed); servo_command(cnt, cnt->track.motory, SERVO_COMMAND_ABSOLUTE, y_offset_abs); } return cnt->track.move_wait; } /****************************************************************************** Iomojo Smilecam on serial port ******************************************************************************/ static char iomojo_command(struct context *cnt, char *command, int len, unsigned int ret) { char buffer[1]; time_t timeout = time(NULL); if (write(cnt->track.dev, command, len) != len) { return 0; } if (ret) { while (read(cnt->track.dev, buffer, 1) != 1 && time(NULL) < timeout + 2) { continue; } if (time(NULL) >= timeout + 2) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO,_("Return byte timeout!")); return 0; } } /* range values ? */ return buffer[0]; } static void iomojo_setspeed(struct context *cnt, unsigned int speed) { char command[3]; command[0] = IOMOJO_SETSPEED_CMD; command[1] = cnt->track.iomojo_id; command[2] = speed; if (iomojo_command(cnt, command, 3, 1) != IOMOJO_SETSPEED_RET) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO,_("Unable to set camera speed")); } } static void iomojo_movehome(struct context *cnt) { char command[2]; command[0] = IOMOJO_MOVEHOME; command[1] = cnt->track.iomojo_id; iomojo_command(cnt, command, 2, 0); } static unsigned int iomojo_center(struct context *cnt, int x_offset, int y_offset) { struct termios adtio; char command[5], direction = 0; if (cnt->track.dev < 0) { if ((cnt->track.dev = open(cnt->track.port, O_RDWR|O_CLOEXEC | O_NOCTTY)) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Unable to open serial device %s"), cnt->track.port); return 0; } bzero (&adtio, sizeof(adtio)); adtio.c_cflag = IOMOJO_BAUDRATE | CS8 | CLOCAL | CREAD; adtio.c_iflag = IGNPAR; adtio.c_oflag = 0; adtio.c_lflag = 0; /* non-canon, no echo */ adtio.c_cc[VTIME] = 0; /* timer unused */ adtio.c_cc[VMIN] = 0; /* blocking read until 1 char */ tcflush(cnt->track.dev, TCIFLUSH); if (tcsetattr(cnt->track.dev, TCSANOW, &adtio) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Unable to initialize serial device %s"), cnt->track.port); return 0; } } iomojo_setspeed(cnt, 40); iomojo_movehome(cnt); if (x_offset || y_offset) { if (x_offset > 0) { direction |= IOMOJO_DIRECTION_RIGHT; } else { direction |= IOMOJO_DIRECTION_LEFT; x_offset *= -1; } if (y_offset > 0) { direction |= IOMOJO_DIRECTION_UP; } else { direction |= IOMOJO_DIRECTION_DOWN; y_offset *= -1; } if (x_offset > 180) { x_offset = 180; } if (y_offset > 60) { y_offset = 60; } command[0] = IOMOJO_MOVEOFFSET_CMD; command[1] = cnt->track.iomojo_id; command[2] = direction; command[3] = x_offset; command[4] = y_offset; iomojo_command(cnt, command, 5, 0); } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO,_("succeed")); return cnt->track.move_wait; } static unsigned int iomojo_move(struct context *cnt, int dev, struct coord *cent, struct images *imgs) { char command[5]; int direction = 0; int nx = 0, ny = 0; int i; if (dev < 0) { if (!iomojo_center(cnt, 0, 0)) { return 0; } } if (cent->x < imgs->width / 2) { direction |= IOMOJO_DIRECTION_LEFT; nx = imgs->width / 2 - cent->x; } if (cent->x > imgs->width / 2) { direction |= IOMOJO_DIRECTION_RIGHT; nx = cent->x - imgs->width / 2; } if (cent->y < imgs->height / 2) { direction |= IOMOJO_DIRECTION_DOWN; ny = imgs->height / 2 - cent->y; } if (cent->y > imgs->height / 2) { direction |= IOMOJO_DIRECTION_UP; ny = cent->y - imgs->height / 2; } nx = nx * 72 / imgs->width; ny = ny * 72 / imgs->height; if (nx || ny) { if (nx > 180) { nx = 180; } if (ny > 60) { ny = 60; } command[0] = IOMOJO_MOVEOFFSET_CMD; command[1] = cnt->track.iomojo_id; command[2] = direction; command[3] = nx; command[4] = ny; iomojo_command(cnt, command, 5, 0); /* Number of frames to skip while moving */ if (ny >= nx) { i = 25 * ny / 90; } else { i = 25 * nx / 90; } return i; } return 0; } /****************************************************************************** Logitech QuickCam Orbit camera tracking code by folkert@vanheusden.com ******************************************************************************/ #ifdef HAVE_V4L2 static unsigned int lqos_center(struct context *cnt, int dev, int x_angle, int y_angle) { int reset = 3; struct pwc_mpt_angles pma; struct pwc_mpt_range pmr; if (cnt->track.dev == -1) { if (ioctl(dev, VIDIOCPWCMPTRESET, &reset) == -1) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Failed to reset pwc camera to starting position! Reason")); return 0; } SLEEP(6, 0); if (ioctl(dev, VIDIOCPWCMPTGRANGE, &pmr) == -1) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("failed VIDIOCPWCMPTGRANGE")); return 0; } cnt->track.dev = dev; cnt->track.minmaxfound = 1; cnt->track.minx = pmr.pan_min; cnt->track.maxx = pmr.pan_max; cnt->track.miny = pmr.tilt_min; cnt->track.maxy = pmr.tilt_max; } if (ioctl(dev, VIDIOCPWCMPTGANGLE, &pma) == -1) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("ioctl VIDIOCPWCMPTGANGLE")); } pma.absolute = 1; if (x_angle * 100 < cnt->track.maxx && x_angle * 100 > cnt->track.minx) { pma.pan = x_angle * 100; } if (y_angle * 100 < cnt->track.maxy && y_angle * 100 > cnt->track.miny) { pma.tilt = y_angle * 100; } if (ioctl(dev, VIDIOCPWCMPTSANGLE, &pma) == -1) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Failed to pan/tilt pwc camera! Reason")); return 0; } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO,_("succeed")); return cnt->track.move_wait; } static unsigned int lqos_move(struct context *cnt, int dev, struct coord *cent , struct images *imgs, unsigned int manual) { int delta_x = cent->x - (imgs->width / 2); int delta_y = cent->y - (imgs->height / 2); int move_x_degrees, move_y_degrees; struct pwc_mpt_angles pma; struct pwc_mpt_range pmr; /* If we are on auto track we calculate delta, otherwise we use user input in degrees times 100 */ if (!manual) { if (delta_x > imgs->width * 3/8 && delta_x < imgs->width * 5/8) { return 0; } if (delta_y > imgs->height * 3/8 && delta_y < imgs->height * 5/8) { return 0; } move_x_degrees = delta_x * cnt->track.step_angle_x * 100 / (imgs->width / 2); move_y_degrees = -delta_y * cnt->track.step_angle_y * 100 / (imgs->height / 2); } else { move_x_degrees = cent->x * 100; move_y_degrees = cent->y * 100; } /* If we never checked for the min/max values for pan/tilt we do it now */ if (cnt->track.minmaxfound == 0) { if (ioctl(dev, VIDIOCPWCMPTGRANGE, &pmr) == -1) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("failed VIDIOCPWCMPTGRANGE")); return 0; } cnt->track.minmaxfound = 1; cnt->track.minx = pmr.pan_min; cnt->track.maxx = pmr.pan_max; cnt->track.miny = pmr.tilt_min; cnt->track.maxy = pmr.tilt_max; } /* Get current camera position */ if (ioctl(dev, VIDIOCPWCMPTGANGLE, &pma) == -1) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("ioctl VIDIOCPWCMPTGANGLE")); } /* * Check current position of camera and see if we need to adjust * values down to what is left to move */ if (move_x_degrees < 0 && (cnt->track.minx - pma.pan) > move_x_degrees) { move_x_degrees = (cnt->track.minx - pma.pan); } if (move_x_degrees > 0 && (cnt->track.maxx - pma.pan) < move_x_degrees) { move_x_degrees = (cnt->track.maxx - pma.pan); } if (move_y_degrees < 0 && (cnt->track.miny - pma.tilt) > move_y_degrees) { move_y_degrees = (cnt->track.miny - pma.tilt); } if (move_y_degrees > 0 && (cnt->track.maxy - pma.tilt) < move_y_degrees) { move_y_degrees = (cnt->track.maxy - pma.tilt); } /* Move camera relative to current position */ pma.absolute = 0; pma.pan = move_x_degrees; pma.tilt = move_y_degrees; if (ioctl(dev, VIDIOCPWCMPTSANGLE, &pma) == -1) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Failed to pan/tilt pwc camera! Reason")); return 0; } return cnt->track.move_wait; } /****************************************************************************** Logitech QuickCam Sphere camera tracking code by oBi Modify by Dirk Wesenberg(Munich) 30.03.07 - for new API in uvcvideo - add Trace-steps for investigation ******************************************************************************/ static unsigned int uvc_center(struct context *cnt, int dev, int x_angle, int y_angle) { /* CALC ABSOLUTE MOVING : Act.Position +/- delta to request X and Y */ int move_x_degrees = 0, move_y_degrees = 0; union pantilt { struct { short pan; short tilt; } s16; int value; }; union pantilt pan; if (cnt->track.dev == -1) { int reset = 3; //0-non reset, 1-reset pan, 2-reset tilt, 3-reset pan&tilt struct v4l2_control control_s; control_s.id = V4L2_CID_PAN_RESET; control_s.value = (unsigned char) reset; if (ioctl(dev, VIDIOC_S_CTRL, &control_s) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Failed to reset UVC camera to starting position! Reason")); return 0; } control_s.id = V4L2_CID_TILT_RESET; control_s.value = (unsigned char) reset; if (ioctl(dev, VIDIOC_S_CTRL, &control_s) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Failed to reset UVC camera to starting position! Reason")); return 0; } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("Reseting UVC camera to starting position")); SLEEP(8, 0); /* Get camera range */ struct v4l2_queryctrl queryctrl; queryctrl.id = V4L2_CID_PAN_RELATIVE; if (ioctl(dev, VIDIOC_QUERYCTRL, &queryctrl) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO,_("ioctl querycontrol")); return 0; } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO,_("Getting camera range")); /* DWe 30.03.07 The orig request failed : * must be VIDIOC_G_CTRL separate for pan and tilt or via VIDIOC_G_EXT_CTRLS - now for 1st manual * Range X = -70 to +70 degrees * Y = -30 to +30 degrees */ //get mininum //pan.value = queryctrl.minimum; cnt->track.minx = -4480 / INCPANTILT; cnt->track.miny = -1920 / INCPANTILT; //get maximum cnt->track.maxx = 4480 / INCPANTILT; cnt->track.maxy = 1920 / INCPANTILT; //pan.value = queryctrl.maximum; cnt->track.dev = dev; cnt->track.pan_angle = 0; cnt->track.tilt_angle = 0; cnt->track.minmaxfound = 1; } struct v4l2_control control_s; MOTION_LOG(DBG, TYPE_TRACK, NO_ERRNO ,_("INPUT_PARAM_ABS pan_min %d,pan_max %d,tilt_min %d,tilt_max %d ") ,cnt->track.minx, cnt->track.maxx, cnt->track.miny, cnt->track.maxy); MOTION_LOG(DBG, TYPE_TRACK, NO_ERRNO ,_("INPUT_PARAM_ABS X_Angel %d, Y_Angel %d ") ,x_angle, y_angle); if (x_angle <= cnt->track.maxx && x_angle >= cnt->track.minx) { move_x_degrees = x_angle - (cnt->track.pan_angle); } if (y_angle <= cnt->track.maxy && y_angle >= cnt->track.miny) { move_y_degrees = y_angle - (cnt->track.tilt_angle); } /* * tilt up: - value * tilt down: + value * pan left: - value * pan right: + value */ pan.s16.pan = -move_x_degrees * INCPANTILT; pan.s16.tilt = -move_y_degrees * INCPANTILT; MOTION_LOG(DBG, TYPE_TRACK, NO_ERRNO ,_("For_SET_ABS move_X %d,move_Y %d") ,move_x_degrees, move_y_degrees); /* DWe 30.03.07 Must be broken in diff calls, because * one call for both is not accept via VIDIOC_S_CTRL -> maybe via VIDIOC_S_EXT_CTRLS * The Webcam or uvcvideo does not like a call with a zero-move */ if (move_x_degrees != 0) { control_s.id = V4L2_CID_PAN_RELATIVE; //control_s.value = pan.value; control_s.value = pan.s16.pan; if (ioctl(dev, VIDIOC_S_CTRL, &control_s) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO,_("Failed to move UVC camera!")); return 0; } } /* DWe 30.03.07 We must wait a little,before we set the next CMD, otherwise PAN is mad ... */ if ((move_x_degrees != 0) && (move_y_degrees != 0)) { SLEEP(1, 0); } if (move_y_degrees != 0) { control_s.id = V4L2_CID_TILT_RELATIVE; //control_s.value = pan.value; control_s.value = pan.s16.tilt; if (ioctl(dev, VIDIOC_S_CTRL, &control_s) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO,_("Failed to move UVC camera!")); return 0; } } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("Found MINMAX = %d"),cnt->track.minmaxfound); if (cnt->track.dev != -1) { MOTION_LOG(DBG, TYPE_TRACK, NO_ERRNO ,_("Before_ABS_Y_Angel : x= %d , Y= %d, ") ,cnt->track.pan_angle, cnt->track.tilt_angle); if (move_x_degrees != -1) { cnt->track.pan_angle += move_x_degrees; } if (move_x_degrees != -1) { cnt->track.tilt_angle += move_y_degrees; } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("After_ABS_Y_Angel : x= %d , Y= %d") ,cnt->track.pan_angle, cnt->track.tilt_angle); } return cnt->track.move_wait; } static unsigned int uvc_move(struct context *cnt, int dev, struct coord *cent , struct images *imgs, unsigned int manual) { /* RELATIVE MOVING : Act.Position +/- X and Y */ int delta_x = cent->x - (imgs->width / 2); int delta_y = cent->y - (imgs->height / 2); int move_x_degrees, move_y_degrees; /* * DWe 30.03.07 Does the request of act.position from WebCam work ? luvcview shows at every position 180 :( * Now we init the Web by call Reset, so we can sure, that we are at x/y = 0,0 * Don't worry, if the WebCam make a sound - over End at PAN - hmmm, should it be normal ...? * PAN Value 7777 in relative will init also a want reset for CAM - it will be "0" after that */ if ((cnt->track.minmaxfound != 1) || (cent->x == 7777)) { unsigned int reset = 3; //0-non reset, 1-reset pan, 2-reset tilt, 3-reset pan&tilt struct v4l2_control control_s; control_s.id = V4L2_CID_PAN_RESET; control_s.value = (unsigned char) reset; if (ioctl(dev, VIDIOC_S_CTRL, &control_s) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Failed to reset UVC camera to starting position! Reason")); return 0; } control_s.id = V4L2_CID_TILT_RESET; control_s.value = (unsigned char) reset; if (ioctl(dev, VIDIOC_S_CTRL, &control_s) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Failed to reset UVC camera to starting position! Reason")); return 0; } MOTION_LOG(NTC, TYPE_TRACK, NO_ERRNO ,_("Reseting UVC camera to starting position")); /* set the "helpvalue" back to null because after reset CAM should be in x=0 and not 70 */ cent->x = 0; SLEEP(8, 0); /* * DWe 30.03.07 The orig request failed : * must be VIDIOC_G_CTRL separate for pan and tilt or via VIDIOC_G_EXT_CTRLS - now for 1st manual * Range X = -70 to +70 degrees * Y = -30 to +30 degrees */ cnt->track.minx = -4480 / INCPANTILT; cnt->track.miny = -1920 / INCPANTILT; cnt->track.maxx = 4480 / INCPANTILT; cnt->track.maxy = 1920 / INCPANTILT; cnt->track.dev = dev; cnt->track.pan_angle = 0; cnt->track.tilt_angle = 0; cnt->track.minmaxfound = 1; } /* If we are on auto track we calculate delta, otherwise we use user input in degrees */ if (!manual) { if (delta_x > imgs->width * 3/8 && delta_x < imgs->width * 5/8) { return 0; } if (delta_y > imgs->height * 3/8 && delta_y < imgs->height * 5/8) { return 0; } move_x_degrees = delta_x * cnt->track.step_angle_x / (imgs->width / 2); move_y_degrees = -delta_y * cnt->track.step_angle_y / (imgs->height / 2); } else { move_x_degrees = cent->x; move_y_degrees = cent->y; } union pantilt { struct { short pan; short tilt; } s16; int value; }; struct v4l2_control control_s; union pantilt pan; if (cnt->track.minmaxfound == 1) { /* * Check current position of camera and see if we need to adjust * values down to what is left to move */ if (move_x_degrees < 0 && (cnt->track.minx - cnt->track.pan_angle) > move_x_degrees) { move_x_degrees = cnt->track.minx - cnt->track.pan_angle; } if (move_x_degrees > 0 && (cnt->track.maxx - cnt->track.pan_angle) < move_x_degrees) { move_x_degrees = cnt->track.maxx - cnt->track.pan_angle; } if (move_y_degrees < 0 && (cnt->track.miny - cnt->track.tilt_angle) > move_y_degrees) { move_y_degrees = cnt->track.miny - cnt->track.tilt_angle; } if (move_y_degrees > 0 && (cnt->track.maxy - cnt->track.tilt_angle) < move_y_degrees) { move_y_degrees = cnt->track.maxy - cnt->track.tilt_angle; } } MOTION_LOG(DBG, TYPE_TRACK, NO_ERRNO ,_("For_SET_REL pan_min %d,pan_max %d,tilt_min %d,tilt_max %d") ,cnt->track.minx, cnt->track.maxx, cnt->track.miny, cnt->track.maxy); MOTION_LOG(DBG, TYPE_TRACK, NO_ERRNO ,_("For_SET_REL track_pan_Angel %d, track_tilt_Angel %d") ,cnt->track.pan_angle, cnt->track.tilt_angle); MOTION_LOG(DBG, TYPE_TRACK, NO_ERRNO ,_("For_SET_REL move_X %d,move_Y %d"), move_x_degrees, move_y_degrees); /* * tilt up: - value * tilt down: + value * pan left: - value * pan right: + value */ pan.s16.pan = -move_x_degrees * INCPANTILT; pan.s16.tilt = -move_y_degrees * INCPANTILT; /* DWe 30.03.07 Must be broken in diff calls, because * one call for both is not accept via VIDIOC_S_CTRL -> maybe via VIDIOC_S_EXT_CTRLS * The Webcam or uvcvideo does not like a call with a zero-move */ if (move_x_degrees != 0) { control_s.id = V4L2_CID_PAN_RELATIVE; control_s.value = pan.s16.pan; MOTION_LOG(DBG, TYPE_TRACK, NO_ERRNO ,_(" dev %d, addr= %d, control_S= %d, Wert= %d") ,dev, VIDIOC_S_CTRL, &control_s, pan.s16.pan); if (ioctl(dev, VIDIOC_S_CTRL, &control_s) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Failed to move UVC camera!")); return 0; } } /* DWe 30.03.07 We must wait a little,before we set the next CMD, otherwise PAN is mad ... */ if ((move_x_degrees != 0) && (move_y_degrees != 0)) { SLEEP (1, 0); } if (move_y_degrees != 0) { control_s.id = V4L2_CID_TILT_RELATIVE; control_s.value = pan.s16.tilt; MOTION_LOG(DBG, TYPE_TRACK, NO_ERRNO ,_(" dev %d,addr= %d, control_S= %d, Wert= %d") ,dev, VIDIOC_S_CTRL, &control_s, pan.s16.tilt); if (ioctl(dev, VIDIOC_S_CTRL, &control_s) < 0) { MOTION_LOG(ERR, TYPE_TRACK, SHOW_ERRNO ,_("Failed to move UVC camera!")); return 0; } } MOTION_LOG(DBG, TYPE_TRACK, NO_ERRNO ,_("Found MINMAX = %d"), cnt->track.minmaxfound); if (cnt->track.minmaxfound == 1) { MOTION_LOG(DBG, TYPE_TRACK, NO_ERRNO ,_("Before_REL_Y_Angel : x= %d , Y= %d") ,cnt->track.pan_angle, cnt->track.tilt_angle); if (move_x_degrees != 0) { cnt->track.pan_angle += -pan.s16.pan / INCPANTILT; } if (move_y_degrees != 0) { cnt->track.tilt_angle += -pan.s16.tilt / INCPANTILT; } MOTION_LOG(DBG, TYPE_TRACK, NO_ERRNO ,_("After_REL_Y_Angel : x= %d , Y= %d") ,cnt->track.pan_angle, cnt->track.tilt_angle); } return cnt->track.move_wait; } #endif /* HAVE_V4L2 */ static unsigned int generic_move(struct context *cnt, enum track_action action , unsigned int manual, int xoff, int yoff, struct coord *cent, struct images *imgs) { char fmtcmd[PATH_MAX]; cnt->track_posx += cent->x; cnt->track_posy += cent->y; mystrftime(cnt, fmtcmd, sizeof(fmtcmd), cnt->track.generic_move, &cnt->current_image->timestamp_tv, NULL, 0); if (!fork()) { int i; char buf[12]; /* Detach from parent */ setsid(); /* Provides data as environment variables */ if (manual) { setenv("TRACK_MANUAL", "manual", 1); } switch (action) { case TRACK_CENTER: setenv("TRACK_ACTION", "center", 1); sprintf(buf, "%d", xoff); setenv("TRACK_XOFF", buf, 1); sprintf(buf, "%d", yoff); setenv("TRACK_YOFF", buf, 1); break; case TRACK_MOVE: setenv("TRACK_ACTION", "move", 1); if (cent) { sprintf(buf, "%d", cent->x); setenv("TRACK_CENT_X", buf, 1); sprintf(buf, "%d", cent->y); setenv("TRACK_CENT_Y", buf, 1); sprintf(buf, "%d", cent->width); setenv("TRACK_CENT_WIDTH", buf, 1); sprintf(buf, "%d", cent->height); setenv("TRACK_CENT_HEIGHT", buf, 1); sprintf(buf, "%d", cent->minx); setenv("TRACK_CENT_MINX", buf, 1); sprintf(buf, "%d", cent->maxx); setenv("TRACK_CENT_MAXX", buf, 1); sprintf(buf, "%d", cent->miny); setenv("TRACK_CENT_MINY", buf, 1); sprintf(buf, "%d", cent->maxy); setenv("TRACK_CENT_MAXY", buf, 1); } if (imgs) { sprintf(buf, "%d", imgs->width); setenv("TRACK_IMGS_WIDTH", buf, 1); sprintf(buf, "%d", imgs->height); setenv("TRACK_IMGS_HEIGHT", buf, 1); sprintf(buf, "%d", imgs->motionsize); setenv("TRACK_IMGS_MOTIONSIZE", buf, 1); } } /* * Close any file descriptor except console because we will * like to see error messages */ for (i = getdtablesize() - 1; i > 2; i--) { close(i); } execl("/bin/sh", "sh", "-c", fmtcmd, " &", NULL); /* if above function succeeds the program never reach here */ MOTION_LOG(ALR, TYPE_EVENTS, SHOW_ERRNO ,_("Unable to start external command '%s'") ,cnt->track.generic_move); exit(1); } MOTION_LOG(DBG, TYPE_EVENTS, NO_ERRNO ,_("Executing external command '%s'") , fmtcmd); return cnt->track.move_wait; } motion-release-4.6.0/src/track.h000066400000000000000000000134631452402535500165240ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * track.h * Headers associated with functions in the track.c module. * Copyright 2000, Jeroen Vreeken */ #ifndef _INCLUDE_TRACK_H #define _INCLUDE_TRACK_H #include "alg.h" #include struct trackoptions { int dev; /* Config options: */ unsigned int type; char *port; unsigned int motorx; unsigned int motory; int maxx; int maxy; int minx; int miny; unsigned int stepsize; unsigned int speed; unsigned int homex; unsigned int homey; unsigned int iomojo_id; unsigned int active; /* This is the track_auto but 'auto' is defined word so use active*/ unsigned int motorx_reverse; unsigned int motory_reverse; unsigned int minmaxfound; unsigned int step_angle_x; unsigned int step_angle_y; unsigned int move_wait; /* UVC */ int pan_angle; // degrees int tilt_angle; // degrees char *generic_move; }; extern struct trackoptions track_template; unsigned int track_center(struct context *cnt, int dev , unsigned int manual, int xoff, int yoff); unsigned int track_move(struct context *cnt, int dev, struct coord *cent , struct images *imgs, unsigned int manual); enum track_action { TRACK_CENTER, TRACK_MOVE }; /* * Some default values: */ #define TRACK_SPEED 255 #define TRACK_STEPSIZE 40 #define TRACK_TYPE_STEPPER 1 #define TRACK_TYPE_IOMOJO 2 #define TRACK_TYPE_PWC 3 #define TRACK_TYPE_GENERIC 4 #define TRACK_TYPE_UVC 5 #define TRACK_TYPE_SERVO 6 /* * Some defines for the Serial stepper motor: */ #define STEPPER_BAUDRATE B9600 #define STEPPER_STATUS_LEFT 1 #define STEPPER_STATUS_RIGHT 2 #define STEPPER_STATUS_SAFETYL 4 #define STEPPER_STATUS_SAFETYR 8 #define STEPPER_STATUS_UP 1 #define STEPPER_STATUS_DOWN 2 #define STEPPER_STATUS_SAFETYU 4 #define STEPPER_STATUS_SAFETYD 8 #define STEPPER_COMMAND_STATUS 0 #define STEPPER_COMMAND_LEFT_N 1 #define STEPPER_COMMAND_RIGHT_N 2 #define STEPPER_COMMAND_LEFT 3 #define STEPPER_COMMAND_RIGHT 4 #define STEPPER_COMMAND_SWEEP 5 #define STEPPER_COMMAND_STOP 6 #define STEPPER_COMMAND_SPEED 7 #define STEPPER_COMMAND_UP_N 1 #define STEPPER_COMMAND_DOWN_N 2 #define STEPPER_COMMAND_UP 3 #define STEPPER_COMMAND_DOWN 4 /* * Some defines for the Serial servo motor: */ /* * Controlling: * Three bytes are sent to the servo - BYTE1=SERVO_COMMAND BYTE2=COMMAND BYTE3=DATA * eg, sending the command 01 02 08 would Command SERVO_COMMAND1 to move LEFT a total of 8 STEPS * * An extra command 0x08 has been added but here is the basic command set. * * 0x00 STATUS - Current status byte will be returned, data byte ignored * 0x01 LEFT_N - Servo will take N Steps to the Left until it reaches the Servos safety limit * 0x02 RIGHT_N - Servo will take N Steps to the Right until it reaches the Servos safety limit * 0x03 LEFT - Servo will move to Left most position, data byte ignored. * 0x04 RIGHT - Servo will move to Right most position, data byte ignored. * 0x05 SWEEP - Servo will sweep between its extremes, data byte ignored. * 0x06 STOP - Servo will Stop, data byte ignored * 0x07 SPEED - Set servos speed between 0 and 255. * 0x08 ABSOLUTE - Set servo to absolute position between 0 and 255 * 0x09 POSITION - Get servo to absolute position between 0 and 255 * */ #define SERVO_BAUDRATE B9600 #define SERVO_COMMAND_STATUS 0 #define SERVO_COMMAND_LEFT_N 1 #define SERVO_COMMAND_RIGHT_N 2 #define SERVO_COMMAND_LEFT 3 #define SERVO_COMMAND_RIGHT 4 #define SERVO_COMMAND_SWEEP 5 #define SERVO_COMMAND_STOP 6 #define SERVO_COMMAND_SPEED 7 #define SERVO_COMMAND_ABSOLUTE 8 #define SERVO_COMMAND_POSITION 9 #define SERVO_COMMAND_UP_N 1 #define SERVO_COMMAND_DOWN_N 2 #define SERVO_COMMAND_UP 3 #define SERVO_COMMAND_DOWN 4 /* * Some defines for the Iomojo Smilecam: */ #define IOMOJO_BAUDRATE B19200 #define IOMOJO_CHECKPOWER_CMD 0xff #define IOMOJO_CHECKPOWER_RET 'Q' #define IOMOJO_MOVEOFFSET_CMD 0xfe #define IOMOJO_SETSPEED_CMD 0xfd #define IOMOJO_SETSPEED_RET 'P' #define IOMOJO_MOVEHOME 0xf9 #define IOMOJO_RESTART 0xf7 #define IOMOJO_DIRECTION_RIGHT 0x01 #define IOMOJO_DIRECTION_LEFT 0x02 #define IOMOJO_DIRECTION_DOWN 0x04 #define IOMOJO_DIRECTION_UP 0x08 #ifdef HAVE_V4L2 /* * Defines for the Logitech QuickCam Orbit/Sphere USB webcam */ #define LQOS_VERTICAL_DEGREES 180 #define LQOS_HORIZONAL_DEGREES 120 /* * UVC */ #ifndef V4L2_CID_PAN_RELATIVE #define V4L2_CID_PAN_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+4) #endif #ifndef V4L2_CID_TILT_RELATIVE #define V4L2_CID_TILT_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+5) #endif #ifndef V4L2_CID_PAN_RESET #define V4L2_CID_PAN_RESET (V4L2_CID_CAMERA_CLASS_BASE+6) #endif #ifndef V4L2_CID_TILT_RESET #define V4L2_CID_TILT_RESET (V4L2_CID_CAMERA_CLASS_BASE+7) #endif #define INCPANTILT 64 // 1 degree #endif /* HAVE_V4L2 */ #endif /* _INCLUDE_TRACK_H */ motion-release-4.6.0/src/translate.c000066400000000000000000000042131452402535500174010ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * Translations for Web User control interface. * * */ #include #include "motion.h" #include "logger.h" #include "translate.h" int nls_enabled; /* Testing routine for code development only. * Does nothing in normal operations and just returns. */ void translate_locale_chg(const char *langcd) { #ifdef HAVE_GETTEXT return; setenv ("LANGUAGE", langcd, 1); /* Invoke external function to change locale*/ ++_nl_msg_cat_cntr; #else if (langcd != NULL) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO,"No native language support"); } #endif } void translate_init(struct context *cnt) { #ifdef HAVE_GETTEXT if (cnt->conf.native_language == 1) { nls_enabled = 1; setlocale (LC_ALL, ""); bindtextdomain ("motion", LOCALEDIR); bind_textdomain_codeset ("motion", "UTF-8"); textdomain ("motion"); } else { nls_enabled = 0; } MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO,_("Language: English")); #else nls_enabled = 0; (void)cnt; #endif if (nls_enabled == 1) { translate_locale_chg("es"); /* This is a testing only function call*/ } } char* translate_text(const char *msgid) { #ifdef HAVE_GETTEXT if (nls_enabled) { return (char*)gettext(msgid); } else { return (char*)msgid; } #else return (char*)msgid; #endif } motion-release-4.6.0/src/translate.h000066400000000000000000000022761452402535500174150ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * translate.h * Headers associated with functions in the translate.c module. */ #ifndef _INCLUDE_TRANSLATE_H_ #define _INCLUDE_TRANSLATE_H_ extern int nls_enabled; #ifdef HAVE_GETTEXT #include extern int _nl_msg_cat_cntr; /* Required for changing the locale dynamically */ #endif #define _(STRING) translate_text(STRING) char* translate_text(const char *msgid); void translate_init(struct context *cnt); void translate_locale_chg(const char *langcd); #endif // _INCLUDE_TRANSLATE_H_ motion-release-4.6.0/src/util.c000066400000000000000000001224231452402535500163650ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /** * util.c * * Module of utility and "my" functions used across Motion application. * */ #include "motion.h" #include "translate.h" #include "logger.h" #include "util.h" #ifdef HAVE_FFMPEG /*********************************************/ AVFrame *my_frame_alloc(void) { AVFrame *pic; #if ( MYFFVER >= 55000) pic = av_frame_alloc(); #else pic = avcodec_alloc_frame(); #endif return pic; } /*********************************************/ void my_frame_free(AVFrame *frame) { #if ( MYFFVER >= 55000) av_frame_free(&frame); #else av_freep(&frame); #endif } /*********************************************/ int my_image_get_buffer_size(enum MyPixelFormat pix_fmt, int width, int height) { int retcd = 0; #if ( MYFFVER >= 57000) int align = 1; retcd = av_image_get_buffer_size(pix_fmt, width, height, align); #else retcd = avpicture_get_size(pix_fmt, width, height); #endif return retcd; } /*********************************************/ int my_image_copy_to_buffer(AVFrame *frame, uint8_t *buffer_ptr, enum MyPixelFormat pix_fmt,int width, int height,int dest_size) { int retcd = 0; #if ( MYFFVER >= 57000) int align = 1; retcd = av_image_copy_to_buffer((uint8_t *)buffer_ptr,dest_size ,(const uint8_t * const*)frame,frame->linesize,pix_fmt,width,height,align); #else retcd = avpicture_layout((const AVPicture*)frame,pix_fmt,width,height ,(unsigned char *)buffer_ptr,dest_size); #endif return retcd; } /*********************************************/ int my_image_fill_arrays(AVFrame *frame,uint8_t *buffer_ptr,enum MyPixelFormat pix_fmt,int width,int height) { int retcd = 0; #if ( MYFFVER >= 57000) int align = 1; retcd = av_image_fill_arrays( frame->data ,frame->linesize ,buffer_ptr ,pix_fmt ,width ,height ,align ); #else retcd = avpicture_fill( (AVPicture *)frame ,buffer_ptr ,pix_fmt ,width ,height); #endif return retcd; } /*********************************************/ void my_packet_free(AVPacket *pkt) { #if (MYFFVER >= 57041) av_packet_free(&pkt); #else av_free_packet(pkt); #endif } /*********************************************/ void my_avcodec_close(AVCodecContext *codec_context) { #if ( MYFFVER >= 57041) avcodec_free_context(&codec_context); #else avcodec_close(codec_context); #endif } /*********************************************/ int my_copy_packet(AVPacket *dest_pkt, AVPacket *src_pkt) { #if ( MYFFVER >= 55000) return av_packet_ref(dest_pkt, src_pkt); #else /* Old versions of libav do not support copying packet * We therefore disable the pass through recording and * for this function, simply do not do anything */ if (dest_pkt == src_pkt ) { return 0; } else { return 0; } #endif } /*********************************************/ AVPacket *my_packet_alloc(AVPacket *pkt) { if (pkt != NULL) { my_packet_free(pkt); }; pkt = av_packet_alloc(); #if (MYFFVER < 58076) av_init_packet(pkt); pkt->data = NULL; pkt->size = 0; #endif return pkt; } #endif /*********************************************/ /** * mymalloc * * Allocates some memory and checks if that succeeded or not. If it failed, * do some errorlogging and bail out. * * NOTE: Kenneth Lavrsen changed printing of size_t types so instead of using * conversion specifier %zd I changed it to %llu and casted the size_t * variable to unsigned long long. The reason for this nonsense is that older * versions of gcc like 2.95 uses %Zd and does not understand %zd. So to avoid * this mess I used a more generic way. Long long should have enough bits for * 64-bit machines with large memory areas. * * Parameters: * * nbytes - no. of bytes to allocate * * Returns: a pointer to the allocated memory */ void *mymalloc(size_t nbytes) { void *dummy = calloc(nbytes, 1); if (!dummy) { MOTION_LOG(EMG, TYPE_ALL, SHOW_ERRNO, _("Could not allocate %llu bytes of memory!") ,(unsigned long long)nbytes); motion_remove_pid(); exit(1); } return dummy; } /** * myrealloc * * Re-allocate (i.e., resize) some memory and check if that succeeded or not. * If it failed, do some errorlogging and bail out. If the new memory size * is 0, the memory is freed. * * Parameters: * * ptr - pointer to the memory to resize/reallocate * size - new memory size * desc - name of the calling function * * Returns: a pointer to the reallocated memory, or NULL if the memory was * freed */ void *myrealloc(void *ptr, size_t size, const char *desc) { void *dummy = NULL; if (size == 0) { free(ptr); MOTION_LOG(WRN, TYPE_ALL, NO_ERRNO ,_("Warning! Function %s tries to resize memoryblock to 0 bytes!") ,desc); } else { dummy = realloc(ptr, size); if (!dummy) { MOTION_LOG(EMG, TYPE_ALL, NO_ERRNO ,_("Could not resize memory-block at offset %p to %llu bytes (function %s)!") ,ptr, (unsigned long long)size, desc); motion_remove_pid(); exit(1); } } return dummy; } /** * mycreate_path * * This function creates a whole path, like mkdir -p. Example paths: * this/is/an/example/ * /this/is/an/example/ * Warning: a path *must* end with a slash! * * Parameters: * * cnt - current thread's context structure (for logging) * path - the path to create * * Returns: 0 on success, -1 on failure */ int mycreate_path(const char *path) { char *start; mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; if (path[0] == '/') { start = strchr(path + 1, '/'); } else { start = strchr(path, '/'); } while (start) { char *buffer = mystrdup(path); buffer[start-path] = 0x00; if (mkdir(buffer, mode) == -1 && errno != EEXIST) { MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO ,_("Problem creating directory %s"), buffer); free(buffer); return -1; } start = strchr(start + 1, '/'); if (!start) { MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, _("creating directory %s"), buffer); } free(buffer); } return 0; } /** * myfopen * * This function opens a file, if that failed because of an ENOENT error * (which is: path does not exist), the path is created and then things are * tried again. This is faster then trying to create that path over and over * again. If someone removes the path after it was created, myfopen will * recreate the path automatically. * * Parameters: * * path - path to the file to open * mode - open mode * * Returns: the file stream object */ FILE *myfopen(const char *path, const char *mode) { /* first, just try to open the file */ FILE *dummy = fopen(path, mode); if (dummy) { return dummy; } /* could not open file... */ /* path did not exist? */ if (errno == ENOENT) { /* create path for file... */ if (mycreate_path(path) == -1) { return NULL; } /* and retry opening the file */ dummy = fopen(path, mode); } if (!dummy) { /* * Two possibilities * 1: there was an other error while trying to open the file for the * first time * 2: could still not open the file after the path was created */ MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO ,_("Error opening file %s with mode %s"), path, mode); return NULL; } return dummy; } /** * myfclose * * Motion-specific variant of fclose() * * Returns: fclose() return value */ int myfclose(FILE *fh) { int rval = fclose(fh); if (rval != 0) { MOTION_LOG(ERR, TYPE_ALL, SHOW_ERRNO, _("Error closing file")); } return rval; } /** * mystrftime_long * * Motion-specific long form of format specifiers. * * Parameters: * * cnt - current thread's context structure. * width - width associated with the format specifier. * word - beginning of the format specifier's word. * l - length of the format specifier's word. * out - output buffer where to store the result. Size: PATH_MAX. * * This is called if a format specifier with the format below was found: * * % { word } * * As a special edge case, an incomplete format at the end of the string * is processed as well: * * % { word \0 * * Any valid format specified width is supported, e.g. "%12{host}". * * The following specifier keywords are currently supported: * * host Replaced with the name of the local machine (see gethostname(2)). * fps Equivalent to %fps. */ static void mystrftime_long (const struct context *cnt, int width, const char *word, int l, char *out) { #define SPECIFIERWORD(k) ((strlen(k)==l) && (!strncmp (k, word, l))) if (SPECIFIERWORD("host")) { snprintf (out, PATH_MAX, "%*s", width, cnt->hostname); return; } if (SPECIFIERWORD("fps")) { sprintf(out, "%*d", width, cnt->movie_fps); return; } if (SPECIFIERWORD("dbeventid")) { MOTION_LOG(ERR, TYPE_DB, NO_ERRNO, _("{dbeventid} is not supported. Use eventid.")); return; } if (SPECIFIERWORD("ver")) { sprintf(out, "%*s", width, VERSION); return; } if (SPECIFIERWORD("eventid")) { sprintf(out, "%*s", width, cnt->eventid); return; } // Not a valid modifier keyword. Log the error and ignore. MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO, _("invalid format specifier keyword %*.*s"), l, l, word); // Do not let the output buffer empty, or else where to restart the // interpretation of the user string will become dependent to far too // many conditions. Maybe change loop to "if (*pos_userformat == '%') { // ...} __else__ ..."? out[0] = '~'; out[1] = 0; } /** * mystrftime * * Motion-specific variant of strftime(3) that supports additional format * specifiers in the format string. * * Parameters: * * cnt - current thread's context structure * s - destination string * max - max number of bytes to write * userformat - format string * tm - time information * filename - string containing full path of filename * set this to NULL if not relevant * sqltype - Filetype as used in SQL feature, set to 0 if not relevant * * Returns: number of bytes written to the string s */ size_t mystrftime(const struct context *cnt, char *s, size_t max, const char *userformat , const struct timeval *tv1, const char *filename, int sqltype) { char formatstring[PATH_MAX] = ""; char tempstring[PATH_MAX] = ""; char *format, *tempstr; const char *pos_userformat; int width; struct tm timestamp_tm; localtime_r(&tv1->tv_sec, ×tamp_tm); format = formatstring; /* if mystrftime is called with userformat = NULL we return a zero length string */ if (userformat == NULL) { *s = '\0'; return 0; } for (pos_userformat = userformat; *pos_userformat; ++pos_userformat) { if (*pos_userformat == '%') { /* * Reset 'tempstr' to point to the beginning of 'tempstring', * otherwise we will eat up tempstring if there are many * format specifiers. */ tempstr = tempstring; tempstr[0] = '\0'; width = 0; while ('0' <= pos_userformat[1] && pos_userformat[1] <= '9') { width *= 10; width += pos_userformat[1] - '0'; ++pos_userformat; } switch (*++pos_userformat) { case '\0': // end of string --pos_userformat; break; case 'v': // event sprintf(tempstr, "%0*d", width ? width : 2, cnt->event_nr); break; case 'q': // shots sprintf(tempstr, "%0*d", width ? width : 2, cnt->current_image->shot); break; case 'D': // diffs sprintf(tempstr, "%*d", width, cnt->current_image->diffs); break; case 'N': // noise sprintf(tempstr, "%*d", width, cnt->noise); break; case 'i': // motion width sprintf(tempstr, "%*d", width, cnt->current_image->location.width); break; case 'J': // motion height sprintf(tempstr, "%*d", width, cnt->current_image->location.height); break; case 'K': // motion center x sprintf(tempstr, "%*d", width, cnt->current_image->location.x); break; case 'L': // motion center y sprintf(tempstr, "%*d", width, cnt->current_image->location.y); break; case 'o': // threshold sprintf(tempstr, "%*d", width, cnt->threshold); break; case 'Q': // number of labels sprintf(tempstr, "%*d", width, cnt->current_image->total_labels); break; case 't': // camera id sprintf(tempstr, "%*d", width, cnt->camera_id); break; case 'C': // text_event if (cnt->text_event_string[0]) { snprintf(tempstr, PATH_MAX, "%*s", width, cnt->text_event_string); } else { ++pos_userformat; } break; case 'w': // picture width sprintf(tempstr, "%*d", width, cnt->imgs.width); break; case 'h': // picture height sprintf(tempstr, "%*d", width, cnt->imgs.height); break; case 'f': // filename -- or %fps if ((*(pos_userformat+1) == 'p') && (*(pos_userformat+2) == 's')) { sprintf(tempstr, "%*d", width, cnt->movie_fps); pos_userformat += 2; break; } if (filename) { snprintf(tempstr, PATH_MAX, "%*s", width, filename); } else { ++pos_userformat; } break; case 'n': // sqltype if (sqltype) { sprintf(tempstr, "%*d", width, sqltype); } else { ++pos_userformat; } break; case '{': // long format specifier word. { const char *word = ++pos_userformat; while ((*pos_userformat != '}') && (*pos_userformat != 0)) { ++pos_userformat; } mystrftime_long ((struct context *)cnt, width, word, (int)(pos_userformat-word), tempstr); if (*pos_userformat == '\0') { --pos_userformat; } } break; case '$': // thread name if (cnt->conf.camera_name && cnt->conf.camera_name[0]) { snprintf(tempstr, PATH_MAX, "%s", cnt->conf.camera_name); } else { ++pos_userformat; } break; default: // Any other code is copied with the %-sign *format++ = '%'; *format++ = *pos_userformat; continue; } /* * If a format specifier was found and used, copy the result from * 'tempstr' to 'format'. */ if (tempstr[0]) { while ((*format = *tempstr++) != '\0') { ++format; } continue; } } /* For any other character than % we just simply copy the character */ *format++ = *pos_userformat; } *format = '\0'; format = formatstring; return strftime(s, max, format, ×tamp_tm); } /* This is a temporary location for these util functions. All the generic utility * functions will be collected here and ultimately moved into a new common "util" module */ void util_threadname_set(const char *abbr, int threadnbr, const char *threadname) { /* When the abbreviation is sent in as null, that means we are being * provided a fully filled out thread name (usually obtained from a * previously called get_threadname so we set it without additional * formatting. */ char tname[16]; if (abbr != NULL) { snprintf(tname, sizeof(tname), "%s%d%s%s",abbr,threadnbr, threadname ? ":" : "", threadname ? threadname : ""); } else { snprintf(tname, sizeof(tname), "%s",threadname); } #ifdef __APPLE__ pthread_setname_np(tname); #elif defined(BSD) pthread_set_name_np(pthread_self(), tname); #elif HAVE_PTHREAD_SETNAME_NP pthread_setname_np(pthread_self(), tname); #else MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO, _("Unable to set thread name %s"), tname); #endif } void util_threadname_get(char *threadname) { #if ((!defined(BSD) && HAVE_PTHREAD_GETNAME_NP) || defined(__APPLE__)) char currname[16]; pthread_getname_np(pthread_self(), currname, sizeof(currname)); snprintf(threadname, sizeof(currname), "%s",currname); #else snprintf(threadname, 8, "%s","Unknown"); #endif } int util_check_passthrough(struct context *cnt) { #if ( MYFFVER < 55000) if (cnt->movie_passthrough) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("FFMPEG version too old. Disabling pass-through processing.")); } return 0; #else if (cnt->movie_passthrough) { MOTION_LOG(INF, TYPE_NETCAM, NO_ERRNO ,_("pass-through enabled.")); return 1; } else { return 0; } #endif } /* util_trim * Trim away any leading or trailing whitespace in the string */ void util_trim(char *parm) { int indx, indx_st, indx_en; if (parm == NULL) { return; } indx_en = strlen(parm) - 1; if (indx_en == -1) { return; } indx_st = 0; while (isspace(parm[indx_st]) && (indx_st <= indx_en)) { indx_st++; } if (indx_st > indx_en) { parm[0]= '\0'; return; } while (isspace(parm[indx_en]) && (indx_en > indx_st)) { indx_en--; } for (indx = indx_st; indx<=indx_en; indx++) { parm[indx-indx_st] = parm[indx]; } parm[indx_en-indx_st+1] = '\0'; } /* util_parms_add * Add the parsed out parameter and value to the control array. */ static void util_parms_add(struct params_context *parameters , const char *parm_nm, const char *parm_vl, int logmsg) { int indx, retcd; indx=parameters->params_count; parameters->params_count++; if (indx == 0) { parameters->params_array =(struct params_item_ctx *) mymalloc(sizeof(struct params_item_ctx)); } else { parameters->params_array = (struct params_item_ctx *)realloc(parameters->params_array , sizeof(struct params_item_ctx)*(indx+1)); } if (parm_nm != NULL) { parameters->params_array[indx].param_name = (char*)mymalloc(strlen(parm_nm)+1); retcd = sprintf(parameters->params_array[indx].param_name,"%s",parm_nm); if (retcd < 0) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error setting parm >%s<"),parm_nm); free(parameters->params_array[indx].param_name); parameters->params_array[indx].param_name = NULL; } } else { parameters->params_array[indx].param_name = NULL; } if (parm_vl != NULL) { parameters->params_array[indx].param_value = (char*)mymalloc(strlen(parm_vl)+1); retcd = sprintf(parameters->params_array[indx].param_value,"%s",parm_vl); if (retcd < 0) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error setting parm >%s<"),parm_vl); free(parameters->params_array[indx].param_value); parameters->params_array[indx].param_value = NULL; } } else { parameters->params_array[indx].param_value = NULL; } if (logmsg) { MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,_("Parsed: >%s< >%s<") ,parameters->params_array[indx].param_name ,parameters->params_array[indx].param_value); } else { MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,_("Parsed: >redacted< >redacted<")); } } /* util_parms_extract * Extract out of the configuration string the name and values at the location specified. */ static void util_parms_extract(struct params_context *parameters, char *parmlne , size_t indxnm_st, size_t indxnm_en, size_t indxvl_st, size_t indxvl_en , int logmsg) { char *parm_nm, *parm_vl; int retcd, chksz; /* MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,"%s", parmlne); MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,"012345678901234567890123456789012345678901234567890"); MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,"%d %d, %d, %d" , indxnm_st, indxnm_en, indxvl_st, indxvl_en); */ if ((indxnm_en != 0) && (indxvl_st != 0) && ((int)(indxnm_en - indxnm_st) >= 0) && ((int)(indxvl_en - indxvl_st) >= 0)) { parm_nm = mymalloc(PATH_MAX); parm_vl = mymalloc(PATH_MAX); chksz = indxnm_en - indxnm_st + 2; retcd = snprintf(parm_nm, chksz, "%s", parmlne + indxnm_st); if (retcd < 0) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error parsing parm_nm controls: %s"), parmlne); free(parm_nm); parm_nm = NULL; } chksz = indxvl_en - indxvl_st + 2; retcd = snprintf(parm_vl, chksz, "%s", parmlne + indxvl_st); if (retcd < 0) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error parsing parm_vl controls: %s"), parmlne); free(parm_vl); parm_vl = NULL; } util_trim(parm_nm); util_trim(parm_vl); util_parms_add(parameters, parm_nm, parm_vl, logmsg); if (parm_nm != NULL) { free(parm_nm); } if (parm_vl != NULL) { free(parm_vl); } } } /* util_parms_next * Remove the parameter parsed out in previous steps from the parms string * and set up the string for parsing out the next parameter. */ static void util_parms_next(char *parmlne, size_t indxpr_st, size_t indxpr_en) { char *parm_tmp; int retcd; /* MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,"%s", parmlne); MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,"012345678901234567890123456789012345678901234567890"); MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,"%d %d", indxpr_st, indxpr_en); */ parm_tmp = mymalloc(PATH_MAX); retcd = snprintf(parm_tmp, PATH_MAX, "%s", parmlne); if (retcd < 0) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error setting temp: %s"), parmlne); free(parm_tmp); return; } if (indxpr_st == 0) { if (indxpr_en >= strlen(parmlne)) { parmlne[0]='\0'; } else { retcd = snprintf(parmlne, strlen(parm_tmp) - indxpr_en + 2 , "%s", parm_tmp + indxpr_en + 1); } } else { if (indxpr_en >= strlen(parmlne)) { retcd = snprintf(parmlne, indxpr_st, "%s", parm_tmp); } else { retcd = snprintf(parmlne, PATH_MAX, "%.*s%.*s" , (int)indxpr_st, parm_tmp , (int)(strlen(parm_tmp) - indxpr_en) , parm_tmp + indxpr_en + 1); } } if (retcd < 0) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error reparsing controls: %s"), parmlne); } free(parm_tmp); } /* util_parms_parse_qte * Split out the parameters that have quotes around the name. */ static void util_parms_parse_qte(struct params_context *parameters, char *parmlne, int logmsg) { size_t indxnm_st, indxnm_en, indxvl_st, indxvl_en; size_t indxcm, indxeq, indxqte_st, indxqte_en; size_t indxpr_st, indxpr_en; while (strstr(parmlne,"\"") != NULL) { indxnm_st = 0; indxnm_en = 0; indxvl_st = 0; indxvl_en = strlen(parmlne); indxpr_st = 0; indxpr_en = strlen(parmlne); indxqte_st = strcspn(parmlne,"\""); indxqte_en = strlen(parmlne); if (strstr(parmlne + indxqte_st + 1,"\"") != NULL) { indxqte_en = strcspn(parmlne + indxqte_st + 1,"\"") + indxqte_st + 1; } indxcm = strlen(parmlne); if (strstr(parmlne + indxqte_en + 1,",") != NULL) { indxcm = strcspn(parmlne + indxqte_en + 1,",") + indxqte_en + 1; } indxeq = strlen(parmlne); if (strstr(parmlne + indxqte_en + 1,"=") != NULL) { indxeq = strcspn(parmlne + indxqte_en + 1,"=") + indxqte_en + 1; } if (indxcm <= indxeq) { /* The quoted item is not followed by an equal so it is the value. */ indxvl_st = indxqte_st + 1; indxvl_en = indxqte_en - 1; if (strstr(parmlne, ",") != NULL) { indxcm = 0; while ((strstr(parmlne + indxcm, ",") != NULL) && ((strcspn(parmlne + indxcm, ",") + indxcm) < indxvl_st)) { indxcm = strcspn(parmlne + indxcm, ",") + indxcm + 1; } indxnm_st = indxcm; } else { indxnm_st = 0; } indxnm_en = indxnm_st; if (strstr(parmlne + indxnm_st, "=") != NULL) { indxnm_en = strcspn(parmlne + indxnm_st, "=") + indxnm_st - 1; } indxpr_st = indxnm_st; } else { /*The quoted item is the name, now check the value*/ indxnm_st = indxqte_st + 1; indxnm_en = indxqte_en - 1; indxpr_st = indxqte_st; indxvl_st = indxeq + 1; if (indxvl_st > strlen(parmlne)) { /* There is not any equal */ indxvl_st = strlen(parmlne); indxvl_en = strlen(parmlne); } else { if (strstr(parmlne + indxvl_st,"\"") != NULL) { indxqte_st = strcspn(parmlne + indxvl_st,"\"") + indxvl_st + 1; if (indxqte_st > indxcm) { /*The quoted item is for the next parm */ indxvl_en = indxcm - 1; } else { /*The value is also quoted*/ indxqte_en = strlen(parmlne); if (strstr(parmlne + indxqte_st,"\"") != NULL) { indxqte_en = strcspn(parmlne + indxqte_st,"\"")+ indxqte_st; } indxvl_st = indxqte_st; indxvl_en = indxqte_en - 1; } } else { /* No more quotes so end is the comma position*/ indxvl_en = indxcm - 1; } } } /* Find the next comma or end of line */ if ((strstr(parmlne + indxvl_en, ",") != NULL)) { indxpr_en = strcspn(parmlne + indxvl_en, ",") + indxvl_en; } else { indxpr_en = strlen(parmlne); } util_parms_extract(parameters, parmlne, indxnm_st, indxnm_en, indxvl_st, indxvl_en, logmsg); util_parms_next(parmlne, indxpr_st, indxpr_en); } } /* util_parms_parse_comma * Split out the parameters between the commas. */ static void util_parms_parse_comma(struct params_context *parameters, char *parmlne, int logmsg) { size_t indxnm_st, indxnm_en, indxvl_st, indxvl_en; while (strstr(parmlne,",") != NULL) { indxnm_st = 0; indxnm_en = 0; indxvl_st = 0; indxvl_en = strcspn(parmlne, ",") - 1; if (strstr(parmlne, "=") != NULL) { indxnm_en = strcspn(parmlne, "=") - 1; indxvl_st = indxnm_en + 2; } util_parms_extract(parameters, parmlne, indxnm_st, indxnm_en, indxvl_st, indxvl_en, logmsg); util_parms_next(parmlne, indxnm_st, indxvl_en + 1); } } /* util_parms_free * Free all the memory associated with the parameter control array. */ void util_parms_free(struct params_context *parameters) { int indx; if (parameters == NULL) { return; } for (indx = 0; indx < parameters->params_count; indx++) { if (parameters->params_array[indx].param_name != NULL) { free(parameters->params_array[indx].param_name); } parameters->params_array[indx].param_name = NULL; if (parameters->params_array[indx].param_value != NULL) { free(parameters->params_array[indx].param_value); } parameters->params_array[indx].param_value = NULL; } if (parameters->params_array != NULL) { free(parameters->params_array); } parameters->params_array = NULL; parameters->params_count = 0; } /* util_parms_parse * Parse the user provided string of parameters into a array. */ void util_parms_parse(struct params_context *parameters, char *confparm, int logmsg) { /* Parse through the configuration option to get values * The values are separated by commas but may also have * double quotes around the names which include a comma. * Examples: * video_params "Brightness, auto" = 1, ID23456=2 * netcam_params newparm = "1,2,3,r,a,b,c",other=a * video_params "a,b,d" = "1,2,3" */ int retcd; size_t indxnm_st, indxnm_en, indxvl_st, indxvl_en; char *parmlne; util_parms_free(parameters); parmlne = NULL; if (confparm != NULL) { if (logmsg) { MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO ,_("Parsing: %s"), confparm); } else { MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO ,_("Parsing: ")); } parmlne = mymalloc(PATH_MAX); retcd = snprintf(parmlne, PATH_MAX, "%s", confparm); if ((retcd < 0) || (retcd > PATH_MAX)) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Error parsing controls: %s"), confparm); free(parmlne); return; } util_parms_parse_qte(parameters, parmlne, logmsg); util_parms_parse_comma(parameters, parmlne, logmsg); if (strlen(parmlne) != 0) { indxnm_st = 0; indxnm_en = 0; indxvl_st = 0; indxvl_en = strlen(parmlne); if (strstr(parmlne,"=") != NULL) { indxnm_en = strcspn(parmlne,"=") - 1; indxvl_st = indxnm_en + 2; } util_parms_extract(parameters, parmlne, indxnm_st, indxnm_en, indxvl_st, indxvl_en, logmsg); } free(parmlne); } return; } void util_parms_add_default(struct params_context *parameters, const char *parm_nm, const char *parm_vl) { int indx, dflt; dflt = TRUE; for (indx = 0; indx < parameters->params_count; indx++) { if ( mystreq(parameters->params_array[indx].param_name, parm_nm) ) { dflt = FALSE; } } if (dflt == TRUE) { util_parms_add(parameters, parm_nm, parm_vl, TRUE); } } /* util_parms_add_update * Add a new value or update an existing one. */ void util_parms_add_update(struct params_context *parameters, const char *parm_nm, const char *parm_vl) { int indx, newval, retcd; newval = TRUE; for (indx = 0; indx < parameters->params_count; indx++) { if ( mystreq(parameters->params_array[indx].param_name, parm_nm) ) { newval = FALSE; } } if (newval == TRUE) { util_parms_add(parameters, parm_nm, parm_vl, TRUE); } else { for (indx = 0; indx < parameters->params_count; indx++) { if ( mystreq(parameters->params_array[indx].param_name, parm_nm) ) { free(parameters->params_array[indx].param_value); parameters->params_array[indx].param_value = mymalloc(strlen(parm_vl) + 1); retcd = snprintf(parameters->params_array[indx].param_value , strlen(parm_vl) + 1 , "%s", parm_vl); if ((retcd < 0) || (retcd > PATH_MAX)) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error: %s") , parameters->params_array[indx].param_value); } } } } } /* Update config line with the values from the params array */ void util_parms_update(struct params_context *params, struct context *cnt, const char *cfgitm) { int indx, retcd; char newline[PATH_MAX]; char cpyline[PATH_MAX]; char fmt[15]; memset(newline,'\0', PATH_MAX); memset(cpyline,'\0', PATH_MAX); for (indx = 0; indx < params->params_count; indx++) { /* Determine format spec for newline*/ memset(fmt,'\0', 15); if (indx > 0) { memcpy(fmt,"%s,", 3); } if ((strstr(params->params_array[indx].param_name," ") == NULL) && (strstr(params->params_array[indx].param_name,",") == NULL) && (strstr(params->params_array[indx].param_name,"=") == NULL)) { memcpy(fmt + strlen(fmt),"%s", 2); } else { memcpy(fmt + strlen(fmt),"\"%s\"", 4); } if ((strstr(params->params_array[indx].param_value," ") == NULL) && (strstr(params->params_array[indx].param_value,",") == NULL) && (strstr(params->params_array[indx].param_value,"=") == NULL)) { memcpy(fmt + strlen(fmt),"=%s", 3); } else { memcpy(fmt + strlen(fmt),"=\"%s\"", 5); } /*Create the new line */ if (indx > 0) { retcd = snprintf(newline, PATH_MAX , fmt, cpyline , params->params_array[indx].param_name , params->params_array[indx].param_value); } else { retcd = snprintf(newline, PATH_MAX , fmt , params->params_array[indx].param_name , params->params_array[indx].param_value); } if ((retcd < 0) || (retcd > PATH_MAX)) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error: %s"), newline); } /* Create a copy of our new line for use in next iteration of loop*/ retcd = snprintf(cpyline, PATH_MAX, "%s", newline); if ((retcd < 0) || (retcd > PATH_MAX)) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error: %s"), newline); } } /* Assign finished new parameter line to the config item */ if (mystreq(cfgitm, "netcam_params")) { free(cnt->conf.netcam_params); cnt->conf.netcam_params = mymalloc(strlen(newline)+1); retcd = snprintf(cnt->conf.netcam_params, strlen(newline)+1, "%s", newline); if ((retcd < 0) || (retcd > PATH_MAX)) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error: %s"), newline); } MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, _("New netcam_params: %s"), newline); } else if (mystreq(cfgitm, "netcam_high_params")) { free(cnt->conf.netcam_high_params); cnt->conf.netcam_high_params = mymalloc(strlen(newline)+1); retcd = snprintf(cnt->conf.netcam_high_params, strlen(newline)+1, "%s", newline); if ((retcd < 0) || (retcd > PATH_MAX)) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error: %s"), newline); } MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, _("New netcam_high_params: %s"), newline); } else if (mystreq(cfgitm, "video_params")) { free(cnt->conf.video_params); cnt->conf.video_params = mymalloc(strlen(newline)+1); retcd = snprintf(cnt->conf.video_params, strlen(newline)+1, "%s", newline); if ((retcd < 0) || (retcd > PATH_MAX)) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error: %s"), newline); } MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, _("New video_params: %s"), newline); } else if (mystreq(cfgitm, "webcontrol_header_params")) { free(cnt->conf.webcontrol_header_params); cnt->conf.webcontrol_header_params = mymalloc(strlen(newline)+1); retcd = snprintf(cnt->conf.webcontrol_header_params, strlen(newline)+1, "%s", newline); if ((retcd < 0) || (retcd > PATH_MAX)) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error: %s"), newline); } if (cnt->conf.webcontrol_localhost) { MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, _("New webcontrol_header_params: %s"), newline); } else { MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, _("New webcontrol_header_params: ")); } } else if (mystreq(cfgitm, "stream_header_params")) { free(cnt->conf.stream_header_params); cnt->conf.stream_header_params = mymalloc(strlen(newline)+1); retcd = snprintf(cnt->conf.stream_header_params, strlen(newline)+1, "%s", newline); if ((retcd < 0) || (retcd > PATH_MAX)) { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO,_("Error: %s"), newline); } if (cnt->conf.stream_localhost) { MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, _("New stream_header_params: %s"), newline); } else { MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO, _("New stream_header_params: ")); } } else { MOTION_LOG(ERR, TYPE_ALL, NO_ERRNO ,_("Programming error. Unknown configuration item: %s"), cfgitm); } return; } /** Non case sensitive equality check for strings*/ int mystrceq(const char *var1, const char *var2) { if ((var1 == NULL) || (var2 == NULL)) { return FALSE; } return (strcasecmp(var1,var2) ? FALSE : TRUE); } /** Non case sensitive inequality check for strings*/ int mystrcne(const char *var1, const char *var2) { if ((var1 == NULL) || (var2 == NULL)) { return FALSE; } return (strcasecmp(var1,var2) ? TRUE : FALSE); } /** Case sensitive equality check for strings*/ int mystreq(const char *var1, const char *var2) { if ((var1 == NULL) || (var2 == NULL)) { return FALSE; } return (strcmp(var1,var2) ? FALSE : TRUE); } /** Case sensitive inequality check for strings*/ int mystrne(const char *var1, const char *var2) { if ((var1 == NULL) ||(var2 == NULL)) { return FALSE; } return (strcmp(var1,var2) ? TRUE : FALSE); } /** * mystrcpy * Is used to assign string type fields (e.g. config options) * In a way so that we the memory is malloc'ed to fit the string. * If a field is already pointing to a string (not NULL) the memory of the * old string is free'd and new memory is malloc'ed and filled with the * new string is copied into the the memory and with the char pointer * pointing to the new string. * * from - pointer to the new string we want to copy * to - the pointer to the current string (or pointing to NULL) * If not NULL the memory it points to is free'd. * * Returns pointer to the new string which is in malloc'ed memory * FIXME The strings that are malloc'ed with this function should be freed * when the motion program is terminated normally instead of relying on the * OS to clean up. */ char *mystrcpy(char *to, const char *from) { /* * Free the memory used by the to string, if such memory exists, * and return a pointer to a freshly malloc()'d string with the * same value as from. */ if (to != NULL) { free(to); } return mystrdup(from); } /** * mystrdup * Truncates the string to the length given by the environment * variable PATH_MAX to ensure that config options can always contain * a really long path but no more than that. * * Returns a pointer to a freshly malloc()'d string with the same * value as the string that the input parameter 'from' points to, * or NULL if the from string is 0 characters. */ char *mystrdup(const char *from) { char *tmp; size_t stringlength; if (from == NULL || !strlen(from)) { tmp = NULL; } else { stringlength = strlen(from); stringlength = (stringlength < PATH_MAX ? stringlength : PATH_MAX); tmp = mymalloc(stringlength + 1); strncpy(tmp, from, stringlength); /* * We must ensure the string always has a NULL terminator. * This necessary because strncpy will not append a NULL terminator * if the original string is greater than string length. */ tmp += stringlength; *tmp = '\0'; tmp -= stringlength; } return tmp; } motion-release-4.6.0/src/util.h000066400000000000000000000117711452402535500163750ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * util.h * Headers associated with functions in the util.c module. */ #ifndef _INCLUDE_UTIL_H #define _INCLUDE_UTIL_H #ifdef HAVE_FFMPEG #if ( MYFFVER >= 56000) #define MY_PIX_FMT_YUV420P AV_PIX_FMT_YUV420P #define MY_PIX_FMT_YUVJ420P AV_PIX_FMT_YUVJ420P #define MyPixelFormat AVPixelFormat #else //Old ffmpeg pixel formats #define MY_PIX_FMT_YUV420P PIX_FMT_YUV420P #define MY_PIX_FMT_YUVJ420P PIX_FMT_YUVJ420P #define MyPixelFormat PixelFormat #endif //myffver >= 56000 #if ( MYFFVER > 54006) #define MY_FLAG_READ AVIO_FLAG_READ #define MY_FLAG_WRITE AVIO_FLAG_WRITE #define MY_FLAG_READ_WRITE AVIO_FLAG_READ_WRITE #else //Older versions #define MY_FLAG_READ URL_RDONLY #define MY_FLAG_WRITE URL_WRONLY #define MY_FLAG_READ_WRITE URL_RDWR #endif /*********************************************/ #if ( MYFFVER >= 56000) #define MY_CODEC_ID_MSMPEG4V2 AV_CODEC_ID_MSMPEG4V2 #define MY_CODEC_ID_FLV1 AV_CODEC_ID_FLV1 #define MY_CODEC_ID_FFV1 AV_CODEC_ID_FFV1 #define MY_CODEC_ID_NONE AV_CODEC_ID_NONE #define MY_CODEC_ID_MPEG2VIDEO AV_CODEC_ID_MPEG2VIDEO #define MY_CODEC_ID_H264 AV_CODEC_ID_H264 #define MY_CODEC_ID_HEVC AV_CODEC_ID_HEVC #else #define MY_CODEC_ID_MSMPEG4V2 CODEC_ID_MSMPEG4V2 #define MY_CODEC_ID_FLV1 CODEC_ID_FLV1 #define MY_CODEC_ID_FFV1 CODEC_ID_FFV1 #define MY_CODEC_ID_NONE CODEC_ID_NONE #define MY_CODEC_ID_MPEG2VIDEO CODEC_ID_MPEG2VIDEO #define MY_CODEC_ID_H264 CODEC_ID_H264 #define MY_CODEC_ID_HEVC CODEC_ID_H264 #endif /*********************************************/ #if (MYFFVER >= 57000) #define MY_CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER #define MY_CODEC_FLAG_QSCALE AV_CODEC_FLAG_QSCALE #else #define MY_CODEC_FLAG_GLOBAL_HEADER CODEC_FLAG_GLOBAL_HEADER #define MY_CODEC_FLAG_QSCALE CODEC_FLAG_QSCALE #endif #if (MYFFVER >= 59000) typedef const AVCodec my_AVCodec; /* Version independent for AVCodec*/ #else typedef AVCodec my_AVCodec; /* Version independent for AVCodec*/ #endif AVFrame *my_frame_alloc(void); void my_frame_free(AVFrame *frame); void my_packet_free(AVPacket *pkt); void my_avcodec_close(AVCodecContext *codec_context); int my_image_get_buffer_size(enum MyPixelFormat pix_fmt, int width, int height); int my_image_copy_to_buffer(AVFrame *frame,uint8_t *buffer_ptr,enum MyPixelFormat pix_fmt,int width,int height,int dest_size); int my_image_fill_arrays(AVFrame *frame,uint8_t *buffer_ptr,enum MyPixelFormat pix_fmt,int width,int height); int my_copy_packet(AVPacket *dest_pkt, AVPacket *src_pkt); AVPacket *my_packet_alloc(AVPacket *pkt); #endif /* HAVE_FFMPEG */ #if MHD_VERSION >= 0x00097002 typedef enum MHD_Result mymhd_retcd; #else typedef int mymhd_retcd; #endif void *mymalloc(size_t nbytes); void *myrealloc(void *ptr, size_t size, const char *desc); FILE *myfopen(const char *path, const char *mode); int myfclose(FILE *fh); size_t mystrftime(const struct context *cnt, char *s, size_t max, const char *userformat , const struct timeval *tv1, const char *filename, int sqltype); int mycreate_path(const char *path); char *mystrcpy(char *to, const char *from); char *mystrdup(const char *from); void util_threadname_set(const char *abbr, int threadnbr, const char *threadname); void util_threadname_get(char *threadname); int util_check_passthrough(struct context *cnt); void util_trim(char *parm); void util_parms_free(struct params_context *parameters); void util_parms_parse(struct params_context *parameters, char *confparm, int logmsg); void util_parms_add_default(struct params_context *parameters, const char *parm_nm, const char *parm_vl); void util_parms_add_update(struct params_context *parameters, const char *parm_nm, const char *parm_vl); void util_parms_update(struct params_context *params, struct context *cnt, const char *cfgitm); int mystrceq(const char *var1, const char *var2); int mystrcne(const char *var1, const char *var2); int mystreq(const char *var1, const char *var2); int mystrne(const char *var1, const char *var2); #endif motion-release-4.6.0/src/video_bktr.c000066400000000000000000000746171452402535500175530ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* video_bktr.c * * BSD Video stream functions for motion. * Copyright 2004 by Angel Carpintero (motiondevelop@gmail.com) * */ /* For rotation */ #include "motion.h" #include "util.h" #include "translate.h" #include "logger.h" #include "rotate.h" #include "video_common.h" #include "video_bktr.h" #ifdef HAVE_BKTR #include #if defined(HAVE_DEV_IC_BT8XX_H) #include #endif #if defined(HAVE_DEV_BKTR_IOCTL_METEOR_H) #include #endif #if defined(HAVE_DEV_BKTR_IOCTL_BT848_H) #include #endif #define array_elem(x) (sizeof(x) / sizeof((x)[0])) #define BKTR_PAL 0 #define BKTR_NTSC 1 #define BKTR_SECAM 2 #define BKTR_PAL_NC 3 #define BKTR_PAL_HEIGHT 576 #define BKTR_SECAM_HEIGHT 576 #define BKTR_NTSC_HEIGHT 480 #define BKTR_IN_COMPOSITE 0 #define BKTR_IN_TV 1 #define BKTR_IN_COMPOSITE2 2 #define BKTR_IN_SVIDEO 3 #define BKTR_NORM_DEFAULT BT848_IFORM_F_AUTO #define BKTR_NORM_PAL BT848_IFORM_F_PALBDGHI #define BKTR_NORM_NTSC BT848_IFORM_F_NTSCM #define BKTR_NORM_SECAM BT848_IFORM_F_SECAM volatile sig_atomic_t bktr_frame_waiting; static pthread_mutex_t bktr_mutex; static struct video_dev *viddevs = NULL; static void catchsignal(int sig) { (void)sig; bktr_frame_waiting++; } static int bktr_set_hue(int viddev, int new_hue) { signed char ioctlval = new_hue; if (ioctl(viddev, METEORSHUE, &ioctlval) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("METEORSHUE Error setting hue [%d]"),new_hue); return -1; } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("to [%d]"), ioctlval); return ioctlval; } static int bktr_get_hue(int viddev , int *hue) { signed char ioctlval; if (ioctl(viddev, METEORGHUE, &ioctlval) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO,_("METEORGHUE Error getting hue")); return -1; } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("to [%d]"), ioctlval); *hue = ioctlval; return ioctlval; } static int bktr_set_saturation(int viddev, int new_saturation) { unsigned char ioctlval= new_saturation; if (ioctl(viddev, METEORSCSAT, &ioctlval) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("METEORSCSAT Error setting saturation [%d]"), new_saturation); return -1; } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("to [%d]"), ioctlval); return ioctlval; } static int bktr_get_saturation(int viddev , int *saturation) { unsigned char ioctlval; if (ioctl(viddev, METEORGCSAT, &ioctlval) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("METEORGCSAT Error getting saturation")); return -1; } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("to [%d]"), ioctlval); *saturation = ioctlval; return ioctlval; } static int bktr_set_contrast(int viddev, int new_contrast) { unsigned char ioctlval = new_contrast; if (ioctl(viddev, METEORSCONT, &ioctlval) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("METEORSCONT Error setting contrast [%d]"), new_contrast); return 0; } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("to [%d]"), ioctlval); return ioctlval; } static int bktr_get_contrast(int viddev, int *contrast) { unsigned char ioctlval; if (ioctl(viddev, METEORGCONT, &ioctlval) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("METEORGCONT Error getting contrast")); return -1; } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("to [%d]"), ioctlval); *contrast = ioctlval; return ioctlval; } static int bktr_set_brightness(int viddev, int new_bright) { unsigned char ioctlval = new_bright; if (ioctl(viddev, METEORSBRIG, &ioctlval) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("METEORSBRIG brightness [%d]"), new_bright); return -1; } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("to [%d]"), ioctlval); return ioctlval; } static int bktr_get_brightness(int viddev, int *brightness) { unsigned char ioctlval; if (ioctl(viddev, METEORGBRIG, &ioctlval) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("METEORGBRIG getting brightness")); return -1; } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("to [%d]"), ioctlval); *brightness = ioctlval; return ioctlval; } static int bktr_set_freq(struct video_dev *viddev, long freq) { int tuner_fd = viddev->bktr_fdtuner; int old_audio; MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO,_("Not implemented")); return 0; /* HACK maybe not need it , but seems that is needed to mute before changing frequency */ if (ioctl(tuner_fd, BT848_GAUDIO, &old_audio) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "BT848_GAUDIO"); return -1; } if (ioctl(tuner_fd, TVTUNER_SETFREQ, &freq) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "Tuning (TVTUNER_SETFREQ) failed, ", "freq [%ld]", freq); return -1; } old_audio &= AUDIO_MUTE; if (old_audio) { old_audio = AUDIO_MUTE; if (ioctl(tuner_fd , BT848_SAUDIO, &old_audio) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "BT848_SAUDIO %i", old_audio); return -1; } } return 0; } static int bktr_set_input_device(struct video_dev *viddev, unsigned input) { int actport; int portdata[] = { METEOR_INPUT_DEV0, METEOR_INPUT_DEV1, METEOR_INPUT_DEV2, METEOR_INPUT_DEV3, METEOR_INPUT_DEV_SVIDEO }; if (input >= array_elem(portdata)) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO,_("Device Input %d out of range (0-4)"), input); return -1; } actport = portdata[ input ]; if (ioctl(viddev->fd_device, METEORSINPUT, &actport) < 0) { if (input != BKTR_IN_COMPOSITE) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("METEORSINPUT %d invalid -Trying composite %d") , input, BKTR_IN_COMPOSITE); input = BKTR_IN_COMPOSITE; actport = portdata[ input ]; if (ioctl(viddev->fd_device, METEORSINPUT, &actport) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "METEORSINPUT %d init", input); return -1; } } else { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "METEORSINPUT %d init", input); return -1; } } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "to [%d]", input); return input; } static int bktr_set_input_format(struct video_dev *viddev, unsigned newformat) { int input_format[] = { BKTR_NORM_PAL, BKTR_NORM_NTSC, BKTR_NORM_SECAM, BKTR_NORM_DEFAULT}; int format; if (newformat >= array_elem(input_format)) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO, "Input format %d out of range (0-2)", newformat); return -1; } format = input_format[newformat]; if (ioctl(viddev->fd_device, BT848SFMT, &format) < 0) { MOTION_LOG(WRN, TYPE_VIDEO, SHOW_ERRNO ,_("BT848SFMT, Couldn't set the input format, try again with default")); format = BKTR_NORM_DEFAULT; newformat = 3; if (ioctl(viddev->fd_device, BT848SFMT, &format) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("BT848SFMT, Couldn't set the input format either default")); return -1; } } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "to %d", newformat); return newformat; } static int bktr_set_geometry(struct video_dev *viddev, int width, int height) { struct meteor_geomet geom; int h_max; geom.columns = width; geom.rows = height; geom.oformat = METEOR_GEO_YUV_422 | METEOR_GEO_YUV_12; /* FIXME: These seem to be problematic on whether they work the same on bktr...*/ /* FIXME: Best result in testing was only a BW picture with no color.*/ /* The following are supported pixel format types: METEOR_GEO_RGB16 16-bit RGB METEOR_GEO_RGB24 24-bit RGB in 32 bits METEOR_GEO_YUV_PACKED 16-bit 4:2:2 YUV METEOR_GEO_YUV_PLANAR 16-bit 4:2:2 YUV METEOR_GEO_YUV_UNSIGNED unsigned UV METEOR_GEO_YUV_422 METEOR_GEO_YUV_12 METEOR_GEO_YUV_9 */ viddev->pixfmt_src = geom.oformat; switch (viddev->norm) { case BKTR_PAL: h_max = BKTR_PAL_HEIGHT; break; case BKTR_NTSC: h_max = BKTR_NTSC_HEIGHT; break; case BKTR_SECAM: h_max = BKTR_SECAM_HEIGHT; break; default: h_max = BKTR_PAL_HEIGHT; } if (height <= h_max / 2) { geom.oformat |= METEOR_GEO_EVEN_ONLY; } geom.frames = 1; if (ioctl(viddev->fd_device, METEORSETGEO, &geom) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO,_("Couldn't set the geometry")); return -1; } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("to [%d/%d] Norm %d") ,width, height, viddev->norm); return 0; } static void bktr_picture_controls(struct context *cnt, struct video_dev *viddev) { int dev = viddev->fd_device; int indx; struct params_item_ctx *usritem; if (!cnt->vdev->update_params) { return; } vid_parms_parse(cnt); for (indx = 0;indx < cnt->vdev->params_count; indx++) { usritem=&cnt->vdev->params_array[indx]; if (mystreq(usritem->param_name,"contrast")) { bktr_set_contrast(dev,atoi(usritem->param_value)); } if (mystreq(usritem->param_name,"hue")) { bktr_set_hue(dev,atoi(usritem->param_value)); } if (mystreq(usritem->param_name,"brightness")) { bktr_set_brightness(dev,atoi(usritem->param_value)); } if (mystreq(usritem->param_name,"saturation")) { bktr_set_saturation(dev,atoi(usritem->param_value)); } } cnt->vdev->update_params = FALSE; } static unsigned char *bktr_device_init(struct video_dev *viddev, int width , int height, int input, int norm, long freq) { int dev_bktr = viddev->fd_device; struct sigaction act, old; //int dev_tunner = viddev->bktr_fdtuner; /* to ensure that all device will be support the capture mode _TODO_ : Autodected the best capture mode . */ int dummy = 1; // int pixelformat = BSD_VIDFMT_I420; void *map; /* If we have choose the tuner is needed to setup the frequency. */ if ((viddev->bktr_tuner != NULL) && (input == BKTR_IN_TV)) { if (!freq) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO ,_("Not valid Frequency [%ld] for Source input [%i]"), freq, input); return NULL; } else if (bktr_set_freq(viddev, freq) == -1) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("Frequency [%ld] Source input [%i]"), freq, input); return NULL; } } /* FIXME if we set as input tuner , we need to set option for tuner not for bktr */ if ((dummy = bktr_set_input_device(viddev, input)) == -1) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("set input [%d]"), input); return NULL; } viddev->input = dummy; if ((dummy = bktr_set_input_format(viddev, norm)) == -1) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("set input format [%d]"), norm); return NULL; } viddev->norm = dummy; if (bktr_set_geometry(viddev, width, height) == -1) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("set geometry [%d]x[%d]"), width, height); return NULL; } if (freq) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO ,_("Frequency set (no implemented yet")); } /* * Set capture mode and capture buffers * That is the buffer size for capture images , * so is dependent of color space of input format / FIXME */ /* FIXME: These seem to be problematic on whether they work the same on bktr...*/ /* FIXME: Spec says some of these should be 3/2 but testing indicates it is too small.*/ switch (viddev->pixfmt_src) { case METEOR_GEO_RGB16: /*FALLTHROUGH*/ case METEOR_GEO_RGB24: MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Sizing buffer to 3x")); viddev->bktr_bufsize = ((width * height * 3) * sizeof(unsigned char)); case METEOR_GEO_YUV_PACKED: /*FALLTHROUGH*/ case METEOR_GEO_YUV_PLANAR: /*FALLTHROUGH*/ case METEOR_GEO_YUV_422: MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Sizing buffer to 3/2x")); viddev->bktr_bufsize = (((width * height * 3 / 2)) * sizeof(unsigned char)); break; case METEOR_GEO_YUV_9: /*FALLTHROUGH*/ case METEOR_GEO_YUV_12: MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Sizing buffer to 3x")); viddev->bktr_bufsize = ((width * height * 3) * sizeof(unsigned char)); break; default: MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Sizing buffer to 3/2x")); viddev->bktr_bufsize = (((width * height * 3 / 2)) * sizeof(unsigned char)); } map = mmap((caddr_t)0, viddev->bktr_bufsize, PROT_READ|PROT_WRITE, MAP_SHARED, dev_bktr, (off_t)0); if (map == MAP_FAILED) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO,_("mmap failed")); return NULL; } /* FIXME double buffer */ if (0) { viddev->bktr_maxbuffer = 2; viddev->bktr_buffers[0] = map; viddev->bktr_buffers[1] = (unsigned char *)map + 0; /* 0 is not valid just a test */ //viddev->bktr_buffers[1] = map+vid_buf.offsets[1]; } else { viddev->bktr_buffers[0] = map; viddev->bktr_maxbuffer = 1; } viddev->bktr_curbuffer = 0; /* Clear the buffer */ if (ioctl(dev_bktr, BT848SCBUF, &dummy) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "BT848SCBUF"); return NULL; } /* Signal handler to know when data is ready to be read() */ memset(&act, 0, sizeof(act)); sigemptyset(&act.sa_mask); act.sa_handler = catchsignal; sigaction(SIGUSR2, &act, &old); dummy = SIGUSR2; //viddev->bktr_method = METEOR_CAP_CONTINOUS; //viddev->bktr_method = METEOR_CAP_SINGLE; if ((viddev->bktr_method == METEOR_CAP_CONTINOUS) && (ioctl(dev_bktr, METEORSSIGNAL, &dummy) < 0)) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "METEORSSIGNAL"); viddev->bktr_method = METEOR_CAP_SINGLE; if (ioctl(dev_bktr, METEORCAPTUR, &viddev->bktr_method) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("METEORCAPTUR using single method Error capturing")); MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("METEORCAPTUR using single method Error capturing")); } } else { if (ioctl(dev_bktr, METEORCAPTUR, &viddev->bktr_method) < 0) { viddev->bktr_method = METEOR_CAP_SINGLE; if (ioctl(dev_bktr, METEORCAPTUR, &viddev->bktr_method) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("METEORCAPTUR using single method Error capturing")); } } } if (viddev->bktr_method == METEOR_CAP_CONTINOUS) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "METEORCAPTUR METEOR_CAP_CONTINOUS"); } else { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "METEORCAPTUR METEOR_CAP_SINGLE"); } SLEEP(1, 0); MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "HUE [%d]", bktr_get_hue(dev_bktr, &dummy)); MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "SATURATION [%d]", bktr_get_saturation(dev_bktr, &dummy)); MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "BRIGHTNESS [%d]", bktr_get_brightness(dev_bktr, &dummy)); MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "CONTRAST [%d]", bktr_get_contrast(dev_bktr, &dummy)); return map; } /** * bktr_capture fetches a video frame from a v4l device * Parameters: * viddev Pointer to struct containing video device handle * map Pointer to the buffer in which the function puts the new image * width Width of image in pixels * height Height of image in pixels * * Returns * 0 Success * -1 Fatal error * 1 Non fatal error (not implemented) */ static int bktr_capture(struct video_dev *viddev, unsigned char *map, int width, int height) { int dev_bktr = viddev->fd_device; unsigned char *cap_map = NULL; unsigned char *common_buffer; int single = METEOR_CAP_SINGLE; sigset_t set, old; /* ONLY MMAP method is used to Capture */ /* * Allocates a new mmap buffer * Block signals during IOCTL */ sigemptyset (&set); sigaddset (&set, SIGCHLD); sigaddset (&set, SIGALRM); sigaddset (&set, SIGUSR1); sigaddset (&set, SIGTERM); sigaddset (&set, SIGHUP); pthread_sigmask(SIG_BLOCK, &set, &old); cap_map = viddev->bktr_buffers[viddev->bktr_curbuffer]; viddev->bktr_curbuffer++; if (viddev->bktr_curbuffer >= viddev->bktr_maxbuffer) { viddev->bktr_curbuffer = 0; } /* Capture */ if (viddev->bktr_method == METEOR_CAP_CONTINOUS) { if (bktr_frame_waiting) { bktr_frame_waiting = 0; } } else if (ioctl(dev_bktr, METEORCAPTUR, &single) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("Error capturing using single method")); sigprocmask(SIG_UNBLOCK, &old, NULL); return -1; } /* Undo the signal blocking */ pthread_sigmask(SIG_UNBLOCK, &old, NULL); /* METEOR_GEO_RGB16 16-bit RGB METEOR_GEO_RGB24 24-bit RGB in 32 bits METEOR_GEO_YUV_PACKED 16-bit 4:2:2 YUV METEOR_GEO_YUV_PLANAR 16-bit 4:2:2 YUV METEOR_GEO_YUV_422 METEOR_GEO_YUV_12 METEOR_GEO_YUV_9 */ /* FIXME: These seem to be problematic on whether they work the same on bktr...*/ switch (viddev->pixfmt_src) { case METEOR_GEO_RGB16: /*FALLTHROUGH*/ case METEOR_GEO_RGB24: vid_rgb24toyuv420p(map, cap_map, width, height); break; case METEOR_GEO_YUV_PACKED: /*FALLTHROUGH*/ case METEOR_GEO_YUV_422: vid_yuv422to420p(map, cap_map, width, height); break; case METEOR_GEO_YUV_PLANAR: vid_yuv422pto420p(map, cap_map, width, height); break; case METEOR_GEO_YUV_9: /*FALLTHROUGH*/ case METEOR_GEO_YUV_12: common_buffer = mymalloc(width * height * 3); vid_y10torgb24(common_buffer, cap_map, width, height, 2); vid_rgb24toyuv420p(map, common_buffer, width, height); free(common_buffer); break; default: memcpy(map, cap_map, ((width*height*3)/2)); } return 0; } static void bktr_set_input(struct context *cnt, struct video_dev *viddev, unsigned char *map , int width, int height, int input, int norm, int skip, long freq) { if (input != viddev->input || norm != viddev->norm || freq != viddev->frequency) { int dummy; long frequnits = freq; if ((dummy = bktr_set_input_device(viddev, input)) == -1) { return; } viddev->input = dummy; if ((dummy = bktr_set_input_format(viddev, norm)) == -1) { return; } viddev->norm = dummy; if ((viddev->bktr_tuner != NULL) && (viddev->input == BKTR_IN_TV) && (frequnits > 0)) { if (bktr_set_freq(viddev, freq) == -1) { return; } } bktr_picture_controls(cnt, viddev); viddev->frequency = freq; /* skip a few frames if needed */ for (dummy = 0; dummy < skip; dummy++) { bktr_capture(viddev, map, width, height); } } else { /* No round robin - we only adjust picture controls */ bktr_picture_controls(cnt, viddev); } } #endif /* HAVE_BKTR */ void bktr_mutex_init(void) { #ifdef HAVE_BKTR pthread_mutex_init(&bktr_mutex, NULL); #else return; #endif } void bktr_mutex_destroy(void) { #ifdef HAVE_BKTR pthread_mutex_destroy(&bktr_mutex); #else return; #endif } void bktr_cleanup(struct context *cnt) { #ifdef HAVE_BKTR struct video_dev *dev = viddevs; struct video_dev *prev = NULL; /* Cleanup the v4l part */ pthread_mutex_lock(&bktr_mutex); while (dev) { if (dev->fd_device == cnt->video_dev) { break; } prev = dev; dev = dev->next; } pthread_mutex_unlock(&bktr_mutex); /* Set it as closed in thread context. */ cnt->video_dev = -1; /* free the information we collected regarding the controls */ /* free the information we collected regarding the controls */ if (cnt->vdev != NULL) { util_parms_free(cnt->vdev); free(cnt->vdev); cnt->vdev = NULL; } if (dev == NULL) { MOTION_LOG(CRT, TYPE_VIDEO, NO_ERRNO,_("Unable to find video device")); return; } if (--dev->usage_count == 0) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("Closing video device %s"), dev->video_device); if (dev->bktr_fdtuner > 0) { close(dev->bktr_fdtuner); } if (dev->fd_device > 0) { if (dev->bktr_method == METEOR_CAP_CONTINOUS) { dev->bktr_fdtuner = METEOR_CAP_STOP_CONT; ioctl(dev->fd_device, METEORCAPTUR, &dev->bktr_fdtuner); } close(dev->fd_device); dev->bktr_fdtuner = -1; } munmap(viddevs->bktr_buffers[0], viddevs->bktr_bufsize); viddevs->bktr_buffers[0] = MAP_FAILED; dev->fd_device = -1; pthread_mutex_lock(&bktr_mutex); /* Remove from list */ if (prev == NULL) { viddevs = dev->next; } else { prev->next = dev->next; } pthread_mutex_unlock(&bktr_mutex); pthread_mutexattr_destroy(&dev->attr); pthread_mutex_destroy(&dev->mutex); free(dev); } else { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("Still %d users of video device %s, so we don't close it now") , dev->usage_count, dev->video_device); /* * There is still at least one thread using this device * If we own it, release it. */ if (dev->owner == cnt->threadnr) { dev->frames = 0; dev->owner = -1; pthread_mutex_unlock(&dev->mutex); } } #else (void)cnt; #endif } int bktr_start(struct context *cnt) { #ifdef HAVE_BKTR struct config *conf = &cnt->conf; struct video_dev *dev; int bktr_fdtuner = -1; int width, height, bktr_method; int fd_device = -1; MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "[%s]", conf->video_device); /* * We use width and height from conf in this function. They will be assigned * to width and height in imgs here, and capture_width_norm and capture_height_norm in * rotate_data won't be set until in rotate_init. * Motion requires that width and height are multiples of 8 so we check for this. */ if (conf->width % 8) { MOTION_LOG(CRT, TYPE_VIDEO, NO_ERRNO ,_("config image width (%d) is not modulo 8"), conf->width); return -2; } if (conf->height % 8) { MOTION_LOG(CRT, TYPE_VIDEO, NO_ERRNO ,_("config image height (%d) is not modulo 8"), conf->height); return -2; } width = conf->width; height = conf->height; bktr_method = METEOR_CAP_CONTINOUS; pthread_mutex_lock(&bktr_mutex); /* * Transfer width and height from conf to imgs. The imgs values are the ones * that is used internally in Motion. That way, setting width and height via * http remote control won't screw things up. */ cnt->imgs.width = width; cnt->imgs.height = height; cnt->vdev = mymalloc(sizeof(struct params_context)); memset(cnt->vdev, 0, sizeof(struct params_context)); cnt->vdev->params_array = NULL; cnt->vdev->params_count = 0; cnt->vdev->update_params = TRUE; /*Set trigger to update parameters */ vid_parms_parse(cnt); /* * First we walk through the already discovered video devices to see * if we have already setup the same device before. If this is the case * the device is a Round Robin device and we set the basic settings * and return the file descriptor. */ dev = viddevs; while (dev) { if (mystreq(conf->video_device, dev->video_device)) { int dummy = METEOR_CAP_STOP_CONT; dev->usage_count++; if (ioctl(dev->fd_device, METEORCAPTUR, &dummy) < 0) { MOTION_LOG(CRT, TYPE_VIDEO, SHOW_ERRNO,_("Stopping capture")); pthread_mutex_unlock(&bktr_mutex); return -1; } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("Reusing [%s] inputs [%d,%d] Change capture" " method METEOR_CAP_SINGLE") , dev->video_device, dev->input, cnt->param_input); dev->bktr_method = METEOR_CAP_SINGLE; MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("VIDEO_PALETTE_YUV420P setting" " imgs.size_norm and imgs.motionsize")); cnt->imgs.motionsize = width * height; cnt->imgs.size_norm = (width * height * 3) / 2; pthread_mutex_unlock(&bktr_mutex); return dev->fd_device; // FIXME return bktr_fdtuner ?! } dev = dev->next; } dev = mymalloc(sizeof(struct video_dev)); fd_device = open(conf->video_device, O_RDWR|O_CLOEXEC); if (fd_device < 0) { MOTION_LOG(CRT, TYPE_VIDEO, SHOW_ERRNO,_("open video device %s"), conf->video_device); free(dev); pthread_mutex_unlock(&bktr_mutex); return -1; } /* Only open tuner if conf->tuner_device has set , freq and input is 1. */ if ((conf->tuner_device != NULL) && (cnt->param_freq > 0) && (cnt->param_input == BKTR_IN_TV)) { bktr_fdtuner = open(conf->tuner_device, O_RDWR|O_CLOEXEC); if (bktr_fdtuner < 0) { MOTION_LOG(CRT, TYPE_VIDEO, SHOW_ERRNO,_("open tuner device %s"), conf->tuner_device); free(dev); pthread_mutex_unlock(&bktr_mutex); return -1; } } pthread_mutexattr_init(&dev->attr); pthread_mutex_init(&dev->mutex, &dev->attr); dev->usage_count = 1; dev->video_device = conf->video_device; dev->bktr_tuner = conf->tuner_device; dev->fd_device = fd_device; dev->bktr_fdtuner = bktr_fdtuner; dev->input = cnt->param_input; dev->height = height; dev->width = width; dev->frequency = cnt->param_freq; dev->owner = -1; dev->bktr_method = bktr_method; /* * We set brightness, contrast, saturation and hue = 0 so that they only get * set if the config is not zero. */ dev->owner = -1; /* Default palette */ dev->pixfmt_src = METEOR_GEO_YUV_422; dev->bktr_curbuffer = 0; dev->bktr_maxbuffer = 1; if (!bktr_device_init(dev, width, height, cnt->param_input, cnt->param_norm, cnt->param_freq)) { close(dev->fd_device); pthread_mutexattr_destroy(&dev->attr); pthread_mutex_destroy(&dev->mutex); free(dev); pthread_mutex_unlock(&bktr_mutex); return -1; } cnt->imgs.size_norm = (width * height * 3) / 2; cnt->imgs.motionsize = width * height; /* Insert into linked list */ dev->next = viddevs; viddevs = dev; pthread_mutex_unlock(&bktr_mutex); return fd_device; #else (void)cnt; return -1; #endif } int bktr_next(struct context *cnt, struct image_data *img_data) { #ifdef HAVE_BKTR struct config *conf = &cnt->conf; struct video_dev *dev; int width, height; int dev_bktr = cnt->video_dev; int ret = -1; /* NOTE: Since this is a capture, we need to use capture dimensions. */ width = cnt->rotate_data.capture_width_norm; height = cnt->rotate_data.capture_height_norm; pthread_mutex_lock(&bktr_mutex); dev = viddevs; while (dev) { if (dev->fd_device == dev_bktr) { break; } dev = dev->next; } pthread_mutex_unlock(&bktr_mutex); if (dev == NULL) { return -1; } if (dev->owner != cnt->threadnr) { pthread_mutex_lock(&dev->mutex); dev->owner = cnt->threadnr; dev->frames = conf->roundrobin_frames; } bktr_set_input(cnt, dev, img_data->image_norm, width, height, cnt->param_input, cnt->param_norm, conf->roundrobin_skip, cnt->param_freq); ret = bktr_capture(dev, img_data->image_norm, width, height); if (--dev->frames <= 0) { dev->owner = -1; dev->frames = 0; pthread_mutex_unlock(&dev->mutex); } /* Rotate the image as specified */ rotate_map(cnt, img_data); return ret; #else (void)cnt; (void)img_data; return -1; #endif } motion-release-4.6.0/src/video_bktr.h000066400000000000000000000022021452402535500175350ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * video_bktr.h * Headers associated with functions in the video_bktr.c module. * Copyright 2004 by Angel Carpintero (motiondevelop@gmail.com) */ #ifndef _INCLUDE_VIDEO_BKTR_H #define _INCLUDE_VIDEO_BKTR_H void bktr_mutex_init(void); void bktr_mutex_destroy(void); int bktr_start(struct context *cnt); int bktr_next(struct context *cnt, struct image_data *img_data); void bktr_cleanup(struct context *cnt); #endif /* _INCLUDE_VIDEO_FREEBSD_H */ motion-release-4.6.0/src/video_common.c000066400000000000000000000534021452402535500200660ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* video_common.c * * Video stream functions for motion. * Copyright 2000 by Jeroen Vreeken (pe1rxq@amsat.org) * 2006 by Krzysztof Blaszkowski (kb@sysmikro.com.pl) * 2007 by Angel Carpintero (motiondevelop@gmail.com) * */ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include "video_common.h" #include "netcam.h" #include "netcam_rtsp.h" #include "video_v4l2.h" #include "video_bktr.h" #include "jpegutils.h" typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; #define CLAMP(x) ((x) < 0 ? 0 : ((x) > 255) ? 255 : (x)) typedef struct { int is_abs; int len; int val; } code_table_t; /** * sonix_decompress_init * pre-calculates a locally stored table for efficient huffman-decoding. * * Each entry at index x in the table represents the codeword * present at the MSB of byte x. * */ static void vid_sonix_decompress_init(code_table_t * table) { int i; int is_abs, val, len; for (i = 0; i < 256; i++) { is_abs = 0; val = 0; len = 0; if ((i & 0x80) == 0) { /* code 0 */ val = 0; len = 1; } else if ((i & 0xE0) == 0x80) { /* code 100 */ val = +4; len = 3; } else if ((i & 0xE0) == 0xA0) { /* code 101 */ val = -4; len = 3; } else if ((i & 0xF0) == 0xD0) { /* code 1101 */ val = +11; len = 4; } else if ((i & 0xF0) == 0xF0) { /* code 1111 */ val = -11; len = 4; } else if ((i & 0xF8) == 0xC8) { /* code 11001 */ val = +20; len = 5; } else if ((i & 0xFC) == 0xC0) { /* code 110000 */ val = -20; len = 6; } else if ((i & 0xFC) == 0xC4) { /* code 110001xx: unknown */ val = 0; len = 8; } else if ((i & 0xF0) == 0xE0) { /* code 1110xxxx */ is_abs = 1; val = (i & 0x0F) << 4; len = 8; } table[i].is_abs = is_abs; table[i].val = val; table[i].len = len; } } /** * sonix_decompress * Decompresses an image encoded by a SN9C101 camera controller chip. * * IN width * height * inp pointer to compressed frame (with header already stripped) * OUT outp pointer to decompressed frame * * Returns 0 if the operation was successful. * Returns <0 if operation failed. * */ int vid_sonix_decompress(unsigned char *outp, unsigned char *inp, int width, int height) { int row, col; int val; int bitpos; unsigned char code; unsigned char *addr; /* Local storage */ static code_table_t table[256]; static int init_done = 0; if (!init_done) { init_done = 1; vid_sonix_decompress_init(table); /* Do sonix_decompress_init first! */ //return -1; // so it has been done and now fall through } bitpos = 0; for (row = 0; row < height; row++) { col = 0; /* First two pixels in first two rows are stored as raw 8-bit. */ if (row < 2) { addr = inp + (bitpos >> 3); code = (addr[0] << (bitpos & 7)) | (addr[1] >> (8 - (bitpos & 7))); bitpos += 8; *outp++ = code; addr = inp + (bitpos >> 3); code = (addr[0] << (bitpos & 7)) | (addr[1] >> (8 - (bitpos & 7))); bitpos += 8; *outp++ = code; col += 2; } while (col < width) { /* Get bitcode from bitstream. */ addr = inp + (bitpos >> 3); code = (addr[0] << (bitpos & 7)) | (addr[1] >> (8 - (bitpos & 7))); /* Update bit position. */ bitpos += table[code].len; /* Calculate pixel value. */ val = table[code].val; if (!table[code].is_abs) { /* Value is relative to top and left pixel. */ if (col < 2) { /* Left column: relative to top pixel. */ val += outp[-2 * width]; } else if (row < 2) { /* Top row: relative to left pixel. */ val += outp[-2]; } else { /* Main area: average of left pixel and top pixel. */ val += (outp[-2] + outp[-2 * width]) / 2; } } /* Store pixel */ *outp++ = CLAMP(val); col++; } } return 0; } /** * bayer2rgb24 * BAYER2RGB24 ROUTINE TAKEN FROM: * * Sonix SN9C10x based webcam basic I/F routines * Takafumi Mizuno * */ void vid_bayer2rgb24(unsigned char *dst, unsigned char *src, long int width, long int height) { long int i; unsigned char *rawpt, *scanpt; long int size; rawpt = src; scanpt = dst; size = width * height; for (i = 0; i < size; i++) { if (((i / width) & 1) == 0) { // %2 changed to & 1 if ((i & 1) == 0) { /* B */ if ((i > width) && ((i % width) > 0)) { *scanpt++ = *rawpt; /* B */ *scanpt++ = (*(rawpt - 1) + *(rawpt + 1) + *(rawpt + width) + *(rawpt - width)) / 4; /* G */ *scanpt++ = (*(rawpt - width - 1) + *(rawpt - width + 1) + *(rawpt + width - 1) + *(rawpt + width + 1)) / 4; /* R */ } else { /* First line or left column. */ *scanpt++ = *rawpt; /* B */ *scanpt++ = (*(rawpt + 1) + *(rawpt + width)) / 2; /* G */ *scanpt++ = *(rawpt + width + 1); /* R */ } } else { /* (B)G */ if ((i > width) && ((i % width) < (width - 1))) { *scanpt++ = (*(rawpt - 1) + *(rawpt + 1)) / 2; /* B */ *scanpt++ = *rawpt; /* G */ *scanpt++ = (*(rawpt + width) + *(rawpt - width)) / 2; /* R */ } else { /* First line or right column. */ *scanpt++ = *(rawpt - 1); /* B */ *scanpt++ = *rawpt; /* G */ *scanpt++ = *(rawpt + width); /* R */ } } } else { if ((i & 1) == 0) { /* G(R) */ if ((i < (width * (height - 1))) && ((i % width) > 0)) { *scanpt++ = (*(rawpt + width) + *(rawpt - width)) / 2; /* B */ *scanpt++ = *rawpt; /* G */ *scanpt++ = (*(rawpt - 1) + *(rawpt + 1)) / 2; /* R */ } else { /* Bottom line or left column. */ *scanpt++ = *(rawpt - width); /* B */ *scanpt++ = *rawpt; /* G */ *scanpt++ = *(rawpt + 1); /* R */ } } else { /* R */ if (i < (width * (height - 1)) && ((i % width) < (width - 1))) { *scanpt++ = (*(rawpt - width - 1) + *(rawpt - width + 1) + *(rawpt + width - 1) + *(rawpt + width + 1)) / 4; /* B */ *scanpt++ = (*(rawpt - 1) + *(rawpt + 1) + *(rawpt - width) + *(rawpt + width)) / 4; /* G */ *scanpt++ = *rawpt; /* R */ } else { /* Bottom line or right column. */ *scanpt++ = *(rawpt - width - 1); /* B */ *scanpt++ = (*(rawpt - 1) + *(rawpt - width)) / 2; /* G */ *scanpt++ = *rawpt; /* R */ } } } rawpt++; } } void vid_yuv422to420p(unsigned char *map, unsigned char *cap_map, int width, int height) { unsigned char *src, *dest, *src2, *dest2; int i, j; /* Create the Y plane. */ src = cap_map; dest = map; for (i = width * height; i > 0; i--) { *dest++ = *src; src += 2; } /* Create U and V planes. */ src = cap_map + 1; src2 = cap_map + width * 2 + 1; dest = map + width * height; dest2 = dest + (width * height) / 4; for (i = height / 2; i > 0; i--) { for (j = width / 2; j > 0; j--) { *dest = ((int) *src + (int) *src2) / 2; src += 2; src2 += 2; dest++; *dest2 = ((int) *src + (int) *src2) / 2; src += 2; src2 += 2; dest2++; } src += width * 2; src2 += width * 2; } } void vid_yuv422pto420p(unsigned char *map, unsigned char *cap_map, int width, int height) { unsigned char *src, *dest, *dest2; unsigned char *src_u, *src_u2, *src_v, *src_v2; int i, j; /*Planar version of 422 */ /* Create the Y plane. */ src = cap_map; dest = map; for (i = width * height; i > 0; i--) { *dest++ = *src++; } /* Create U and V planes. */ dest = map + width * height; dest2 = dest + (width * height) / 4; for (i = 0; i< (height / 2); i++) { src_u = cap_map + (width * height) + ((i*2) * (width/2)); src_u2 = src_u + (width/2); src_v = src_u + (width/2 * height); src_v2 = src_v + (width/2); for (j = 0; j < (width / 2); j++) { *dest = ((int) *src_u + (int) *src_u2) / 2; src_u ++; src_u2++; dest++; *dest2 = ((int) *src_v + (int) *src_v2) / 2; src_v ++; src_v2++; dest2++; } } } void vid_uyvyto420p(unsigned char *map, unsigned char *cap_map, int width, int height) { uint8_t *pY = map; uint8_t *pU = pY + (width * height); uint8_t *pV = pU + (width * height) / 4; uint32_t uv_offset = width * 2 * sizeof(uint8_t); int ix, jx; for (ix = 0; ix < height; ix++) { for (jx = 0; jx < width; jx += 2) { uint16_t calc; if ((ix&1) == 0) { calc = *cap_map; calc += *(cap_map + uv_offset); calc /= 2; *pU++ = (uint8_t) calc; } cap_map++; *pY++ = *cap_map++; if ((ix&1) == 0) { calc = *cap_map; calc += *(cap_map + uv_offset); calc /= 2; *pV++ = (uint8_t) calc; } cap_map++; *pY++ = *cap_map++; } } } void vid_rgb24toyuv420p(unsigned char *map, unsigned char *cap_map, int width, int height) { unsigned char *y, *u, *v; unsigned char *r, *g, *b; int i, loop; r = cap_map; g = r + 1; b = g + 1; y = map; u = y + width * height; v = u + (width * height) / 4; memset(u, 0, width * height / 4); memset(v, 0, width * height / 4); for (loop = 0; loop < height; loop++) { for (i = 0; i < width; i += 2) { *y++ = (9796 ** r + 19235 ** g + 3736 ** b) >> 15; *u += ((-4784 ** r - 9437 ** g + 14221 ** b) >> 17) + 32; *v += ((20218 ** r - 16941 ** g - 3277 ** b) >> 17) + 32; r += 3; g += 3; b += 3; *y++ = (9796 ** r + 19235 ** g + 3736 ** b) >> 15; *u += ((-4784 ** r - 9437 ** g + 14221 ** b) >> 17) + 32; *v += ((20218 ** r - 16941 ** g - 3277 ** b) >> 17) + 32; r += 3; g += 3; b += 3; u++; v++; } if ((loop & 1) == 0) { u -= width / 2; v -= width / 2; } } } /** * mjpegtoyuv420p * * Return values * -1 on fatal error * 0 on success * 2 if jpeg lib threw a "corrupt jpeg data" warning. * in this case, "a damaged output image is likely." */ int vid_mjpegtoyuv420p(unsigned char *map, unsigned char *cap_map, int width, int height, unsigned int size) { unsigned char *ptr_buffer; size_t soi_pos = 0; int ret = 0; ptr_buffer = memmem(cap_map, size, "\xff\xd8", 2); if (ptr_buffer == NULL) { MOTION_LOG(CRT, TYPE_VIDEO, NO_ERRNO,_("Corrupt image ... continue")); return 1; } /** Some cameras are sending multiple SOIs in the buffer. Move the pointer to the last SOI in the buffer and proceed. */ while (ptr_buffer != NULL && ((size - soi_pos - 1) > 2)) { soi_pos = ptr_buffer - cap_map; ptr_buffer = memmem(cap_map + soi_pos + 1, size - soi_pos - 1, "\xff\xd8", 2); } if (soi_pos != 0) { MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO,_("SOI position adjusted by %d bytes."), soi_pos); } memmove(cap_map, cap_map + soi_pos, size - soi_pos); size -= soi_pos; ret = jpgutl_decode_jpeg(cap_map,size, width, height, map); if (ret == -1) { MOTION_LOG(CRT, TYPE_VIDEO, NO_ERRNO,_("Corrupt image ... continue")); ret = 1; } return ret; } void vid_y10torgb24(unsigned char *map, unsigned char *cap_map, int width, int height, int shift) { /* Source code: raw2rgbpnm project */ /* url: http://salottisipuli.retiisi.org.uk/cgi-bin/gitweb.cgi?p=~sailus/raw2rgbpnm.git;a=summary */ /* bpp - bits per pixel */ /* bpp: 'Pixels are stored in 16-bit words with unused high bits padded with 0' */ /* url: https://linuxtv.org/downloads/v4l-dvb-apis/V4L2-PIX-FMT-Y12.html */ /* url: https://linuxtv.org/downloads/v4l-dvb-apis/V4L2-PIX-FMT-Y10.html */ int src_size[2] = {width,height}; int bpp = 16; unsigned int src_stride = (src_size[0] * bpp) / 8; unsigned int rgb_stride = src_size[0] * 3; int a = 0; int src_x = 0, src_y = 0; int dst_x = 0, dst_y = 0; for (src_y = 0, dst_y = 0; dst_y < src_size[1]; src_y++, dst_y++) { for (src_x = 0, dst_x = 0; dst_x < src_size[0]; src_x++, dst_x++) { a = (cap_map[src_y*src_stride + src_x*2+0] | (cap_map[src_y*src_stride + src_x*2+1] << 8)) >> shift; map[dst_y*rgb_stride+3*dst_x+0] = a; map[dst_y*rgb_stride+3*dst_x+1] = a; map[dst_y*rgb_stride+3*dst_x+2] = a; } } } void vid_greytoyuv420p(unsigned char *map, unsigned char *cap_map, int width, int height) { memcpy(map, cap_map, (width*height)); memset(map+(width*height), 128, (width * height) / 2); } /* vid_parms_parse * Parse the video_params into an array. */ void vid_parms_parse(struct context *cnt) { int indx; if (cnt->vdev->update_params == FALSE) { return; } /* Put in the user specified parameters */ util_parms_parse(cnt->vdev, cnt->conf.video_params, TRUE); /* Now add any missing default items */ util_parms_add_default(cnt->vdev,"palette","17"); util_parms_add_default(cnt->vdev,"input","-1"); util_parms_add_default(cnt->vdev,"norm","0"); util_parms_add_default(cnt->vdev,"frequency","0"); for (indx = 0; indx < cnt->vdev->params_count; indx++) { if (mystreq(cnt->vdev->params_array[indx].param_name, "input")) { cnt->param_input = atoi(cnt->vdev->params_array[indx].param_value); } if (mystreq(cnt->vdev->params_array[indx].param_name, "norm")) { cnt->param_norm = atoi(cnt->vdev->params_array[indx].param_value); } if (mystreq(cnt->vdev->params_array[indx].param_name, "frequency")) { cnt->param_freq = atol(cnt->vdev->params_array[indx].param_value); } } cnt->vdev->update_params = FALSE; return; } void vid_mutex_init(void) { v4l2_mutex_init(); bktr_mutex_init(); } void vid_mutex_destroy(void) { v4l2_mutex_destroy(); bktr_mutex_destroy(); } void vid_close(struct context *cnt) { #ifdef HAVE_MMAL if (cnt->mmalcam) { MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO,_("calling mmalcam_cleanup")); mmalcam_cleanup(cnt->mmalcam); cnt->mmalcam = NULL; return; } #endif if (cnt->netcam) { MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO,_("calling netcam_cleanup")); netcam_cleanup(cnt->netcam, 0); cnt->netcam = NULL; return; } if (cnt->rtsp) { /* This also cleans up high resolution */ MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO,_("calling netcam_rtsp_cleanup")); netcam_rtsp_cleanup(cnt, 0); return; } if (cnt->camera_type == CAMERA_TYPE_V4L2) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Cleaning up V4L2 device")); v4l2_cleanup(cnt); return; } if (cnt->camera_type == CAMERA_TYPE_BKTR) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Cleaning up BKTR device")); bktr_cleanup(cnt); return; } MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO,_("No Camera device cleanup (MMAL, Netcam, V4L2, BKTR)")); return; } /** * vid_start * * vid_start setup the capture device. This will be either a V4L device or a netcam. * The function does the following: * - If the camera is a netcam - netcam_start is called and function returns * - Width and height are checked for valid value (multiple of 8) * - Copy the config height and width to the imgs struct. Note that height and width are * only copied to the from the conf struct to the imgs struct during program startup * The width and height can no later be changed via http remote control as this would * require major re-memory allocations of all image buffers. * * - if the camera is V4L2 v4l2_start is called * * Parameters: * cnt Pointer to the context for this thread * * Returns * device number * -1 if failed to open device. * -3 image dimensions are not modulo 8 */ int vid_start(struct context *cnt) { int dev = -1; #ifdef HAVE_MMAL if (cnt->camera_type == CAMERA_TYPE_MMAL) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Opening MMAL cam")); dev = mmalcam_start(cnt); if (dev < 0) { mmalcam_cleanup(cnt->mmalcam); cnt->mmalcam = NULL; MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO,_("MMAL cam failed to open")); } return dev; } #endif if (cnt->camera_type == CAMERA_TYPE_NETCAM) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Opening Netcam")); dev = netcam_start(cnt); if (dev < 0) { netcam_cleanup(cnt->netcam, 1); cnt->netcam = NULL; MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO,_("Netcam failed to open")); } return dev; } if (cnt->camera_type == CAMERA_TYPE_RTSP) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Opening Netcam RTSP")); dev = netcam_rtsp_setup(cnt); if (dev < 0) { netcam_rtsp_cleanup(cnt, 1); MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO,_("Netcam RTSP failed to open")); } return dev; } if (cnt->camera_type == CAMERA_TYPE_V4L2) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Opening V4L2 device")); dev = v4l2_start(cnt); if (dev < 0) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO,_("V4L2 device failed to open")); } return dev; } if (cnt->camera_type == CAMERA_TYPE_BKTR) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Opening BKTR device")); dev = bktr_start(cnt); if (dev < 0) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO,_("BKTR device failed to open")); } return dev; } MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("No Camera device specified (MMAL, Netcam, V4L2, BKTR)")); return dev; } /** * vid_next * * vid_next fetches a video frame from a either v4l device or netcam * * Parameters: * cnt Pointer to the context for this thread * map Pointer to the buffer in which the function puts the new image * * Global variable * viddevs The viddevs struct is "global" within the context of video.c * and used in functions vid_*. * Returns * 0 Success * -1 Fatal V4L error * -2 Fatal Netcam error * Positive numbers... * with bit 0 set Non fatal V4L error (copy grey image and discard this image) * with bit 1 set Non fatal Netcam error */ int vid_next(struct context *cnt, struct image_data *img_data) { #ifdef HAVE_MMAL if (cnt->camera_type == CAMERA_TYPE_MMAL) { if (cnt->mmalcam == NULL) { return NETCAM_GENERAL_ERROR; } return mmalcam_next(cnt, img_data); } #endif if (cnt->camera_type == CAMERA_TYPE_NETCAM) { if (cnt->video_dev == -1) { return NETCAM_GENERAL_ERROR; } return netcam_next(cnt, img_data); } if (cnt->camera_type == CAMERA_TYPE_RTSP) { if (cnt->video_dev == -1) { return NETCAM_GENERAL_ERROR; } return netcam_rtsp_next(cnt, img_data); } if (cnt->camera_type == CAMERA_TYPE_V4L2) { return v4l2_next(cnt, img_data); } if (cnt->camera_type == CAMERA_TYPE_BKTR) { return bktr_next(cnt, img_data); } return -2; } motion-release-4.6.0/src/video_common.h000066400000000000000000000102271452402535500200710ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * video_common.h * Headers associated with functions in the video_common.c module. */ #ifndef _INCLUDE_VIDEO_COMMON_H #define _INCLUDE_VIDEO_COMMON_H struct vid_devctrl_ctx { char *ctrl_name; /* The name as provided by the device */ char *ctrl_iddesc; /* A motion description of the ID number for the control*/ int ctrl_minimum; /* The minimum value permitted as reported by device*/ int ctrl_maximum; /* The maximum value permitted as reported by device*/ int ctrl_default; /* The default value for the control*/ int ctrl_currval; /* The current value the control was set to */ int ctrl_newval; /* The new value to set for the control */ unsigned int ctrl_id; /* The ID number for the control as provided by the device*/ unsigned int ctrl_type; /* The type of control as reported by the device*/ int ctrl_menuitem; /* bool for whether item is a menu item description */ }; struct video_dev { struct video_dev *next; int usage_count; int fd_device; const char *video_device; int input; int norm; int width; int height; long frequency; int fps; int owner; int frames; int pixfmt_src; int buffer_count; pthread_mutex_t mutex; pthread_mutexattr_t attr; void *v4l2_private; struct vid_devctrl_ctx *devctrl_array; /*Array of all the controls in the device*/ int devctrl_count; /*Count of the controls in the device*/ int starting; /*Bool for whether the device is just starting*/ int device_type; /*Camera, tuner, etc as provided by driver enum*/ int device_tuner; /*Tuner number if applicable from driver*/ /* BKTR Specific Items */ int bktr_method; int bktr_bufsize; const char *bktr_tuner; int bktr_fdtuner; unsigned char *bktr_buffers[2]; int bktr_curbuffer; int bktr_maxbuffer; }; int vid_start(struct context *cnt); int vid_next(struct context *cnt, struct image_data *img_data); void vid_close(struct context *cnt); void vid_mutex_destroy(void); void vid_mutex_init(void); void vid_parms_parse(struct context *cnt); void vid_yuv422to420p(unsigned char *map, unsigned char *cap_map, int width, int height); void vid_yuv422pto420p(unsigned char *map, unsigned char *cap_map, int width, int height); void vid_uyvyto420p(unsigned char *map, unsigned char *cap_map, int width, int height); void vid_rgb24toyuv420p(unsigned char *map, unsigned char *cap_map, int width, int height); void vid_bayer2rgb24(unsigned char *dst, unsigned char *src, long int width, long int height); void vid_y10torgb24(unsigned char *map, unsigned char *cap_map, int width, int height, int shift); void vid_greytoyuv420p(unsigned char *map, unsigned char *cap_map, int width, int height); int vid_sonix_decompress(unsigned char *outp, unsigned char *inp, int width, int height); int vid_mjpegtoyuv420p(unsigned char *map, unsigned char *cap_map, int width, int height, unsigned int size); #endif motion-release-4.6.0/src/video_loopback.c000066400000000000000000000207461452402535500203750ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * video_loopback.c * * Video loopback functions for motion. * Copyright 2000 by Jeroen Vreeken (pe1rxq@amsat.org) * Copyright 2008 by Angel Carpintero (motiondevelop@gmail.com) * */ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #if (defined(HAVE_V4L2)) && (!defined(BSD)) #include "video_loopback.h" #include #include #include static int vlp_open_vidpipe(void) { int pipe_fd = -1; char pipepath[255]; char buffer[255]; DIR *dir; struct dirent *dirp; const char prefix[] = "/sys/class/video4linux/"; int fd,tfd; int len,min; int retcd; if ((dir = opendir(prefix)) == NULL) { MOTION_LOG(CRT, TYPE_VIDEO, SHOW_ERRNO,_("Failed to open '%s'"), prefix); return -1; } while ((dirp = readdir(dir)) != NULL) { if (!strncmp(dirp->d_name, "video", 5)) { retcd = snprintf(buffer, sizeof(buffer),"%s%s/name", prefix, dirp->d_name); if ((retcd<0) || (retcd >= (int)sizeof(buffer))) { MOTION_LOG(NTC, TYPE_VIDEO, SHOW_ERRNO ,_("Error specifying buffer: %s"),buffer); continue; } else { MOTION_LOG(NTC, TYPE_VIDEO, SHOW_ERRNO,_("Opening buffer: %s"),buffer); } if ((fd = open(buffer, O_RDONLY|O_CLOEXEC)) >= 0) { if ((len = read(fd, buffer, sizeof(buffer)-1)) < 0) { close(fd); continue; } buffer[len]=0; MOTION_LOG(NTC, TYPE_VIDEO, SHOW_ERRNO,_("Read buffer: %s"),buffer); if (strncmp(buffer, "Loopback video device",21)) { /* weird stuff after minor */ close(fd); continue; } min = atoi(&buffer[21]); retcd = snprintf(buffer,sizeof(buffer),"/dev/%s",dirp->d_name); if ((retcd < 0) || (retcd >= (int)sizeof(buffer))) { MOTION_LOG(NTC, TYPE_VIDEO, SHOW_ERRNO ,_("Error specifying buffer: %s"),buffer); close(fd); continue; } else { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("found video device '%s' %d"), buffer,min); } if ((tfd = open(buffer, O_RDWR|O_CLOEXEC)) >= 0) { strncpy(pipepath, buffer, sizeof(pipepath)); if (pipe_fd >= 0) { close(pipe_fd); } pipe_fd = tfd; break; } } close(fd); } } closedir(dir); if (pipe_fd >= 0) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Opened %s as pipe output"), pipepath); } return pipe_fd; } typedef struct capent {const char *cap; int code;} capentT; capentT cap_list[] ={ {"V4L2_CAP_VIDEO_CAPTURE" ,0x00000001 }, {"V4L2_CAP_VIDEO_CAPTURE_MPLANE" ,0x00001000 }, {"V4L2_CAP_VIDEO_OUTPUT" ,0x00000002 }, {"V4L2_CAP_VIDEO_OUTPUT_MPLANE" ,0x00002000 }, {"V4L2_CAP_VIDEO_M2M" ,0x00004000 }, {"V4L2_CAP_VIDEO_M2M_MPLANE" ,0x00008000 }, {"V4L2_CAP_VIDEO_OVERLAY" ,0x00000004 }, {"V4L2_CAP_VBI_CAPTURE" ,0x00000010 }, {"V4L2_CAP_VBI_OUTPUT" ,0x00000020 }, {"V4L2_CAP_SLICED_VBI_CAPTURE" ,0x00000040 }, {"V4L2_CAP_SLICED_VBI_OUTPUT" ,0x00000080 }, {"V4L2_CAP_RDS_CAPTURE" ,0x00000100 }, {"V4L2_CAP_VIDEO_OUTPUT_OVERLAY" ,0x00000200 }, {"V4L2_CAP_HW_FREQ_SEEK" ,0x00000400 }, {"V4L2_CAP_RDS_OUTPUT" ,0x00000800 }, {"V4L2_CAP_TUNER" ,0x00010000 }, {"V4L2_CAP_AUDIO" ,0x00020000 }, {"V4L2_CAP_RADIO" ,0x00040000 }, {"V4L2_CAP_MODULATOR" ,0x00080000 }, {"V4L2_CAP_SDR_CAPTURE" ,0x00100000 }, {"V4L2_CAP_EXT_PIX_FORMAT" ,0x00200000 }, {"V4L2_CAP_SDR_OUTPUT" ,0x00400000 }, {"V4L2_CAP_READWRITE" ,0x01000000 }, {"V4L2_CAP_ASYNCIO" ,0x02000000 }, {"V4L2_CAP_STREAMING" ,0x04000000 }, {"V4L2_CAP_DEVICE_CAPS" ,0x80000000 }, {"Last",0} }; static void vlp_show_vcap(struct v4l2_capability *cap) { unsigned int vers = cap->version; unsigned int c = cap->capabilities; int i; MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "Pipe Device"); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "cap.driver: %s",cap->driver); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "cap.card: %s",cap->card); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "cap.bus_info: %s",cap->bus_info); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "cap.card: %u.%u.%u",(vers >> 16) & 0xFF,(vers >> 8) & 0xFF,vers & 0xFF); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "Device capabilities"); for (i=0;cap_list[i].code;i++) { if (c & cap_list[i].code) { MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "%s",cap_list[i].cap); } } MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "------------------------"); } static void vlp_show_vfmt(struct v4l2_format *v) { MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "type: type: %d",v->type); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "fmt.pix.width: %d",v->fmt.pix.width); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "fmt.pix.height: %d",v->fmt.pix.height); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "fmt.pix.pixelformat: %d",v->fmt.pix.pixelformat); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "fmt.pix.sizeimage: %d",v->fmt.pix.sizeimage); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "fmt.pix.field: %d",v->fmt.pix.field); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "fmt.pix.bytesperline: %d",v->fmt.pix.bytesperline); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "fmt.pix.colorspace: %d",v->fmt.pix.colorspace); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "------------------------"); } int vlp_startpipe(const char *dev_name, int width, int height) { int dev; struct v4l2_format v; struct v4l2_capability vc; if (mystreq(dev_name, "-")) { dev = vlp_open_vidpipe(); } else { dev = open(dev_name, O_RDWR|O_CLOEXEC); MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Opened %s as pipe output"), dev_name); } if (dev < 0) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO,_("Opening %s as pipe output failed"), dev_name); return -1; } if (ioctl(dev, VIDIOC_QUERYCAP, &vc) == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "ioctl (VIDIOC_QUERYCAP)"); return -1; } vlp_show_vcap(&vc); memset(&v, 0, sizeof(v)); v.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; if (ioctl(dev, VIDIOC_G_FMT, &v) == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "ioctl (VIDIOC_G_FMT)"); return -1; } MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO,_("Original pipe specifications")); vlp_show_vfmt(&v); v.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; v.fmt.pix.width = width; v.fmt.pix.height = height; v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420; v.fmt.pix.sizeimage = 3 * width * height / 2; v.fmt.pix.bytesperline = width; v.fmt.pix.field = V4L2_FIELD_NONE; v.fmt.pix.colorspace = V4L2_COLORSPACE_SRGB; MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO,_("Proposed pipe specifications")); vlp_show_vfmt(&v); if (ioctl(dev,VIDIOC_S_FMT, &v) == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "ioctl (VIDIOC_S_FMT)"); return -1; } MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO,_("Final pipe specifications")); vlp_show_vfmt(&v); return dev; } int vlp_putpipe(int dev, unsigned char *image, int imgsize) { return write(dev, image, imgsize); } #endif /* HAVE_V4L2 && !BSD */ motion-release-4.6.0/src/video_loopback.h000066400000000000000000000021371452402535500203740ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * video_loopback.h * Headers associated with functions in the video_loopback.c module. * Copyright 2000 by Jeroen Vreeken (pe1rxq@amsat.org) * Copyright 2008 by Angel Carpintero (motiondevelop@gmail.com) */ #ifndef _INCLUDE_VIDEO_LOOPBACK_H #define _INCLUDE_VIDEO_LOOPBACK_H int vlp_startpipe(const char *dev_name, int width, int height); int vlp_putpipe(int dev, unsigned char *image, int imgsize); #endif motion-release-4.6.0/src/video_v4l2.c000066400000000000000000002017441452402535500173710ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * video_v4l2.c * * V4L2 interface with basically JPEG decompression support and even more ... * Copyright 2006 Krzysztof Blaszkowski (kb@sysmikro.com.pl) * 2007 Angel Carpintero (motiondevelop@gmail.com) * Refactor/rewrite code: 2018 MrDave * */ #include "motion.h" #include "translate.h" #include "util.h" #include "logger.h" #include "rotate.h" #include "video_common.h" #include "video_v4l2.h" #include #ifdef HAVE_V4L2 #if defined(HAVE_LINUX_VIDEODEV2_H) #include #else #include #endif #define u8 unsigned char #define u16 unsigned short #define u32 unsigned int #define s32 signed int #define MMAP_BUFFERS 4 #define MIN_MMAP_BUFFERS 2 #define V4L2_PALETTE_COUNT_MAX 20 #define MAX2(x, y) ((x) > (y) ? (x) : (y)) #define MIN2(x, y) ((x) < (y) ? (x) : (y)) static pthread_mutex_t v4l2_mutex; static struct video_dev *video_devices = NULL; typedef struct video_image_buff { unsigned char *ptr; int content_length; size_t size; /* total allocated size */ size_t used; /* bytes already used */ struct timeval image_time; /* time this image was received */ } video_buff; typedef struct { int fd_device; u32 fps; struct v4l2_capability cap; struct v4l2_format src_fmt; struct v4l2_format dst_fmt; struct v4l2_requestbuffers req; struct v4l2_buffer buf; video_buff *buffers; s32 pframe; u32 ctrl_flags; volatile unsigned int *finish; /* End the thread */ } src_v4l2_t; typedef struct palette_item_struct{ u32 v4l2id; char fourcc[5]; } palette_item; static void v4l2_palette_init(palette_item *palette_array) { int indx; /* When adding here, update the max defined as V4L2_PALETTE_COUNT_MAX above */ palette_array[0].v4l2id = V4L2_PIX_FMT_SN9C10X; palette_array[1].v4l2id = V4L2_PIX_FMT_SBGGR16; palette_array[2].v4l2id = V4L2_PIX_FMT_SBGGR8; palette_array[3].v4l2id = V4L2_PIX_FMT_SPCA561; palette_array[4].v4l2id = V4L2_PIX_FMT_SGBRG8; palette_array[5].v4l2id = V4L2_PIX_FMT_SGRBG8; palette_array[6].v4l2id = V4L2_PIX_FMT_PAC207; palette_array[7].v4l2id = V4L2_PIX_FMT_PJPG; palette_array[8].v4l2id = V4L2_PIX_FMT_MJPEG; palette_array[9].v4l2id = V4L2_PIX_FMT_JPEG; palette_array[10].v4l2id = V4L2_PIX_FMT_RGB24; palette_array[11].v4l2id = V4L2_PIX_FMT_SPCA501; palette_array[12].v4l2id = V4L2_PIX_FMT_SPCA505; palette_array[13].v4l2id = V4L2_PIX_FMT_SPCA508; palette_array[14].v4l2id = V4L2_PIX_FMT_UYVY; palette_array[15].v4l2id = V4L2_PIX_FMT_YUYV; palette_array[16].v4l2id = V4L2_PIX_FMT_YUV422P; palette_array[17].v4l2id = V4L2_PIX_FMT_YUV420; /* most efficient for motion */ palette_array[18].v4l2id = V4L2_PIX_FMT_Y10; palette_array[19].v4l2id = V4L2_PIX_FMT_Y12; palette_array[20].v4l2id = V4L2_PIX_FMT_GREY; for (indx=0; indx <=V4L2_PALETTE_COUNT_MAX; indx++ ) { sprintf(palette_array[indx].fourcc ,"%c%c%c%c" ,palette_array[indx].v4l2id >> 0 ,palette_array[indx].v4l2id >> 8 ,palette_array[indx].v4l2id >> 16 ,palette_array[indx].v4l2id >> 24); } } static int xioctl(src_v4l2_t *vid_source, unsigned long request, void *arg) { int ret; do ret = ioctl(vid_source->fd_device, request, arg); while (-1 == ret && EINTR == errno && !vid_source->finish); return ret; } static void v4l2_vdev_free(struct context *cnt) { /* free the information we collected regarding the controls */ if (cnt->vdev != NULL) { util_parms_free(cnt->vdev); free(cnt->vdev); cnt->vdev = NULL; } } static void v4l2_vdev_init(struct context *cnt) { /* Create the v4l2 context within the main thread context */ cnt->vdev = mymalloc(sizeof(struct params_context)); memset(cnt->vdev, 0, sizeof(struct params_context)); cnt->vdev->params_array = NULL; cnt->vdev->params_count = 0; cnt->vdev->update_params = TRUE; /*Set trigger that we have updated user parameters */ return; } static int v4l2_ctrls_count(struct video_dev *curdev) { /* Get the count of how many controls and menu items the device supports */ src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; struct v4l2_queryctrl vid_ctrl; struct v4l2_querymenu vid_menu; int indx; curdev->devctrl_count = 0; memset(&vid_ctrl, 0, sizeof(struct v4l2_queryctrl)); vid_ctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL; while (xioctl (vid_source, VIDIOC_QUERYCTRL, &vid_ctrl) == 0) { if (vid_ctrl.type == V4L2_CTRL_TYPE_CTRL_CLASS) { vid_ctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL; continue; } curdev->devctrl_count++; if (vid_ctrl.type == V4L2_CTRL_TYPE_MENU) { for (indx = vid_ctrl.minimum; indx<=vid_ctrl.maximum; indx++) { memset(&vid_menu, 0, sizeof(struct v4l2_querymenu)); vid_menu.id = vid_ctrl.id; vid_menu.index = indx; if (xioctl(vid_source, VIDIOC_QUERYMENU, &vid_menu) == 0) { curdev->devctrl_count++; } } } vid_ctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL; } return 0; } static int v4l2_ctrls_list(struct video_dev *curdev) { /* Get the names of the controls and menu items the device supports */ src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; struct v4l2_queryctrl vid_ctrl; struct v4l2_querymenu vid_menu; struct v4l2_control vid_curr; int indx, indx_ctrl; curdev->devctrl_array = NULL; if (curdev->devctrl_count == 0 ) { MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, _("No Controls found for device")); return 0; } curdev->devctrl_array = malloc(curdev->devctrl_count * sizeof(struct vid_devctrl_ctx)); memset(&vid_ctrl, 0, sizeof(struct v4l2_queryctrl)); vid_ctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL; indx_ctrl = 0; while (xioctl (vid_source, VIDIOC_QUERYCTRL, &vid_ctrl) == 0) { if (vid_ctrl.type == V4L2_CTRL_TYPE_CTRL_CLASS) { vid_ctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL; continue; } curdev->devctrl_array[indx_ctrl].ctrl_id = vid_ctrl.id; curdev->devctrl_array[indx_ctrl].ctrl_type = vid_ctrl.type; curdev->devctrl_array[indx_ctrl].ctrl_default = vid_ctrl.default_value; curdev->devctrl_array[indx_ctrl].ctrl_currval = vid_ctrl.default_value; curdev->devctrl_array[indx_ctrl].ctrl_newval = vid_ctrl.default_value; curdev->devctrl_array[indx_ctrl].ctrl_menuitem = FALSE; curdev->devctrl_array[indx_ctrl].ctrl_name = malloc(32); sprintf(curdev->devctrl_array[indx_ctrl].ctrl_name,"%s",vid_ctrl.name); curdev->devctrl_array[indx_ctrl].ctrl_iddesc = malloc(15); sprintf(curdev->devctrl_array[indx_ctrl].ctrl_iddesc,"ID%08d",vid_ctrl.id); curdev->devctrl_array[indx_ctrl].ctrl_minimum = vid_ctrl.minimum; curdev->devctrl_array[indx_ctrl].ctrl_maximum = vid_ctrl.maximum; memset(&vid_curr, 0, sizeof (struct v4l2_control)); vid_curr.id = vid_ctrl.id; if (xioctl(vid_source, VIDIOC_G_CTRL, &vid_curr) == 0) { curdev->devctrl_array[indx_ctrl].ctrl_currval = vid_curr.value; curdev->devctrl_array[indx_ctrl].ctrl_newval = vid_curr.value; } if (vid_ctrl.type == V4L2_CTRL_TYPE_MENU) { for (indx = vid_ctrl.minimum; indx<=vid_ctrl.maximum; indx++) { memset(&vid_menu, 0, sizeof(struct v4l2_querymenu)); vid_menu.id = vid_ctrl.id; vid_menu.index = indx; if (xioctl(vid_source, VIDIOC_QUERYMENU, &vid_menu) == 0) { indx_ctrl++; curdev->devctrl_array[indx_ctrl].ctrl_id = vid_ctrl.id; curdev->devctrl_array[indx_ctrl].ctrl_type = 0; curdev->devctrl_array[indx_ctrl].ctrl_menuitem = TRUE; curdev->devctrl_array[indx_ctrl].ctrl_name = malloc(32); sprintf(curdev->devctrl_array[indx_ctrl].ctrl_name,"%s",vid_menu.name); curdev->devctrl_array[indx_ctrl].ctrl_iddesc = malloc(40); sprintf(curdev->devctrl_array[indx_ctrl].ctrl_iddesc,"menu item: Value %d",indx); curdev->devctrl_array[indx_ctrl].ctrl_minimum = 0; curdev->devctrl_array[indx_ctrl].ctrl_maximum = 0; } } } indx_ctrl++; vid_ctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL; } if (curdev->devctrl_count != 0 ) { MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, _("---------Controls---------")); MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, _(" V4L2 ID Name and Range")); for (indx=0; indx < curdev->devctrl_count; indx++) { if (curdev->devctrl_array[indx].ctrl_menuitem) { MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, " %s %s" ,curdev->devctrl_array[indx].ctrl_iddesc ,curdev->devctrl_array[indx].ctrl_name); } else { MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "%s %s, %d to %d" ,curdev->devctrl_array[indx].ctrl_iddesc ,curdev->devctrl_array[indx].ctrl_name ,curdev->devctrl_array[indx].ctrl_minimum ,curdev->devctrl_array[indx].ctrl_maximum); } } MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "--------------------------"); } return 0; } static void v4l2_parm_reset(struct context *cnt , struct video_dev *curdev, int indx_dev) { struct vid_devctrl_ctx *devitem; struct params_item_ctx *usritem; int indx_user, retcd; devitem=&curdev->devctrl_array[indx_dev]; for (indx_user=0; indx_uservdev->params_count; indx_user++) { usritem=&cnt->vdev->params_array[indx_user]; if ((mystrceq(devitem->ctrl_iddesc,usritem->param_name)) || (mystrceq(devitem->ctrl_name ,usritem->param_name))) { free(usritem->param_value); /* 32 is a randomly selected long enough length*/ usritem->param_value = mymalloc(32); retcd = snprintf(usritem->param_value, 32, "%d", devitem->ctrl_currval); if ((retcd < 0) || (retcd > 31)){ MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO ,_("Error resetting user value")); return; } } } devitem->ctrl_newval = devitem->ctrl_currval; MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO ,_("Leaving control %s \"%s\" set to %d") ,devitem->ctrl_iddesc, devitem->ctrl_name ,devitem->ctrl_currval); return; } static int v4l2_ctrls_set(struct context *cnt, struct video_dev *curdev) { src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; struct vid_devctrl_ctx *devitem; struct v4l2_control vid_ctrl; int indx_dev, retcd, failed; if (vid_source == NULL) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO,_("Device not ready")); return -1; } failed = FALSE; for (indx_dev= 0;indx_devdevctrl_count;indx_dev++) { devitem=&curdev->devctrl_array[indx_dev]; if (devitem->ctrl_menuitem == FALSE) { if (devitem->ctrl_currval != devitem->ctrl_newval) { memset(&vid_ctrl, 0, sizeof (struct v4l2_control)); vid_ctrl.id = devitem->ctrl_id; vid_ctrl.value = devitem->ctrl_newval; retcd = xioctl(vid_source, VIDIOC_S_CTRL, &vid_ctrl); if (retcd < 0) { failed = TRUE; } else { if (curdev->starting) { MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO ,_("Set control \"%s\" to value %d") ,devitem->ctrl_name, devitem->ctrl_newval); } devitem->ctrl_currval = devitem->ctrl_newval; } } } } /* We loop again to retry to set the values. It is possible that * something needed to be "enabled" before the device would accept * values for a specific control. So the first loop would in theory * enable the control to accept different values, then this loop would * be able to "set" the value. (Users may specify them in random order) */ if (failed == TRUE) { for (indx_dev= 0;indx_devdevctrl_count;indx_dev++) { devitem=&curdev->devctrl_array[indx_dev]; if (devitem->ctrl_menuitem == FALSE) { if (devitem->ctrl_currval != devitem->ctrl_newval) { memset(&vid_ctrl, 0, sizeof (struct v4l2_control)); vid_ctrl.id = devitem->ctrl_id; vid_ctrl.value = devitem->ctrl_newval; retcd = xioctl(vid_source, VIDIOC_S_CTRL, &vid_ctrl); if (retcd < 0) { MOTION_LOG(WRN, TYPE_VIDEO, SHOW_ERRNO ,_("setting control %s \"%s\" to %d failed. ") ,devitem->ctrl_iddesc, devitem->ctrl_name ,devitem->ctrl_newval); v4l2_parm_reset(cnt, curdev, indx_dev); } else { if (curdev->starting) { MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO , _("Set control \"%s\" to value %d") , devitem->ctrl_name, devitem->ctrl_newval); } devitem->ctrl_currval = devitem->ctrl_newval; } } } } } return 0; } static int v4l2_parms_set(struct context *cnt, struct video_dev *curdev) { struct vid_devctrl_ctx *devitem; struct params_item_ctx *usritem; int indx_dev, indx_user; if (cnt->conf.roundrobin_skip < 0) { cnt->conf.roundrobin_skip = 1; } if (curdev->devctrl_count == 0) { cnt->vdev->update_params = FALSE; return 0; } for (indx_dev=0; indx_devdevctrl_count; indx_dev++ ) { devitem=&curdev->devctrl_array[indx_dev]; for (indx_user=0; indx_uservdev->params_count; indx_user++) { usritem=&cnt->vdev->params_array[indx_user]; if ((mystrceq(devitem->ctrl_iddesc,usritem->param_name)) || (mystrceq(devitem->ctrl_name ,usritem->param_name))) { switch (devitem->ctrl_type) { case V4L2_CTRL_TYPE_MENU: /*FALLTHROUGH*/ case V4L2_CTRL_TYPE_INTEGER: if (atoi(usritem->param_value) < devitem->ctrl_minimum) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO ,_("%s control option value %s is below minimum. Using minimum %d") ,devitem->ctrl_name, usritem->param_value, devitem->ctrl_minimum); devitem->ctrl_newval = devitem->ctrl_minimum; } else if (atoi(usritem->param_value) > devitem->ctrl_maximum) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO ,_("%s control option value %s is above maximum. Using maximum %d") ,devitem->ctrl_name, usritem->param_value, devitem->ctrl_maximum); devitem->ctrl_newval = devitem->ctrl_maximum; } else { devitem->ctrl_newval = atoi(usritem->param_value); } break; case V4L2_CTRL_TYPE_BOOLEAN: devitem->ctrl_newval = atoi(usritem->param_value) ? 1 : 0; break; default: MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO ,_("control type not supported yet")); } } } } return 0; } static int v4l2_autobright(struct context *cnt, struct video_dev *curdev, int method) { struct vid_devctrl_ctx *devitem; struct params_item_ctx *usritem; unsigned char *image; int window_high; int window_low; int target; int indx, device_value, make_change; int pixel_count, avg, step; int parm_hysteresis, parm_damper, parm_max, parm_min; char cid_exp[15],cid_expabs[15],cid_bright[15]; if ((method == 0) || (method > 3)) { return 0; } /* Set the values for the control variables */ parm_hysteresis = 20; parm_damper = 20; parm_max = 255; parm_min = 0; target = -1; sprintf(cid_bright,"ID%08d",V4L2_CID_BRIGHTNESS); sprintf(cid_exp,"ID%08d",V4L2_CID_EXPOSURE); sprintf(cid_expabs,"ID%08d",V4L2_CID_EXPOSURE_ABSOLUTE); for (indx = 0;indx < cnt->vdev->params_count; indx++) { usritem=&cnt->vdev->params_array[indx]; if ((method == 1) && ((mystrceq(usritem->param_name,"brightness")) || (mystrceq(usritem->param_name,cid_bright)))) { target = atoi(usritem->param_value); } else if ((method == 2) && ((mystrceq(usritem->param_name,"exposure")) || (mystrceq(usritem->param_name,cid_exp)))) { target = atoi(usritem->param_value); } else if ((method == 3) && ((mystrceq(usritem->param_name,"exposure (absolute)")) || (mystrceq(usritem->param_name,cid_expabs)))) { target = atoi(usritem->param_value); } } device_value = -1; for (indx = 0;indx < curdev->devctrl_count; indx++) { devitem=&curdev->devctrl_array[indx]; if ((method == 1) && (devitem->ctrl_id == V4L2_CID_BRIGHTNESS)) { device_value = devitem->ctrl_currval; parm_max = devitem->ctrl_maximum; parm_min = devitem->ctrl_minimum; if (target == -1) { target = (int) ((devitem->ctrl_maximum - devitem->ctrl_minimum)/2); } } else if ((method == 2) && (devitem->ctrl_id == V4L2_CID_EXPOSURE)) { device_value = devitem->ctrl_currval; parm_max = devitem->ctrl_maximum; parm_min = devitem->ctrl_minimum; if (target == -1) { target = (int) ((devitem->ctrl_maximum - devitem->ctrl_minimum)/2); } } else if ((method == 3) && (devitem->ctrl_id == V4L2_CID_EXPOSURE_ABSOLUTE)) { device_value = devitem->ctrl_currval; parm_max = devitem->ctrl_maximum; parm_min = devitem->ctrl_minimum; if (target == -1) { target = (int) ((devitem->ctrl_maximum - devitem->ctrl_minimum)/2); } } } /* If we can not find control just give up */ if (device_value == -1) { return 0; } avg = 0; pixel_count = 0; image = cnt->imgs.image_vprvcy.image_norm; for (indx = 0; indx < cnt->imgs.motionsize; indx += 10) { avg += image[indx]; pixel_count++; } /* The compiler seems to mandate this be done in separate steps */ /* Must be an integer math thing..must read up on this...*/ avg = (avg / pixel_count); avg = avg * (parm_max - parm_min); avg = avg / 255; make_change = FALSE; step = 0; window_high = MIN2(target + parm_hysteresis, parm_max); window_low = MAX2(target - parm_hysteresis, parm_min); /* Average is above window - turn down exposure - go for the target. */ if (avg > window_high) { step = MIN2((avg - target) / parm_damper + 1, device_value - parm_min); if (device_value > step + 1 - parm_min) { device_value -= step; make_change = TRUE; } else { device_value = parm_min; make_change = TRUE; } //MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "Down Avg %d step: %d device:%d",avg,step,device_value); } else if (avg < window_low) { /* Average is below window - turn up exposure - go for the target. */ step = MIN2((target - avg) / parm_damper + 1, parm_max - device_value); if (device_value < parm_max - step) { device_value += step; make_change = TRUE; } else { device_value = parm_max; make_change = TRUE; } //MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO, "Up Avg %d step: %d device:%d",avg,step,device_value); } if (make_change) { for (indx = 0;indx < curdev->devctrl_count; indx++) { devitem=&curdev->devctrl_array[indx]; if ((method == 1) && (devitem->ctrl_id == V4L2_CID_BRIGHTNESS)) { devitem->ctrl_newval = device_value; } else if ((method == 2) && (devitem->ctrl_id == V4L2_CID_EXPOSURE)) { devitem->ctrl_newval = device_value; } else if ((method == 3) && (devitem->ctrl_id == V4L2_CID_EXPOSURE_ABSOLUTE)) { devitem->ctrl_newval = device_value; } } } return 0; } static int v4l2_input_select(struct context *cnt, struct video_dev *curdev) { /* Set the input number for the device if applicable */ src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; struct v4l2_input input; if ((cnt->param_input == curdev->input) && (!curdev->starting)) { return 0; } memset(&input, 0, sizeof (struct v4l2_input)); if (cnt->param_input == -1 ) { input.index = 0; } else { input.index = cnt->param_input; } if (xioctl(vid_source, VIDIOC_ENUMINPUT, &input) == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("Unable to query input %d." " VIDIOC_ENUMINPUT, if you use a WEBCAM change input value in conf by -1") ,input.index); return -1; } if (curdev->starting) { MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO ,_("Name = \"%s\", type 0x%08X, status %08x") ,input.name, input.type, input.status); } if ((input.type & V4L2_INPUT_TYPE_TUNER) && (curdev->starting)) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("Name = \"%s\",- TUNER"),input.name); } if ((input.type & V4L2_INPUT_TYPE_CAMERA) && (curdev->starting)) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO,_("Name = \"%s\"- CAMERA"),input.name); } if (xioctl(vid_source, VIDIOC_S_INPUT, &input.index) == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO , _("Error selecting input %d VIDIOC_S_INPUT"), input.index); return -1; } curdev->input = cnt->param_input; curdev->device_type = input.type; curdev->device_tuner = input.tuner; return 0; } static int v4l2_norm_select(struct context *cnt, struct video_dev *curdev) { /* Set the video standard (norm) for the device NTSC/PAL/etc*/ src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; struct v4l2_standard standard; v4l2_std_id std_id; if ((cnt->param_norm == curdev->norm) && (!curdev->starting)) { return 0; } if (xioctl(vid_source, VIDIOC_G_STD, &std_id) == -1) { if (curdev->starting) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("Device does not support specifying PAL/NTSC norm")); } cnt->param_norm = std_id = 0; // V4L2_STD_UNKNOWN = 0 } if (std_id) { memset(&standard, 0, sizeof(struct v4l2_standard)); standard.index = 0; while (xioctl(vid_source, VIDIOC_ENUMSTD, &standard) == 0) { if ((standard.id & std_id) && (curdev->starting)) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("- video standard %s"), standard.name); } standard.index++; } switch (cnt->param_norm) { case 1: std_id = V4L2_STD_NTSC; break; case 2: std_id = V4L2_STD_SECAM; break; default: std_id = V4L2_STD_PAL; } if (xioctl(vid_source, VIDIOC_S_STD, &std_id) == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("Error selecting standard method %d VIDIOC_S_STD") ,(int)std_id); } if (curdev->starting) { if (std_id == V4L2_STD_NTSC) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, _("Video standard set to NTSC")); } else if (std_id == V4L2_STD_SECAM) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, _("Video standard set to SECAM")); } else { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, _("Video standard set to PAL")); } } } curdev->norm = cnt->param_norm; return 0; } static int v4l2_frequency_select(struct context *cnt, struct video_dev *curdev) { /* Set the frequency for the tuner */ src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; struct v4l2_tuner tuner; struct v4l2_frequency freq; if ((cnt->param_freq == curdev->frequency) && (!curdev->starting)) { return 0; } /* If this input is attached to a tuner, set the frequency. */ if (curdev->device_type & V4L2_INPUT_TYPE_TUNER) { /* Query the tuners capabilities. */ memset(&tuner, 0, sizeof(struct v4l2_tuner)); tuner.index = curdev->device_tuner; if (xioctl(vid_source, VIDIOC_G_TUNER, &tuner) == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("tuner %d VIDIOC_G_TUNER"), tuner.index); return 0; } if (curdev->starting) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, _("Set tuner %d"), tuner.index); } /* Set the frequency. */ memset(&freq, 0, sizeof(struct v4l2_frequency)); freq.tuner = curdev->device_tuner; freq.type = V4L2_TUNER_ANALOG_TV; freq.frequency = (cnt->param_freq / 1000) * 16; if (xioctl(vid_source, VIDIOC_S_FREQUENCY, &freq) == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("freq %ul VIDIOC_S_FREQUENCY"), freq.frequency); return 0; } if (curdev->starting) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, _("Set Frequency to %ul"), freq.frequency); } } curdev->frequency = cnt->param_freq; return 0; } static int v4l2_pixfmt_try(struct context *cnt, struct video_dev *curdev , u32 pixformat) { int retcd; src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; struct v4l2_format *fmt = &vid_source->dst_fmt; memset(fmt, 0, sizeof(struct v4l2_format)); fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt->fmt.pix.width = cnt->conf.width; fmt->fmt.pix.height = cnt->conf.height; fmt->fmt.pix.pixelformat = pixformat; fmt->fmt.pix.field = V4L2_FIELD_ANY; retcd = xioctl(vid_source, VIDIOC_TRY_FMT, fmt); if ((retcd == -1) || (fmt->fmt.pix.pixelformat != pixformat)) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO , _("Unable to use %c%c%c%c (%dx%d)") , pixformat >> 0, pixformat >> 8 , pixformat >> 16, pixformat >> 24 , cnt->conf.width, cnt->conf.height); return -1; } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO , _("Testing palette %c%c%c%c (%dx%d)") , pixformat >> 0, pixformat >> 8 , pixformat >> 16, pixformat >> 24 , cnt->conf.width, cnt->conf.height); return 0; } static int v4l2_pixfmt_stride(struct video_dev *curdev) { int wd, bpl, wps; src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; curdev->width = (int)vid_source->dst_fmt.fmt.pix.width; curdev->height = (int)vid_source->dst_fmt.fmt.pix.height; bpl = (int)vid_source->dst_fmt.fmt.pix.bytesperline; wd = curdev->width; MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO , _("Checking image size %dx%d with stride %d") , curdev->width, curdev->height, bpl); if (bpl == 0) { MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO , _("No stride value provided from device.")); return 0; } /* Documents indicate that stride is equal to width + padding * As such, the stride(bpl) will never be less than width */ if (wd > bpl) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO , _("Width(%d) must be less than stride(%d)"), wd, bpl); return -1; } /* For perfect multiples of width and stride, no adjustment needed */ if ((wd == bpl) || ((bpl % wd) == 0)) { return 0; } MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO , _("The image width(%d) is not multiple of the stride(%d)") , wd, bpl); /* Width per stride */ wps = bpl / wd; if (wps < 1) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO , _("Impossible condition: Width(%d), Stride(%d), Per stride(%d)") , wd, bpl, wps); } MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO , _("Image width will be padded %d bytes"), ((bpl % wd)/wps)); curdev->width = (int)wd + ((bpl % wd)/wps); return 0; } /* Adjust requested resolution if needed*/ static int v4l2_pixfmt_adj(struct context *cnt, struct video_dev *curdev) { if ((curdev->width != cnt->conf.width) || (curdev->height != cnt->conf.height)) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO ,_("Adjusting resolution from %ix%i to %ix%i.") ,cnt->conf.width, cnt->conf.height ,curdev->width, curdev->height); if ((curdev->width % 8) || (curdev->height % 8)) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("Adjusted resolution not modulo 8.")); MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("Specify different palette or width/height in config file.")); return -1; } cnt->conf.width = curdev->width; cnt->conf.height = curdev->height; } return 0; } static int v4l2_pixfmt_set(struct context *cnt, struct video_dev *curdev, u32 pixformat) { int retcd; src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; struct v4l2_format *fmt = &vid_source->dst_fmt; retcd = v4l2_pixfmt_try(cnt, curdev, pixformat); if (retcd == -1) { return -1; } retcd = v4l2_pixfmt_stride(curdev); if (retcd == -1) { return -1; } retcd = v4l2_pixfmt_adj(cnt, curdev); if (retcd == -1) { return -1; } retcd = xioctl(vid_source, VIDIOC_S_FMT, fmt); if (retcd == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("Error setting pixel format.")); return -1; } curdev->pixfmt_src = pixformat; if (curdev->starting) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("Using palette %c%c%c%c (%dx%d)") ,pixformat >> 0 , pixformat >> 8 ,pixformat >> 16, pixformat >> 24 ,cnt->conf.width, cnt->conf.height); } return 0; } static int v4l2_pixfmt_select(struct context *cnt, struct video_dev *curdev) { src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; struct v4l2_fmtdesc fmtd; int v4l2_pal, indx_palette, indx, retcd; palette_item *palette_array; palette_array = malloc(sizeof(palette_item) * (V4L2_PALETTE_COUNT_MAX+1)); v4l2_palette_init(palette_array); if (cnt->conf.width % 8) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("config image width (%d) is not modulo 8"), cnt->conf.width); cnt->conf.width = cnt->conf.width - (cnt->conf.width % 8) + 8; MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO , _("Adjusting to width (%d)"), cnt->conf.width); } if (cnt->conf.height % 8) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("config image height (%d) is not modulo 8"), cnt->conf.height); cnt->conf.height = cnt->conf.height - (cnt->conf.height % 8) + 8; MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO ,_("Adjusting to height (%d)"), cnt->conf.height); } indx_palette = 17; for (indx = 0; indx < cnt->vdev->params_count; indx++) { if ( mystreq(cnt->vdev->params_array[indx].param_name, "palette")) { indx_palette = atoi(cnt->vdev->params_array[indx].param_value); }; } /* First we try setting the config file value */ if ((indx_palette >= 0) && (indx_palette <= V4L2_PALETTE_COUNT_MAX)) { retcd = v4l2_pixfmt_set(cnt, curdev,palette_array[indx_palette].v4l2id); if (retcd >= 0) { free(palette_array); return 0; } MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("Configuration palette index %d (%s) for %dx%d doesn't work.") , indx_palette, palette_array[indx_palette].fourcc ,cnt->conf.width, cnt->conf.height); } memset(&fmtd, 0, sizeof(struct v4l2_fmtdesc)); fmtd.index = v4l2_pal = 0; fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; indx_palette = -1; /* -1 says not yet chosen */ MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, _("Supported palettes:")); while (xioctl(vid_source, VIDIOC_ENUM_FMT, &fmtd) != -1) { if (curdev->starting) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "(%i) %c%c%c%c (%s)", v4l2_pal, fmtd.pixelformat >> 0, fmtd.pixelformat >> 8, fmtd.pixelformat >> 16, fmtd.pixelformat >> 24, fmtd.description); MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO ,_("%d - %s (compressed : %d) (%#x)") ,fmtd.index, fmtd.description, fmtd.flags, fmtd.pixelformat); } /* Adjust indx_palette if larger value found */ for (indx = 0; indx <= V4L2_PALETTE_COUNT_MAX; indx++) { if (palette_array[indx].v4l2id == fmtd.pixelformat) { indx_palette = indx; } } memset(&fmtd, 0, sizeof(struct v4l2_fmtdesc)); fmtd.index = ++v4l2_pal; fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; } if (indx_palette >= 0) { retcd = v4l2_pixfmt_set(cnt, curdev, palette_array[indx_palette].v4l2id); if (retcd >= 0) { if (curdev->starting) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("Selected palette %s") ,palette_array[indx_palette].fourcc); } free(palette_array); return 0; } MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("Palette selection failed for format %s") , palette_array[indx_palette].fourcc); } MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("Unable to find a compatible palette format.")); free(palette_array); return -1; } static int v4l2_mmap_request(struct video_dev *curdev) { src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; memset(&vid_source->req, 0, sizeof(struct v4l2_requestbuffers)); vid_source->req.count = MMAP_BUFFERS; vid_source->req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vid_source->req.memory = V4L2_MEMORY_MMAP; if (xioctl(vid_source, VIDIOC_REQBUFS, &vid_source->req) == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("Error requesting buffers %d for memory map. VIDIOC_REQBUFS") ,vid_source->req.count); return -1; } curdev->buffer_count = vid_source->req.count; MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO ,_("mmap information: frames=%d"), curdev->buffer_count); if (curdev->buffer_count < MIN_MMAP_BUFFERS) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("Insufficient buffer memory %d < MIN_MMAP_BUFFERS.") ,curdev->buffer_count); return -1; } vid_source->buffers = calloc(curdev->buffer_count, sizeof(video_buff)); if (!vid_source->buffers) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, _("Out of memory.")); vid_source->buffers = NULL; return -1; } return 0; } static int v4l2_mmap_query(struct video_dev *curdev, int indx) { src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; struct v4l2_buffer buf; struct v4l2_plane planes[VIDEO_MAX_PLANES]; memset(&buf, 0, sizeof(struct v4l2_buffer)); memset(planes, 0, sizeof planes); buf.index = indx; buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.length = VIDEO_MAX_PLANES; buf.m.planes = planes; if (xioctl(vid_source, VIDIOC_QUERYBUF, &buf) == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("Error querying buffer %i"), indx); free(vid_source->buffers); vid_source->buffers = NULL; return -1; } vid_source->buffers[indx].size = buf.length; vid_source->buffers[indx].ptr = mmap(NULL, buf.length , PROT_READ | PROT_WRITE, MAP_SHARED , vid_source->fd_device, buf.m.offset); if (vid_source->buffers[indx].ptr == MAP_FAILED) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("Error mapping buffer %i mmap"), indx); free(vid_source->buffers); vid_source->buffers = NULL; return -1; } MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO , _("%i length=%d Address (%x) offset %d") , indx, buf.length, vid_source->buffers[indx].ptr , buf.m.offset); return 0; } static int v4l2_mmap_queue(struct video_dev *curdev, int indx) { src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; struct v4l2_plane planes[VIDEO_MAX_PLANES]; memset(&vid_source->buf, 0, sizeof(struct v4l2_buffer)); memset(planes, 0, sizeof planes); vid_source->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vid_source->buf.memory = V4L2_MEMORY_MMAP; vid_source->buf.index = indx; vid_source->buf.length = VIDEO_MAX_PLANES; vid_source->buf.m.planes = planes; if (xioctl(vid_source, VIDIOC_QBUF, &vid_source->buf) == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "VIDIOC_QBUF"); return -1; } return 0; } static int v4l2_mmap_set(struct video_dev *curdev) { int retcd, indx; src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; enum v4l2_buf_type type; if (!(vid_source->cap.capabilities & V4L2_CAP_STREAMING)) { return -1; } retcd = v4l2_mmap_request(curdev); if (retcd != 0) { return retcd; } for (indx = 0; indx < curdev->buffer_count; indx++) { retcd = v4l2_mmap_query(curdev, indx); if (retcd != 0) { return retcd; } retcd = v4l2_mmap_queue(curdev,indx); if (retcd != 0) { return retcd; } } type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (xioctl(vid_source, VIDIOC_STREAMON, &type) == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO ,_("Error starting stream. VIDIOC_STREAMON")); return -1; } return 0; } static int v4l2_imgs_set(struct context *cnt, struct video_dev *curdev) { cnt->imgs.width = curdev->width; cnt->imgs.height = curdev->height; cnt->imgs.motionsize = cnt->imgs.width * cnt->imgs.height; cnt->imgs.size_norm = (cnt->imgs.motionsize * 3) / 2; cnt->conf.width = curdev->width; cnt->conf.height = curdev->height; return 0; } static int v4l2_pix_change(struct context *cnt, struct video_dev *curdev , uint8_t *dest) { int retcd, width, height; src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; video_buff *src; width = curdev->width; height = curdev->height; src = &vid_source->buffers[vid_source->buf.index]; /*The FALLTHROUGH is a special comment required by compiler.*/ switch (curdev->pixfmt_src) { case V4L2_PIX_FMT_RGB24: vid_rgb24toyuv420p(dest, src->ptr, width, height); return 0; case V4L2_PIX_FMT_UYVY: vid_uyvyto420p(dest, src->ptr, width, height); return 0; case V4L2_PIX_FMT_YUYV: vid_yuv422to420p(dest, src->ptr, width, height); return 0; case V4L2_PIX_FMT_YUV422P: vid_yuv422pto420p(dest, src->ptr, width, height); return 0; case V4L2_PIX_FMT_YUV420: memcpy(dest, src->ptr, cnt->imgs.size_norm); return 0; case V4L2_PIX_FMT_PJPG: /*FALLTHROUGH*/ case V4L2_PIX_FMT_JPEG: /*FALLTHROUGH*/ case V4L2_PIX_FMT_MJPEG: retcd = vid_mjpegtoyuv420p(dest , src->ptr, width, height, src->content_length); return retcd; case V4L2_PIX_FMT_SBGGR16: /*FALLTHROUGH*/ case V4L2_PIX_FMT_SGBRG8: /*FALLTHROUGH*/ case V4L2_PIX_FMT_SGRBG8: /*FALLTHROUGH*/ case V4L2_PIX_FMT_SBGGR8: /* bayer */ vid_bayer2rgb24(cnt->imgs.common_buffer, src->ptr, width, height); vid_rgb24toyuv420p(dest, cnt->imgs.common_buffer, width, height); return 0; case V4L2_PIX_FMT_SPCA561: /*FALLTHROUGH*/ case V4L2_PIX_FMT_SN9C10X: vid_sonix_decompress(dest, src->ptr, width, height); vid_bayer2rgb24(cnt->imgs.common_buffer, dest, width, height); vid_rgb24toyuv420p(dest, cnt->imgs.common_buffer, width, height); return 0; case V4L2_PIX_FMT_Y10: vid_y10torgb24(cnt->imgs.common_buffer, src->ptr, width, height, 2); vid_rgb24toyuv420p(dest, cnt->imgs.common_buffer, width, height); return 0; case V4L2_PIX_FMT_Y12: vid_y10torgb24(cnt->imgs.common_buffer, src->ptr, width, height, 4); vid_rgb24toyuv420p(dest, cnt->imgs.common_buffer, width, height); return 0; case V4L2_PIX_FMT_GREY: vid_greytoyuv420p(dest, src->ptr, width, height); return 0; default: retcd = -1; } return -1; } static int v4l2_capture(struct video_dev *curdev) { int retcd; sigset_t set, old; src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; struct v4l2_plane planes[VIDEO_MAX_PLANES]; /* Block signals during IOCTL */ sigemptyset(&set); sigaddset(&set, SIGCHLD); sigaddset(&set, SIGALRM); sigaddset(&set, SIGUSR1); sigaddset(&set, SIGTERM); sigaddset(&set, SIGHUP); pthread_sigmask(SIG_BLOCK, &set, &old); if (vid_source->pframe >= 0) { retcd = xioctl(vid_source, VIDIOC_QBUF, &vid_source->buf); if (retcd == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "VIDIOC_QBUF"); pthread_sigmask(SIG_UNBLOCK, &old, NULL); return retcd; } } memset(&vid_source->buf, 0, sizeof(struct v4l2_buffer)); memset(planes, 0, sizeof planes); vid_source->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vid_source->buf.memory = V4L2_MEMORY_MMAP; vid_source->buf.bytesused = 0; vid_source->buf.length = VIDEO_MAX_PLANES; vid_source->buf.m.planes = planes; retcd = xioctl(vid_source, VIDIOC_DQBUF, &vid_source->buf); if (retcd == -1) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "VIDIOC_DQBUF"); pthread_sigmask(SIG_UNBLOCK, &old, NULL); return retcd; } vid_source->pframe = vid_source->buf.index; vid_source->buffers[vid_source->buf.index].used = vid_source->buf.bytesused; vid_source->buffers[vid_source->buf.index].content_length = vid_source->buf.bytesused; pthread_sigmask(SIG_UNBLOCK, &old, NULL); return 0; } static int v4l2_device_init(struct context *cnt, struct video_dev *curdev) { src_v4l2_t *vid_source; /* Allocate memory for the state structure. */ if (!(vid_source = calloc(sizeof(src_v4l2_t), 1))) { MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, _("Out of memory.")); vid_source = NULL; return -1; } pthread_mutexattr_init(&curdev->attr); pthread_mutex_init(&curdev->mutex, &curdev->attr); curdev->usage_count = 1; curdev->input = cnt->param_input; curdev->norm = cnt->param_norm; curdev->frequency = cnt->param_freq; curdev->height = cnt->conf.height; curdev->width = cnt->conf.width; curdev->devctrl_array = NULL; curdev->devctrl_count = 0; curdev->owner = -1; curdev->fps = 0; curdev->buffer_count= 0; curdev->v4l2_private = vid_source; vid_source->fd_device = curdev->fd_device; vid_source->fps = cnt->conf.framerate; vid_source->pframe = -1; vid_source->finish = &cnt->finish; vid_source->buffers = NULL; return 0; } static void v4l2_device_select(struct context *cnt, struct video_dev *curdev) { int indx, retcd, newvals; if (curdev->v4l2_private == NULL) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO,_("Device not ready")); return; } vid_parms_parse(cnt); if ((cnt->param_input != curdev->input) || (cnt->param_norm != curdev->norm) || (cnt->param_freq != curdev->frequency)) { newvals = TRUE; } else { newvals = FALSE; } if (newvals) { retcd = v4l2_input_select(cnt, curdev); if (retcd == 0) { retcd = v4l2_norm_select(cnt, curdev); } if (retcd == 0) { retcd = v4l2_frequency_select(cnt, curdev); } if (retcd == 0) { retcd = v4l2_parms_set(cnt, curdev); } if (retcd == 0) { retcd = v4l2_autobright(cnt, curdev, cnt->conf.auto_brightness); } if (retcd == 0) { retcd = v4l2_ctrls_set(cnt, curdev); } if (retcd < 0) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO ,_("Errors occurred during device select")); } /* Clear the buffers from previous "robin" pictures*/ for (indx =0; indx < curdev->buffer_count; indx++) { v4l2_capture(curdev); } /* Skip the requested round robin frame count */ for (indx = 1; indx < cnt->conf.roundrobin_skip; indx++) { v4l2_capture(curdev); } } else { /* No round robin - we only adjust picture controls */ retcd = v4l2_parms_set(cnt, curdev); if (retcd == 0) { retcd = v4l2_autobright(cnt, curdev, cnt->conf.auto_brightness); } if (retcd == 0) { retcd = v4l2_ctrls_set(cnt, curdev); } if (retcd < 0 ) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO ,_("Errors occurred during device select")); } } } static int v4l2_device_open(struct context *cnt, struct video_dev *curdev) { int fd_device; MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("Using videodevice %s and input %d") ,cnt->conf.video_device, cnt->param_input); /* Give the watchdog more time for this open function */ cnt->watchdog = (cnt->conf.watchdog_tmo * 2); curdev->video_device = cnt->conf.video_device; src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; curdev->fd_device = -1; vid_source->fd_device = -1; fd_device = -1; fd_device = open(curdev->video_device, O_RDWR|O_CLOEXEC); if (fd_device > 0) { curdev->fd_device = fd_device; vid_source->fd_device = fd_device; return 0; } MOTION_LOG(ALR, TYPE_VIDEO, SHOW_ERRNO ,_("Failed to open video device %s") ,cnt->conf.video_device); return -1; } static void v4l2_device_close(struct video_dev *curdev) { src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; enum v4l2_buf_type type; type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (vid_source != NULL) { if (vid_source->fd_device != -1) { MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO, "close"); xioctl(vid_source, VIDIOC_STREAMOFF, &type); close(vid_source->fd_device); vid_source->fd_device = -1; } } } static void v4l2_device_cleanup(struct video_dev *curdev) { src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; unsigned int indx; int indx2; if (vid_source != NULL) { MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO, "vid_source"); if (vid_source->buffers != NULL) { for (indx = 0; indx < vid_source->req.count; indx++) { munmap(vid_source->buffers[indx].ptr, vid_source->buffers[indx].size); } free(vid_source->buffers); vid_source->buffers = NULL; } free(vid_source); curdev->v4l2_private = NULL; } if (curdev->devctrl_count != 0) { for (indx2=0; indx2 < curdev->devctrl_count; indx2++) { free(curdev->devctrl_array[indx2].ctrl_iddesc); free(curdev->devctrl_array[indx2].ctrl_name); curdev->devctrl_array[indx2].ctrl_iddesc = NULL; curdev->devctrl_array[indx2].ctrl_name = NULL; } free(curdev->devctrl_array); curdev->devctrl_array = NULL; } curdev->devctrl_count=0; } static int v4l2_device_capability(struct video_dev *curdev) { src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; if (xioctl(vid_source, VIDIOC_QUERYCAP, &vid_source->cap) < 0) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, _("Not a V4L2 device?")); return -1; } MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO, "------------------------"); MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO, "cap.driver: \"%s\"",vid_source->cap.driver); MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO, "cap.card: \"%s\"",vid_source->cap.card); MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO, "cap.bus_info: \"%s\"",vid_source->cap.bus_info); MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO, "cap.capabilities=0x%08X",vid_source->cap.capabilities); MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO, "------------------------"); if (vid_source->cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "- VIDEO_CAPTURE"); } if (vid_source->cap.capabilities & V4L2_CAP_VIDEO_OUTPUT) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "- VIDEO_OUTPUT"); } if (vid_source->cap.capabilities & V4L2_CAP_VIDEO_OVERLAY) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "- VIDEO_OVERLAY"); } if (vid_source->cap.capabilities & V4L2_CAP_VBI_CAPTURE) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "- VBI_CAPTURE"); } if (vid_source->cap.capabilities & V4L2_CAP_VBI_OUTPUT) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "- VBI_OUTPUT"); } if (vid_source->cap.capabilities & V4L2_CAP_RDS_CAPTURE) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "- RDS_CAPTURE"); } if (vid_source->cap.capabilities & V4L2_CAP_TUNER) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "- TUNER"); } if (vid_source->cap.capabilities & V4L2_CAP_AUDIO) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "- AUDIO"); } if (vid_source->cap.capabilities & V4L2_CAP_READWRITE) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "- READWRITE"); } if (vid_source->cap.capabilities & V4L2_CAP_ASYNCIO) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "- ASYNCIO"); } if (vid_source->cap.capabilities & V4L2_CAP_STREAMING) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "- STREAMING"); } if (vid_source->cap.capabilities & V4L2_CAP_TIMEPERFRAME) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "- TIMEPERFRAME"); } if (!(vid_source->cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, _("Device does not support capturing.")); return -1; } return 0; } static int v4l2_fps_set(struct context *cnt, struct video_dev *curdev) { src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private; struct v4l2_streamparm setfps; int retcd; memset(&setfps, 0, sizeof(struct v4l2_streamparm)); setfps.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; setfps.parm.capture.timeperframe.numerator = 1; setfps.parm.capture.timeperframe.denominator = cnt->conf.framerate; MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO , _("Trying to set fps to %d") , setfps.parm.capture.timeperframe.denominator); retcd = xioctl(vid_source, VIDIOC_S_PARM, &setfps); if (retcd != 0) { MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO ,_("Error setting fps. Return code %d"), retcd); } MOTION_LOG(INF, TYPE_VIDEO, NO_ERRNO , _("Device set fps to %d") , setfps.parm.capture.timeperframe.denominator); return 0; } #endif /* HAVE_V4L2 */ void v4l2_mutex_init(void) { #ifdef HAVE_V4L2 pthread_mutex_init(&v4l2_mutex, NULL); #else MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO, _("V4L2 is not enabled")); #endif // HAVE_V4L2 } void v4l2_mutex_destroy(void) { #ifdef HAVE_V4L2 pthread_mutex_destroy(&v4l2_mutex); #else return; #endif // HAVE_V4L2 } int v4l2_start(struct context *cnt) { #ifdef HAVE_V4L2 int retcd; struct video_dev *curdev; pthread_mutex_lock(&v4l2_mutex); /* If device is already open and initialized use it*/ curdev = video_devices; while (curdev) { if (mystreq(cnt->conf.video_device, curdev->video_device)) { v4l2_vdev_init(cnt); vid_parms_parse(cnt); retcd = v4l2_imgs_set(cnt, curdev); if (retcd == 0) { curdev->usage_count++; retcd = curdev->fd_device; } pthread_mutex_unlock(&v4l2_mutex); return retcd; } curdev = curdev->next; } curdev = mymalloc(sizeof(struct video_dev)); curdev->starting = TRUE; v4l2_vdev_init(cnt); vid_parms_parse(cnt); retcd = v4l2_device_init(cnt, curdev); if (retcd == 0) { retcd = v4l2_device_open(cnt, curdev); } if (retcd == 0) { retcd = v4l2_device_capability(curdev); } if (retcd == 0) { retcd = v4l2_input_select(cnt, curdev); } if (retcd == 0) { retcd = v4l2_norm_select(cnt, curdev); } if (retcd == 0) { retcd = v4l2_frequency_select(cnt, curdev); } if (retcd == 0) { retcd = v4l2_pixfmt_select(cnt, curdev); } if (retcd == 0) { retcd = v4l2_fps_set(cnt, curdev); } if (retcd == 0) { retcd = v4l2_ctrls_count(curdev); } if (retcd == 0) { retcd = v4l2_ctrls_list(curdev); } if (retcd == 0) { retcd = v4l2_parms_set(cnt, curdev); } if (retcd == 0) { retcd = v4l2_ctrls_set(cnt, curdev); } if (retcd == 0) { retcd = v4l2_mmap_set(curdev); } if (retcd == 0) { retcd = v4l2_imgs_set(cnt, curdev); } if (retcd < 0) { /* These may need more work to consider all the fail scenarios*/ v4l2_device_close(curdev); v4l2_device_cleanup(curdev); curdev->fd_device = -1; pthread_mutexattr_destroy(&curdev->attr); pthread_mutex_destroy(&curdev->mutex); v4l2_vdev_free(cnt); free(curdev); pthread_mutex_unlock(&v4l2_mutex); return retcd; } curdev->starting = FALSE; /* Insert into linked list. */ curdev->next = video_devices; video_devices = curdev; pthread_mutex_unlock(&v4l2_mutex); return curdev->fd_device; #else (void)cnt; MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO, _("V4L2 is not enabled.")); return -1; #endif // HAVE_V4l2 } void v4l2_cleanup(struct context *cnt) { #ifdef HAVE_V4L2 struct video_dev *dev = video_devices; struct video_dev *prev = NULL; /* Cleanup the v4l2 part */ pthread_mutex_lock(&v4l2_mutex); while (dev) { if (dev->fd_device == cnt->video_dev) { break; } prev = dev; dev = dev->next; } pthread_mutex_unlock(&v4l2_mutex); /* Set it as closed in thread context. */ cnt->video_dev = -1; v4l2_vdev_free(cnt); if (dev == NULL) { MOTION_LOG(CRT, TYPE_VIDEO, NO_ERRNO, _("Unable to find video device")); return; } if (--dev->usage_count == 0) { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("Closing video device %s"), dev->video_device); v4l2_device_close(dev); v4l2_device_cleanup(dev); dev->fd_device = -1; /* Remove from list */ if (prev == NULL) { video_devices = dev->next; } else { prev->next = dev->next; } pthread_mutexattr_destroy(&dev->attr); pthread_mutex_destroy(&dev->mutex); free(dev); } else { MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO ,_("Still %d users of video device %s, so we don't close it now") ,dev->usage_count, dev->video_device); /* * There is still at least one thread using this device * If we own it, release it. */ if (dev->owner == cnt->threadnr) { dev->frames = 0; dev->owner = -1; pthread_mutex_unlock(&dev->mutex); } } #else (void)cnt; #endif // HAVE_V4L2 } int v4l2_next(struct context *cnt, struct image_data *img_data) { #ifdef HAVE_V4L2 int retcd = -2; struct config *conf = &cnt->conf; struct video_dev *dev; pthread_mutex_lock(&v4l2_mutex); dev = video_devices; while (dev) { if (dev->fd_device == cnt->video_dev) { break; } dev = dev->next; } pthread_mutex_unlock(&v4l2_mutex); if (dev == NULL) { return -1; } if (dev->owner != cnt->threadnr) { pthread_mutex_lock(&dev->mutex); dev->owner = cnt->threadnr; dev->frames = conf->roundrobin_frames; } v4l2_device_select(cnt, dev); retcd = v4l2_capture(dev); if (retcd == 0) { retcd = v4l2_pix_change(cnt, dev, img_data->image_norm); } if (--dev->frames <= 0) { dev->owner = -1; dev->frames = 0; pthread_mutex_unlock(&dev->mutex); } if (retcd == 0) { rotate_map(cnt, img_data); } return retcd; #else (void)cnt; (void)img_data; return -1; #endif // HAVE_V4L2 } int v4l2_palette_valid(char *video_device, int v4l2_palette) { #ifdef HAVE_V4L2 /* This function is a boolean that returns true(1) if the palette selected in the * configuration file is valid for the device and false(0) if the palette is not valid */ palette_item *palette_array; struct v4l2_fmtdesc fmtd; int device_palette; int retcd; src_v4l2_t *vid_source; palette_array = malloc(sizeof(palette_item) * (V4L2_PALETTE_COUNT_MAX+1)); v4l2_palette_init(palette_array); vid_source = calloc(sizeof(src_v4l2_t), 1); vid_source->fd_device = open(video_device, O_RDWR|O_CLOEXEC); if (vid_source->fd_device < 0) { MOTION_LOG(ALR, TYPE_VIDEO, SHOW_ERRNO ,_("Failed to open video device %s"),video_device); free(vid_source); free(palette_array); return 0; } memset(&fmtd, 0, sizeof(struct v4l2_fmtdesc)); fmtd.index = device_palette = 0; fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; retcd = 0; while (xioctl(vid_source, VIDIOC_ENUM_FMT, &fmtd) != -1) { if (palette_array[v4l2_palette].v4l2id == fmtd.pixelformat) { retcd = 1; } memset(&fmtd, 0, sizeof(struct v4l2_fmtdesc)); fmtd.index = ++device_palette; fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; } close(vid_source->fd_device); free(vid_source); free(palette_array); return retcd; #else (void)video_device; (void)v4l2_palette; return 0; #endif // HAVE_V4L2 } void v4l2_palette_fourcc(int v4l2_palette, char *fourcc) { #ifdef HAVE_V4L2 /* This function populates the provided fourcc pointer with the fourcc code for the * requested palette id code. If the palette is not one of the ones that Motion supports * it returns the string as "NULL" */ palette_item *palette_array; palette_array = malloc(sizeof(palette_item) * (V4L2_PALETTE_COUNT_MAX+1)); v4l2_palette_init(palette_array); if ((v4l2_palette > V4L2_PALETTE_COUNT_MAX) || (v4l2_palette < 0)) { sprintf(fourcc,"%s","NULL"); } else { sprintf(fourcc,"%s",palette_array[v4l2_palette].fourcc); } free(palette_array); return; #else sprintf(fourcc,"%s","NULL"); (void)v4l2_palette; return; #endif // HAVE_V4L2 } int v4l2_parms_valid(char *video_device, int v4l2_palette, int v4l2_fps, int v4l2_width, int v4l2_height) { #ifdef HAVE_V4L2 /* This function is a boolean that returns true(1) if the parms selected in the * configuration file are valid for the device and false(0) if not valid */ palette_item *palette_array; struct v4l2_fmtdesc dev_format; struct v4l2_frmsizeenum dev_sizes; struct v4l2_frmivalenum dev_frameint; int retcd; int indx_format, indx_sizes, indx_frameint; src_v4l2_t *vid_source; palette_array = malloc(sizeof(palette_item) * (V4L2_PALETTE_COUNT_MAX+1)); v4l2_palette_init(palette_array); vid_source = calloc(sizeof(src_v4l2_t), 1); vid_source->fd_device = open(video_device, O_RDWR|O_CLOEXEC); if (vid_source->fd_device < 0) { MOTION_LOG(ALR, TYPE_VIDEO, SHOW_ERRNO ,_("Failed to open video device %s"),video_device); free(vid_source); free(palette_array); return 0; } retcd = 0; memset(&dev_format, 0, sizeof(struct v4l2_fmtdesc)); dev_format.index = indx_format = 0; dev_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; while (xioctl(vid_source, VIDIOC_ENUM_FMT, &dev_format) != -1) { MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO ,_("Testing palette %s (%c%c%c%c)") ,dev_format.description ,dev_format.pixelformat >> 0 ,dev_format.pixelformat >> 8 ,dev_format.pixelformat >> 16 ,dev_format.pixelformat >> 24); memset(&dev_sizes, 0, sizeof(struct v4l2_frmsizeenum)); dev_sizes.index = indx_sizes = 0; dev_sizes.pixel_format = dev_format.pixelformat; while (xioctl(vid_source, VIDIOC_ENUM_FRAMESIZES, &dev_sizes) != -1) { MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO ,_(" Width: %d, Height %d") ,dev_sizes.discrete.width ,dev_sizes.discrete.height); memset(&dev_frameint, 0, sizeof(struct v4l2_frmivalenum)); dev_frameint.index = indx_frameint = 0; dev_frameint.pixel_format = dev_format.pixelformat; dev_frameint.width = dev_sizes.discrete.width; dev_frameint.height = dev_sizes.discrete.height; while (xioctl(vid_source, VIDIOC_ENUM_FRAMEINTERVALS, &dev_frameint) != -1) { MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO ,_(" Framerate %d/%d") ,dev_frameint.discrete.numerator ,dev_frameint.discrete.denominator); if ((palette_array[v4l2_palette].v4l2id == dev_format.pixelformat) && ((int)dev_sizes.discrete.width == v4l2_width) && ((int)dev_sizes.discrete.height == v4l2_height) && ((int)dev_frameint.discrete.numerator == 1) && ((int)dev_frameint.discrete.denominator == v4l2_fps)) { retcd = 1; } memset(&dev_frameint, 0, sizeof(struct v4l2_frmivalenum)); dev_frameint.index = ++indx_frameint; dev_frameint.pixel_format = dev_format.pixelformat; dev_frameint.width = dev_sizes.discrete.width; dev_frameint.height = dev_sizes.discrete.height; } memset(&dev_sizes, 0, sizeof(struct v4l2_frmsizeenum)); dev_sizes.index = ++indx_sizes; dev_sizes.pixel_format = dev_format.pixelformat; } memset(&dev_format, 0, sizeof(struct v4l2_fmtdesc)); dev_format.index = ++indx_format; dev_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; } close(vid_source->fd_device); free(vid_source); free(palette_array); return retcd; #else (void)video_device; (void)v4l2_fps; (void)v4l2_palette; (void)v4l2_width; (void)v4l2_height; return 0; #endif // HAVE_V4L2 } motion-release-4.6.0/src/video_v4l2.h000066400000000000000000000025311452402535500173670ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * video_v4l2.h * Headers associated with functions in the video_v4l2.c module. * Copyright 2000 by Jeroen Vreeken (pe1rxq@amsat.org) */ #ifndef _INCLUDE_VIDEO_V4L2_H #define _INCLUDE_VIDEO_V4L2_H void v4l2_mutex_init(void); void v4l2_mutex_destroy(void); int v4l2_start(struct context *cnt); int v4l2_next(struct context *cnt, struct image_data *img_data); void v4l2_cleanup(struct context *cnt); int v4l2_palette_valid(char *video_device, int v4l2_palette); int v4l2_parms_valid(char *video_device, int v4l2_palette, int v4l2_fps, int v4l2_width, int v4l2_height); void v4l2_palette_fourcc(int v4l2_palette, char *fourcc); #endif /* _INCLUDE_VIDEO_V4L2_H */ motion-release-4.6.0/src/webu.c000066400000000000000000002505611452402535500163570ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * webu.c * * Webcontrol and Streams for motion. * * Function naming scheme: * webu* - All functions in this module have this prefix. * webu_start - Entry point to start the daemon. * webu_stop - Entry point to stop the daemon * webu_mhd* - Functions related to libmicrohttd implementation * webu_process_action - Performs most items under the action menu * webu_process_config - Saves the parameter values into Motion. * webu_process_track - Performs the tracking functions. * * Some function names are long and are not expected to contain any * logger message that would display the function name to the user. * * Functions are generally kept to under one page in length * * Known Issues: * The quit/restart uses signals and this should be reconsidered. * The tracking is "best effort" since developer does not have tracking camera. * The conf_cmdparse assumes that the pointers to the motion context for each * camera are always sequential and enforcement of the pointers being sequential * has not been observed in the other modules. (This is a legacy assumption) */ #include #include #include #include "motion.h" #include "util.h" #include "logger.h" #include "webu.h" #include "webu_html.h" #include "webu_text.h" #include "webu_stream.h" #include "webu_status.h" #include "translate.h" static mymhd_retcd webu_mhd_send(struct webui_ctx *webui, int ctrl); /* Context to pass the parms to functions to start mhd */ struct mhdstart_ctx { struct context **cnt; char *tls_cert; char *tls_key; int ctrl; int indxthrd; struct MHD_OptionItem *mhd_ops; int mhd_opt_nbr; unsigned int mhd_flags; int ipv6; struct sockaddr_in lpbk_ipv4; struct sockaddr_in6 lpbk_ipv6; }; struct failauth_item_ctx { char *clientip; /* Ip of the client failing auth*/ int attempt_nbr; /* Number of times client ip failed auth*/ struct timeval attempt_tm; /* The time of the last attempt*/ }; struct failauth_ctx { struct failauth_item_ctx *failauth_array; /*Array of the failed auths*/ int lockout_minutes; /*Number of minutes to lock out*/ int lockout_attempts; /*Number attempts before locking out*/ int lockout_max_ips; /*Maximum number of IPs to lock out at once*/ int count; /*Count of the array size */ pthread_mutex_t mutex_failauth; }; /* Since we do not have a application context, must make this global */ struct failauth_ctx *failauth; static void webu_context_init(struct context **cntlst, struct context *cnt, struct webui_ctx *webui) { int indx; webui->url = mymalloc(WEBUI_LEN_URLI); webui->uri_camid = mymalloc(WEBUI_LEN_PARM); webui->uri_cmd1 = mymalloc(WEBUI_LEN_PARM); webui->uri_cmd2 = mymalloc(WEBUI_LEN_PARM); webui->uri_parm1 = mymalloc(WEBUI_LEN_PARM); webui->uri_value1 = mymalloc(WEBUI_LEN_PARM); webui->uri_parm2 = mymalloc(WEBUI_LEN_PARM); webui->uri_value2 = mymalloc(WEBUI_LEN_PARM); webui->clientip = mymalloc(WEBUI_LEN_URLI); webui->hostname = mymalloc(WEBUI_LEN_PARM); webui->auth_denied = mymalloc(WEBUI_LEN_RESP); webui->auth_opaque = mymalloc(WEBUI_LEN_PARM); webui->auth_realm = mymalloc(WEBUI_LEN_PARM); webui->text_eol = mymalloc(WEBUI_LEN_PARM); webui->auth_user = NULL; /* Buffer to hold the user name*/ webui->auth_pass = NULL; /* Buffer to hold the password */ webui->authenticated = FALSE; /* boolean for whether we are authenticated*/ webui->lang = mymalloc(3); /* Two digit lang code plus null terminator */ webui->lang_full = mymalloc(6); /* lang code, e.g US_en */ webui->resp_size = WEBUI_LEN_RESP * 10; /* The size of the resp_page buffer. May get adjusted */ webui->resp_used = 0; /* How many bytes used so far in resp_page*/ webui->stream_pos = 0; /* Stream position of image being sent */ webui->stream_fps = 1; /* Stream rate */ webui->resp_page = mymalloc(webui->resp_size); /* The response being constructed */ webui->cntlst = cntlst; /* The list of context's for all cameras */ webui->cnt = cnt; /* The context pointer for a single camera */ webui->cnct_type = WEBUI_CNCT_UNKNOWN; /* get the number of cameras and threads */ indx = 0; if (webui->cntlst != NULL) { while (webui->cntlst[++indx]) { continue; } } webui->cam_threads = indx; webui->cam_count = indx; if (indx > 1) { webui->cam_count--; } /* 1 thread, 1 camera = just motion.conf. * 2 thread, 1 camera, then using motion.conf plus a separate camera file */ snprintf(webui->lang_full, 6,"%s", getenv("LANGUAGE")); snprintf(webui->lang, 3,"%s",webui->lang_full); memset(webui->hostname,'\0',WEBUI_LEN_PARM); memset(webui->resp_page,'\0',webui->resp_size); return; } static void webu_context_null(struct webui_ctx *webui) { /* Null out all the pointers in our webui context */ webui->url = NULL; webui->hostname = NULL; webui->uri_camid = NULL; webui->uri_cmd1 = NULL; webui->uri_cmd2 = NULL; webui->uri_parm1 = NULL; webui->uri_value1 = NULL; webui->uri_parm2 = NULL; webui->uri_value2 = NULL; webui->lang = NULL; webui->lang_full = NULL; webui->resp_page = NULL; webui->connection = NULL; webui->auth_user = NULL; webui->auth_pass = NULL; webui->auth_denied = NULL; webui->auth_opaque = NULL; webui->auth_realm = NULL; webui->clientip = NULL; webui->text_eol = NULL; return; } static void webu_context_free_var(char* varin) { if (varin != NULL) { free(varin); } } static void webu_context_free(struct webui_ctx *webui) { webu_context_free_var(webui->hostname); webu_context_free_var(webui->url); webu_context_free_var(webui->uri_camid); webu_context_free_var(webui->uri_cmd1); webu_context_free_var(webui->uri_cmd2); webu_context_free_var(webui->uri_parm1); webu_context_free_var(webui->uri_value1); webu_context_free_var(webui->uri_parm2); webu_context_free_var(webui->uri_value2); webu_context_free_var(webui->lang); webu_context_free_var(webui->lang_full); webu_context_free_var(webui->resp_page); webu_context_free_var(webui->auth_user); webu_context_free_var(webui->auth_pass); webu_context_free_var(webui->auth_denied); webu_context_free_var(webui->auth_opaque); webu_context_free_var(webui->auth_realm); webu_context_free_var(webui->clientip); webu_context_free_var(webui->text_eol); webu_context_null(webui); free(webui); return; } static void webu_badreq(struct webui_ctx *webui) { /* This function is used in this webu module as a central function when there is a bad * request. Since sometimes we will be unable to determine what camera context (stream * or camera) originated the request and we have NULL for cntlist and cnt, we default the * response to be HTML. Otherwise, we do know the type and we send back to the user the * bad request response either with or without the HTML tags. */ if (webui->cnt != NULL) { if (webui->cnt->conf.webcontrol_interface == 1) { webu_text_badreq(webui); } else { webu_html_badreq(webui); } } else if (webui->cntlst != NULL) { if (webui->cntlst[0]->conf.webcontrol_interface == 1) { webu_text_badreq(webui); } else { webu_html_badreq(webui); } } else { webu_html_badreq(webui); } } void webu_write(struct webui_ctx *webui, const char *buf) { /* Copy the buf data to our response buffer. If the response buffer is not large enough to * accept our new data coming in, then expand it in chunks of 10 */ int resp_len; char *temp_resp; size_t temp_size; resp_len = strlen(buf); temp_size = webui->resp_size; while ((resp_len + webui->resp_used) > temp_size) { temp_size = temp_size + (WEBUI_LEN_RESP * 10); } if (temp_size > webui->resp_size) { temp_resp = mymalloc(webui->resp_size); memcpy(temp_resp, webui->resp_page, webui->resp_size); free(webui->resp_page); webui->resp_page = mymalloc(temp_size); memset(webui->resp_page,'\0',temp_size); memcpy(webui->resp_page, temp_resp, webui->resp_size); webui->resp_size = temp_size; free(temp_resp); } memcpy(webui->resp_page + webui->resp_used, buf, resp_len); webui->resp_used = webui->resp_used + resp_len; return; } static void webu_parms_edit(struct webui_ctx *webui) { /* Determine the thread number provided. * If no thread provided, assign it to -1 * Samples: * http://localhost:8081/0/stream (cntlist will be populated and this function will set cnt) * http://localhost:8081/stream (cntlist will be null, cnt will be populated) * http://localhost:8081/ (cntlist will be null, cnt will be populated) */ int indx, is_nbr; if (strlen(webui->uri_camid) > 0) { is_nbr = TRUE; for (indx=0; indx < (int)strlen(webui->uri_camid);indx++) { if ((webui->uri_camid[indx] > '9') || (webui->uri_camid[indx] < '0')) { is_nbr = FALSE; } } if (is_nbr) { webui->thread_nbr = atoi(webui->uri_camid); } else { webui->thread_nbr = -1; } } else { webui->thread_nbr = -1; } /* Set the single context pointer to thread we are answering * If the connection is for a single stream (legacy method of a port * per stream), then the cntlist will be null and the camera context * will already be assigned into webui->cnt. This is part of the * init function which is called for MHD and it has the different * variations depending upon how the port and cameras were specified. * Also set/convert the camid into the thread number. */ if (webui->cntlst != NULL) { if (webui->thread_nbr < 0) { webui->cnt = webui->cntlst[0]; webui->thread_nbr = 0; } else { indx = 0; while (webui->cntlst[indx] != NULL) { if (webui->cntlst[indx]->camera_id == webui->thread_nbr) { webui->thread_nbr = indx; break; } indx++; } /* This may be null, in which case we will not answer the request */ webui->cnt = webui->cntlst[indx]; } } } static void webu_parseurl_parms(struct webui_ctx *webui, char *st_pos) { /* Parse the parameters of the URI * Earlier functions have assigned the st_pos to the slash after the action and it is * pointing at the set/get when this function is invoked. * Samples (MHD takes off the IP:port) * /{camid}/config/set?{parm}={value1} * /{camid}/config/get?query={parm} * /{camid}/track/set?x={value1}&y={value2} * /{camid}/track/set?pan={value1}&tilt={value2} * /{camid}/{cmd1}/{cmd2}?{parm1}={value1}&{parm2}={value2} */ int parm_len, last_parm; char *en_pos; /* First parse out the "set","get","pan","tilt","x","y" * from the uri and put them into the cmd2. * st_pos is at the beginning of the command * If there is no ? then we are done parsing * Note that each section is looking for a different * delimitter. (?, =, &, =, &) */ last_parm = FALSE; en_pos = strstr(st_pos,"?"); if (en_pos != NULL) { parm_len = en_pos - st_pos + 1; if (parm_len >= WEBUI_LEN_PARM) { return; } snprintf(webui->uri_cmd2, parm_len,"%s", st_pos); /* Get the parameter name */ st_pos = st_pos + parm_len; /* Move past the command */ en_pos = strstr(st_pos,"="); if (en_pos == NULL) { parm_len = strlen(webui->url) - parm_len; last_parm = TRUE; } else { parm_len = en_pos - st_pos + 1; } if (parm_len >= WEBUI_LEN_PARM) { return; } snprintf(webui->uri_parm1, parm_len,"%s", st_pos); if (!last_parm) { /* Get the parameter value */ st_pos = st_pos + parm_len; /* Move past the equals sign */ if (mystrceq(webui->uri_parm1,"x") || mystrceq(webui->uri_parm1,"pan") ) { en_pos = strstr(st_pos,"&"); } else { en_pos = NULL; } if (en_pos == NULL) { parm_len = strlen(webui->url) - parm_len; last_parm = TRUE; } else { parm_len = en_pos - st_pos + 1; } if (parm_len >= WEBUI_LEN_PARM) { return; } snprintf(webui->uri_value1, parm_len,"%s", st_pos); } if (!last_parm) { /* Get the next parameter name */ st_pos = st_pos + parm_len; /* Move past the previous command */ en_pos = strstr(st_pos,"="); if (en_pos == NULL) { parm_len = strlen(webui->url) - parm_len; last_parm = TRUE; } else { parm_len = en_pos - st_pos + 1; } if (parm_len >= WEBUI_LEN_PARM) { return; } snprintf(webui->uri_parm2, parm_len,"%s", st_pos); } if (!last_parm) { /* Get the next parameter value */ st_pos = st_pos + parm_len; /* Move past the equals sign */ en_pos = strstr(st_pos,"&"); if (en_pos == NULL) { parm_len = strlen(webui->url) - parm_len; last_parm = TRUE; } else { parm_len = en_pos - st_pos + 1; } if (parm_len >= WEBUI_LEN_PARM) { return; } snprintf(webui->uri_value2, parm_len,"%s", st_pos); } } } static void webu_parseurl_reset(struct webui_ctx *webui) { /* Reset the variables to empty strings*/ memset(webui->uri_camid,'\0',WEBUI_LEN_PARM); memset(webui->uri_cmd1,'\0',WEBUI_LEN_PARM); memset(webui->uri_cmd2,'\0',WEBUI_LEN_PARM); memset(webui->uri_parm1,'\0',WEBUI_LEN_PARM); memset(webui->uri_value1,'\0',WEBUI_LEN_PARM); memset(webui->uri_parm2,'\0',WEBUI_LEN_PARM); memset(webui->uri_value2,'\0',WEBUI_LEN_PARM); } static int webu_parseurl(struct webui_ctx *webui) { /* Parse the sent URI into the commands and parameters * so we can check the resulting strings in later functions * and determine what actions to take. * Samples * / * /{camid} * /{camid}/config/set?log_level=6 * /{camid}/config/set?{parm}={value1} * /{camid}/config/get?query={parm} * /{camid}/track/set?x={value1}&y={value2} * /{camid}/track/set?pan={value1}&tilt={value2} * /{camid}/{cmd1}/{cmd2}?{parm1}={value1}&{parm2}={value2} */ int retcd, parm_len, last_slash; char *st_pos, *en_pos; retcd = 0; MOTION_LOG(DBG, TYPE_STREAM, NO_ERRNO, _("Sent url: %s"),webui->url); webu_parseurl_reset(webui); if (strlen(webui->url) == 0) { return -1; } MHD_http_unescape(webui->url); MOTION_LOG(DBG, TYPE_STREAM, NO_ERRNO, _("Decoded url: %s"),webui->url); /* Home page */ if (strlen(webui->url) == 1) { return 0; } last_slash = 0; /* Get the camid number and which sometimes this will contain an action if the user * is setting the port for a particular camera and requests the * stream by using http://localhost:port/stream */ st_pos = webui->url + 1; /* Move past the first "/" */ if (*st_pos == '-') { /* Never allow a negative number */ return -1; } en_pos = strstr(st_pos,"/"); if (en_pos == NULL) { parm_len = strlen(webui->url); last_slash = 1; } else { parm_len = en_pos - st_pos + 1; } if (parm_len >= WEBUI_LEN_PARM) { /* var was malloc'd to WEBUI_LEN_PARM */ return -1; } snprintf(webui->uri_camid, parm_len,"%s", st_pos); if (!last_slash) { /* Get cmd1 or action */ st_pos = st_pos + parm_len; /* Move past the camid */ en_pos = strstr(st_pos,"/"); if (en_pos == NULL) { parm_len = strlen(webui->url) - parm_len ; last_slash = 1; } else { parm_len = en_pos - st_pos + 1; } if (parm_len >= WEBUI_LEN_PARM) { /* var was malloc'd to WEBUI_LEN_PARM */ return -1; } snprintf(webui->uri_cmd1, parm_len,"%s", st_pos); } if (!last_slash) { /* Get cmd2 or action */ st_pos = st_pos + parm_len; /* Move past the first command */ en_pos = strstr(st_pos,"/"); if (en_pos == NULL) { parm_len = strlen(webui->url) - parm_len; last_slash = 1; } else { parm_len = en_pos - st_pos + 1; } if (parm_len >= WEBUI_LEN_PARM) { /* var was malloc'd to WEBUI_LEN_PARM */ return -1; } snprintf(webui->uri_cmd2, parm_len,"%s", st_pos); } if ((mystreq(webui->uri_cmd1,"config") || mystreq(webui->uri_cmd1,"track") ) && (strlen(webui->uri_cmd2) > 0)) { webu_parseurl_parms(webui, st_pos); } MOTION_LOG(DBG, TYPE_STREAM, NO_ERRNO, "camid: >%s< cmd1: >%s< cmd2: >%s< parm1:>%s< val1:>%s< parm2:>%s< val2:>%s<" ,webui->uri_camid ,webui->uri_cmd1, webui->uri_cmd2 ,webui->uri_parm1, webui->uri_value1 ,webui->uri_parm2, webui->uri_value2); return retcd; } void webu_process_action(struct webui_ctx *webui) { /* Process the actions from the webcontrol that the user requested. This is used * for both the html and text interface. The text interface just adds a additional * response whereas the html just performs the action */ int indx; indx = 0; if (mystreq(webui->uri_cmd2,"makemovie") || mystreq(webui->uri_cmd2,"eventend")) { if (webui->thread_nbr == 0 && webui->cam_threads > 1) { while (webui->cntlst[++indx]) { webui->cntlst[indx]->event_stop = TRUE; } } else { webui->cnt->event_stop = TRUE; } } else if (mystreq(webui->uri_cmd2,"eventstart")) { if (webui->thread_nbr == 0 && webui->cam_threads > 1) { while (webui->cntlst[++indx]) { webui->cntlst[indx]->event_user = TRUE; } } else { webui->cnt->event_user = TRUE; } } else if (mystreq(webui->uri_cmd2,"snapshot")) { if (webui->thread_nbr == 0 && webui->cam_threads > 1) { while (webui->cntlst[++indx]) { webui->cntlst[indx]->snapshot = 1; } } else { webui->cnt->snapshot = 1; } } else if (mystreq(webui->uri_cmd2,"restart")) { if (webui->thread_nbr == 0) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO, _("Restarting all threads")); webui->cntlst[0]->webcontrol_finish = TRUE; kill(getpid(),SIGHUP); } else { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO, _("Restarting thread %d"),webui->thread_nbr); webui->cnt->restart = TRUE; if (webui->cnt->running) { webui->cnt->event_stop = TRUE; webui->cnt->finish = TRUE; } } } else if (mystreq(webui->uri_cmd2,"quit")) { if (webui->thread_nbr == 0 && webui->cam_threads > 1) { while (webui->cntlst[++indx]) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO, _("Quitting thread %d"),webui->thread_nbr); webui->cntlst[indx]->restart = FALSE; webui->cntlst[indx]->event_stop = TRUE; webui->cntlst[indx]->finish = TRUE; } } else { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO, _("Quitting thread %d"),webui->thread_nbr); webui->cnt->restart = FALSE; webui->cnt->event_stop = TRUE; webui->cnt->finish = TRUE; } } else if (mystreq(webui->uri_cmd2,"end")) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO, _("Motion terminating")); while (webui->cntlst[indx]) { webui->cntlst[indx]->webcontrol_finish = TRUE; webui->cntlst[indx]->restart = FALSE; webui->cntlst[indx]->event_stop = TRUE; webui->cntlst[indx]->finish = TRUE; indx++; } } else if (mystreq(webui->uri_cmd2,"start")) { if (webui->thread_nbr == 0 && webui->cam_threads > 1) { do { webui->cntlst[indx]->pause = 0; } while (webui->cntlst[++indx]); } else { webui->cnt->pause = 0; } } else if (mystreq(webui->uri_cmd2,"pause")) { if (webui->thread_nbr == 0 && webui->cam_threads > 1) { do { webui->cntlst[indx]->pause = 1; } while (webui->cntlst[++indx]); } else { webui->cnt->pause = 1; } } else if (mystreq(webui->uri_cmd2,"connection")) { webu_text_connection(webui); } else if (mystreq(webui->uri_cmd2,"status")) { webu_text_status(webui); } else if ((mystreq(webui->uri_cmd2,"write")) || (mystreq(webui->uri_cmd2,"writeyes"))) { conf_print(webui->cntlst); } else { MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO, _("Invalid action requested: >%s< >%s< >%s<") , webui->uri_camid, webui->uri_cmd1, webui->uri_cmd2); return; } } static int webu_process_config_set(struct webui_ctx *webui) { /* Process the request to change the configuration parameters. Used * both the html and text interfaces. If the parameter was found, then * we return 0 otherwise a -1 to tell the calling function whether it * was a valid parm to change. */ int indx, retcd; char temp_name[WEBUI_LEN_PARM]; /* Search through the depreciated parms and if applicable, * get the new parameter name so we can check its webcontrol_parms level */ snprintf(temp_name, WEBUI_LEN_PARM, "%s", webui->uri_parm1); indx=0; while (dep_config_params[indx].name != NULL) { if (mystreq(dep_config_params[indx].name,webui->uri_parm1)) { snprintf(temp_name, WEBUI_LEN_PARM, "%s", dep_config_params[indx].newname); break; } indx++; } /* Ignore any request to change an option that is designated above the * webcontrol_parms level. */ indx=0; while (config_params[indx].param_name != NULL) { if (((webui->thread_nbr != 0) && (config_params[indx].main_thread)) || (config_params[indx].webui_level > webui->cntlst[0]->conf.webcontrol_parms) || (config_params[indx].webui_level == WEBUI_LEVEL_NEVER) ) { indx++; continue; } if (mystreq(temp_name, config_params[indx].param_name)) { break; } indx++; } /* If we found the parm, assign it. If the loop above did not find the parm * then we ignore the request */ if (config_params[indx].param_name != NULL) { if (strlen(webui->uri_parm1) > 0) { /* This is legacy assumption on the pointers being sequential * We send in the original parm name so it will trigger the depreciated warnings * and perform any required transformations from old parm to new parm */ conf_cmdparse(webui->cntlst + webui->thread_nbr , webui->uri_parm1, webui->uri_value1); /*If we are updating vid parms, set the flag to update the device.*/ if (mystreq(config_params[indx].param_name, "video_params") && (webui->cntlst[webui->thread_nbr]->vdev != NULL)) { webui->cntlst[webui->thread_nbr]->vdev->update_params = TRUE; } /* If changing language, do it now */ if (mystreq(config_params[indx].param_name, "native_language")) { nls_enabled = webui->cntlst[webui->thread_nbr]->conf.native_language; if (nls_enabled) { MOTION_LOG(INF, TYPE_ALL, NO_ERRNO,_("Native Language : on")); } else { MOTION_LOG(INF, TYPE_ALL, NO_ERRNO,_("Native Language : off")); } } } else { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO,_("Set the value to null/zero")); } retcd = 0; } else { retcd = -1; } return retcd; } int webu_process_config(struct webui_ctx *webui) { int retcd; retcd = 0; if ((mystreq(webui->uri_cmd1,"config")) && (mystreq(webui->uri_cmd2,"set"))) { retcd = webu_process_config_set(webui); } else if ((mystreq(webui->uri_cmd1,"config")) && (mystreq(webui->uri_cmd2,"get"))) { webu_text_get_query(webui); } else if ((mystreq(webui->uri_cmd1,"config")) && (mystreq(webui->uri_cmd2,"list"))) { webu_text_list(webui); } else { MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO, _("Invalid action requested: >%s< >%s< >%s<") , webui->uri_camid, webui->uri_cmd1, webui->uri_cmd2); } return retcd; } int webu_process_track(struct webui_ctx *webui) { /* Call the tracking move functions as requested */ struct coord cent; int retcd; if (mystreq(webui->uri_cmd2, "center")) { webui->cntlst[webui->thread_nbr]->moved = track_center(webui->cntlst[webui->thread_nbr], 0, 1, 0, 0); retcd = 0; } else if (mystreq(webui->uri_cmd2, "set")) { if (mystreq(webui->uri_parm1, "pan")) { cent.width = webui->cntlst[webui->thread_nbr]->imgs.width; cent.height = webui->cntlst[webui->thread_nbr]->imgs.height; cent.x = atoi(webui->uri_value1); cent.y = 0; webui->cntlst[webui->thread_nbr]->moved = track_move(webui->cntlst[webui->thread_nbr] ,webui->cntlst[webui->thread_nbr]->video_dev ,¢, &webui->cntlst[webui->thread_nbr]->imgs, 1); cent.width = webui->cntlst[webui->thread_nbr]->imgs.width; cent.height = webui->cntlst[webui->thread_nbr]->imgs.height; cent.x = 0; cent.y = atoi(webui->uri_value2); webui->cntlst[webui->thread_nbr]->moved = track_move(webui->cntlst[webui->thread_nbr] ,webui->cntlst[webui->thread_nbr]->video_dev ,¢, &webui->cntlst[webui->thread_nbr]->imgs, 1); retcd = 0; } else if (mystrceq(webui->uri_parm1, "x")) { webui->cntlst[webui->thread_nbr]->moved = track_center(webui->cntlst[webui->thread_nbr] , webui->cntlst[webui->thread_nbr]->video_dev, 1 , atoi(webui->uri_value1), atoi(webui->uri_value2)); retcd = 0; } else { retcd = -1; } } else { retcd = -1; } return retcd; } static void webu_clientip(struct webui_ctx *webui) { /* Extract the IP of the client that is connecting. When the * user specifies Motion to use IPV6 and a IPV4 address comes to us * the IPv4 address is prepended with a ::ffff: We then trim that off * so we don't confuse our users. */ const union MHD_ConnectionInfo *con_info; char client[WEBUI_LEN_URLI]; const char *ip_dst; struct sockaddr_in6 *con_socket6; struct sockaddr_in *con_socket4; int is_ipv6; is_ipv6 = FALSE; if (webui->cnt != NULL ) { if (webui->cnt->conf.webcontrol_ipv6) { is_ipv6 = TRUE; } } else { if (webui->cntlst[0]->conf.webcontrol_ipv6) { is_ipv6 = TRUE; } } con_info = MHD_get_connection_info(webui->connection, MHD_CONNECTION_INFO_CLIENT_ADDRESS); if (is_ipv6) { con_socket6 = (struct sockaddr_in6 *)con_info->client_addr; ip_dst = inet_ntop(AF_INET6, &con_socket6->sin6_addr, client, WEBUI_LEN_URLI); if (ip_dst == NULL) { snprintf(webui->clientip, WEBUI_LEN_URLI, "%s", "Unknown"); } else { if (strncmp(client,"::ffff:",7) == 0) { snprintf(webui->clientip, WEBUI_LEN_URLI, "%s", client + 7); } else { snprintf(webui->clientip, WEBUI_LEN_URLI, "%s", client); } } } else { con_socket4 = (struct sockaddr_in *)con_info->client_addr; ip_dst = inet_ntop(AF_INET, &con_socket4->sin_addr, client, WEBUI_LEN_URLI); if (ip_dst == NULL) { snprintf(webui->clientip, WEBUI_LEN_URLI, "%s", "Unknown"); } else { snprintf(webui->clientip,WEBUI_LEN_URLI,"%s",client); } } } static void webu_hostname(struct webui_ctx *webui, int ctrl) { /* use the hostname the browser used to connect to us when * constructing links to the stream ports. If available * (which it is in all modern browsers) it is more likely to * work than the result of gethostname(), which is reliant on * the machine we're running on having it's hostname setup * correctly and corresponding DNS in place. */ const char *hdr; char *en_pos; int host_len; hdr = MHD_lookup_connection_value (webui->connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_HOST); if (hdr != NULL) { snprintf(webui->hostname, WEBUI_LEN_PARM, "%s", hdr); /* IPv6 addresses have :'s in them so special case them */ if (webui->hostname[0] == '[') { en_pos = strstr(webui->hostname, "]"); if (en_pos != NULL) { host_len = en_pos - webui->hostname + 2; snprintf(webui->hostname, host_len, "%s", hdr); } } else { en_pos = strstr(webui->hostname, ":"); if (en_pos != NULL) { host_len = en_pos - webui->hostname + 1; snprintf(webui->hostname, host_len, "%s", hdr); } } } else { gethostname(webui->hostname, WEBUI_LEN_PARM - 1); } /* Assign the type of protocol that is associated with the host * so we can use this protocol as we are building the html page or * streams. */ if (ctrl) { if (webui->cnt->conf.webcontrol_tls) { snprintf(webui->hostproto,6,"%s","https"); } else { snprintf(webui->hostproto,6,"%s","http"); } } else { if (webui->cnt->conf.stream_tls) { snprintf(webui->hostproto,6,"%s","https"); } else { snprintf(webui->hostproto,6,"%s","http"); } } return; } /* Return true if the IP is being blocked for failed auths*/ static int webu_failauth_check(struct webui_ctx *webui) { int indx, chkcnt, retcd; struct timeval time_curr; gettimeofday(&time_curr, NULL); retcd = FALSE; chkcnt = 0; pthread_mutex_lock(&failauth->mutex_failauth); for (indx=0; indxcount; indx++) { if (failauth->failauth_array[indx].attempt_tm.tv_sec > 0) { if (time_curr.tv_sec > ((failauth->lockout_minutes * 60) + failauth->failauth_array[indx].attempt_tm.tv_sec)) { /*The lockout period has expired */ if (failauth->failauth_array[indx].clientip != NULL) { free(failauth->failauth_array[indx].clientip); failauth->failauth_array[indx].clientip = NULL; } failauth->failauth_array[indx].attempt_tm.tv_sec = 0; failauth->failauth_array[indx].attempt_nbr = 0; } else { chkcnt++; } if ((mystreq(failauth->failauth_array[indx].clientip, webui->clientip)) && (failauth->failauth_array[indx].attempt_nbr > failauth->lockout_attempts)) { /* An additional attempt so reset our lockout start time */ failauth->failauth_array[indx].attempt_tm.tv_sec = time_curr.tv_sec; retcd = TRUE; } } } pthread_mutex_unlock(&failauth->mutex_failauth); /* If the count locked IPs is at our maximum, we do not permit more connections */ if (chkcnt == failauth->count) { retcd = TRUE; } if (retcd) { if (mystrne( _("Ignoring connection from: %s") ,"Ignoring connection from: %s")) { MOTION_LOG(ALR,TYPE_ALL, NO_ERRNO , _("Ignoring connection from: %s"), webui->clientip); } /* Do not translate the message below or change it * in any way. Other applications read the logs looking * for this message so that the IP can be banned */ MOTION_LOG(ALR,TYPE_ALL, NO_ERRNO , "Ignoring connection from: %s", webui->clientip); SLEEP(2, 0); } return retcd; } /* Add the IP for failed auths*/ static void webu_failauth_log(struct webui_ctx *webui) { int indx; struct timeval time_curr; gettimeofday(&time_curr, NULL); pthread_mutex_lock(&failauth->mutex_failauth); for (indx=0; indxcount; indx++) { if (mystreq(failauth->failauth_array[indx].clientip, webui->clientip)) { failauth->failauth_array[indx].attempt_nbr++; failauth->failauth_array[indx].attempt_tm.tv_sec = time_curr.tv_sec; break; } } if (indx == failauth->count) { /* Was not previously logged so add it to the array*/ for (indx=0; indxcount; indx++) { if (failauth->failauth_array[indx].clientip == NULL) { failauth->failauth_array[indx].clientip = mymalloc(strlen(webui->clientip)+1); sprintf(failauth->failauth_array[indx].clientip,"%s", webui->clientip); failauth->failauth_array[indx].attempt_nbr++; failauth->failauth_array[indx].attempt_tm.tv_sec = time_curr.tv_sec; break; } } } pthread_mutex_unlock(&failauth->mutex_failauth); /* Sleep some to annoy the bots trying to hack in */ SLEEP(2, 0); } /* Reset the IP for failed auths*/ static void webu_failauth_reset(struct webui_ctx *webui) { int indx; pthread_mutex_lock(&failauth->mutex_failauth); for (indx=0; indxcount; indx++) { if (mystreq(failauth->failauth_array[indx].clientip, webui->clientip)) { if (failauth->failauth_array[indx].clientip != NULL) { free(failauth->failauth_array[indx].clientip); failauth->failauth_array[indx].clientip = NULL; } failauth->failauth_array[indx].attempt_tm.tv_sec = 0; failauth->failauth_array[indx].attempt_nbr = 0; break; } } pthread_mutex_unlock(&failauth->mutex_failauth); } static mymhd_retcd webu_mhd_digest_fail(struct webui_ctx *webui,int signal_stale) { /* Create a denied response to user*/ struct MHD_Response *response; mymhd_retcd retcd; webui->authenticated = FALSE; response = MHD_create_response_from_buffer(strlen(webui->auth_denied) ,(void *)webui->auth_denied, MHD_RESPMEM_PERSISTENT); if (response == NULL) { return MHD_NO; } retcd = MHD_queue_auth_fail_response(webui->connection, webui->auth_realm ,webui->auth_opaque, response ,(signal_stale == MHD_INVALID_NONCE) ? MHD_YES : MHD_NO); MHD_destroy_response(response); return retcd; } static mymhd_retcd webu_mhd_digest(struct webui_ctx *webui) { /* Perform the digest authentication. This function gets called a couple of * times by MHD during the authentication process. */ int retcd; char *user; /*Get username or prompt for a user/pass */ user = MHD_digest_auth_get_username(webui->connection); if (user == NULL) { return webu_mhd_digest_fail(webui, MHD_NO); } /* Check for valid user name */ if (mystrne(user, webui->auth_user)) { webu_failauth_log(webui); MOTION_LOG(ALR, TYPE_STREAM, NO_ERRNO ,_("Failed authentication from %s"), webui->clientip); if (user != NULL) { free(user); } return webu_mhd_digest_fail(webui, MHD_NO); } if (user != NULL) { free(user); } /* Check the password as well*/ retcd = MHD_digest_auth_check(webui->connection, webui->auth_realm , webui->auth_user, webui->auth_pass, 300); if (retcd == MHD_NO) { webu_failauth_log(webui); MOTION_LOG(ALR, TYPE_STREAM, NO_ERRNO ,_("Failed authentication from %s"), webui->clientip); } if ( (retcd == MHD_INVALID_NONCE) || (retcd == MHD_NO) ) { return webu_mhd_digest_fail(webui, retcd); } webui->authenticated = TRUE; return MHD_YES; } static mymhd_retcd webu_mhd_basic_fail(struct webui_ctx *webui) { /* Create a denied response to user*/ struct MHD_Response *response; int retcd; webui->authenticated = FALSE; response = MHD_create_response_from_buffer(strlen(webui->auth_denied) ,(void *)webui->auth_denied, MHD_RESPMEM_PERSISTENT); if (response == NULL) { return MHD_NO; } retcd = MHD_queue_basic_auth_fail_response (webui->connection, webui->auth_realm, response); MHD_destroy_response(response); if (retcd == MHD_YES) { return MHD_YES; } else { return MHD_NO; } } static mymhd_retcd webu_mhd_basic(struct webui_ctx *webui) { /* Perform Basic Authentication. */ char *user, *pass; pass = NULL; user = NULL; user = MHD_basic_auth_get_username_password (webui->connection, &pass); if ((user == NULL) || (pass == NULL)) { if (user != NULL) { free(user); } if (pass != NULL) { free(pass); } return webu_mhd_basic_fail(webui); } if (mystrne(user, webui->auth_user) || mystrne(pass, webui->auth_pass)) { webu_failauth_log(webui); MOTION_LOG(ALR, TYPE_STREAM, NO_ERRNO ,_("Failed authentication from %s"),webui->clientip); if (user != NULL) { free(user); } if (pass != NULL) { free(pass); } return webu_mhd_basic_fail(webui); } if (user != NULL) { free(user); } if (pass != NULL) { free(pass); } webui->authenticated = TRUE; return MHD_YES; } static void webu_mhd_auth_parse(struct webui_ctx *webui, int ctrl) { int auth_len; char *col_pos; /* Parse apart the user:pass provided*/ if (webui->auth_user != NULL) { free(webui->auth_user); } if (webui->auth_pass != NULL) { free(webui->auth_pass); } webui->auth_user = NULL; webui->auth_pass = NULL; if (ctrl){ auth_len = strlen(webui->cnt->conf.webcontrol_authentication); col_pos = strstr(webui->cnt->conf.webcontrol_authentication,":"); if (col_pos == NULL) { webui->auth_user = mymalloc(auth_len+1); webui->auth_pass = mymalloc(2); snprintf(webui->auth_user, auth_len + 1, "%s" ,webui->cnt->conf.webcontrol_authentication); snprintf(webui->auth_pass, 2, "%s",""); } else { webui->auth_user = mymalloc(auth_len - strlen(col_pos) + 1); webui->auth_pass = mymalloc(strlen(col_pos)); snprintf(webui->auth_user, auth_len - strlen(col_pos) + 1, "%s" ,webui->cnt->conf.webcontrol_authentication); snprintf(webui->auth_pass, strlen(col_pos), "%s", col_pos + 1); } } else { auth_len = strlen(webui->cnt->conf.stream_authentication); col_pos = strstr(webui->cnt->conf.stream_authentication,":"); if (col_pos == NULL) { webui->auth_user = mymalloc(auth_len+1); webui->auth_pass = mymalloc(2); snprintf(webui->auth_user, auth_len + 1, "%s" ,webui->cnt->conf.stream_authentication); snprintf(webui->auth_pass, 2, "%s",""); } else { webui->auth_user = mymalloc(auth_len - strlen(col_pos) + 1); webui->auth_pass = mymalloc(strlen(col_pos)); snprintf(webui->auth_user, auth_len - strlen(col_pos) + 1, "%s" ,webui->cnt->conf.stream_authentication); snprintf(webui->auth_pass, strlen(col_pos), "%s", col_pos + 1); } } } static mymhd_retcd webu_mhd_auth(struct webui_ctx *webui, int ctrl) { /* Set everything up for calling the authentication functions */ unsigned int rand1,rand2; snprintf(webui->auth_denied, WEBUI_LEN_RESP, "%s" ,"Access denied" "Access denied"); srand(time(NULL)); rand1 = (unsigned int)(42000000.0 * rand() / (RAND_MAX + 1.0)); rand2 = (unsigned int)(42000000.0 * rand() / (RAND_MAX + 1.0)); snprintf(webui->auth_opaque, WEBUI_LEN_PARM, "%08x%08x", rand1, rand2); snprintf(webui->auth_realm, WEBUI_LEN_PARM, "%s","Motion"); if (ctrl) { /* Authentication for the webcontrol*/ if (webui->cnt->conf.webcontrol_authentication == NULL) { webui->authenticated = TRUE; if (webui->cnt->conf.webcontrol_auth_method != 0) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("No webcontrol user:pass provided")); } return MHD_YES; } if (webui->auth_user == NULL) { webu_mhd_auth_parse(webui, ctrl); } if (webui->cnt->conf.webcontrol_auth_method == 1) { return webu_mhd_basic(webui); } else if (webui->cnt->conf.webcontrol_auth_method == 2) { return webu_mhd_digest(webui); } } else { /* Authentication for the streams */ if (webui->cnt->conf.stream_authentication == NULL) { webui->authenticated = TRUE; if (webui->cnt->conf.stream_auth_method != 0) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("No stream user:pass provided")); } return MHD_YES; } if (webui->auth_user == NULL) { webu_mhd_auth_parse(webui, ctrl); } if (webui->cnt->conf.stream_auth_method == 1) { return webu_mhd_basic(webui); } else if (webui->cnt->conf.stream_auth_method == 2) { return webu_mhd_digest(webui); } } webui->authenticated = TRUE; return MHD_YES; } static mymhd_retcd webu_mhd_send(struct webui_ctx *webui, int ctrl) { /* Send the response that we created back to the user. Now if the user * provided a really bad URL, then we couldn't determine which Motion context * they were wanting. In this situation, we have a webui->cnt = NULL and we * don't know whether it came from a html or text request. In this situation * we use the MHD defaults and skip adding CORS/Content type. (There isn't any * Motion context so we can't tell where to look) * The ctrl parameter is a boolean which just says whether the request is for * the webcontrol versus stream */ mymhd_retcd retcd; struct MHD_Response *response; int indx; response = MHD_create_response_from_buffer (strlen(webui->resp_page) ,(void *)webui->resp_page, MHD_RESPMEM_PERSISTENT); if (!response) { MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO, _("Invalid response")); return MHD_NO; } if (webui->cnt != NULL) { if (ctrl) { for (indx = 0; indx < webui->cnt->webcontrol_headers->params_count; indx++) { retcd = MHD_add_response_header (response , webui->cnt->webcontrol_headers->params_array[indx].param_name , webui->cnt->webcontrol_headers->params_array[indx].param_value); if (retcd == MHD_NO) { MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO , _("Error adding webcontrol header %s %s") , webui->cnt->webcontrol_headers->params_array[indx].param_name , webui->cnt->webcontrol_headers->params_array[indx].param_value); } } if (webui->cnt->conf.webcontrol_interface == 1) { MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE, "text/plain;"); } else { MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE, "text/html"); } } else { for (indx = 0; indx < webui->cnt->stream_headers->params_count; indx++) { retcd = MHD_add_response_header (response , webui->cnt->stream_headers->params_array[indx].param_name , webui->cnt->stream_headers->params_array[indx].param_value); if (retcd == MHD_NO) { MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO , _("Error adding stream header %s %s") , webui->cnt->stream_headers->params_array[indx].param_name , webui->cnt->stream_headers->params_array[indx].param_value); } } if ((webui->cnct_type == WEBUI_CNCT_STATUS_LIST) || (webui->cnct_type == WEBUI_CNCT_STATUS_ONE)) { MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE, "application/json"); } else { MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE, "text/html"); } } } retcd = MHD_queue_response (webui->connection, MHD_HTTP_OK, response); MHD_destroy_response (response); return retcd; } static void webu_answer_strm_type(struct webui_ctx *webui) { /* Assign the type of stream that is being answered*/ if (mystreq(webui->uri_cmd1,"stream") || mystreq(webui->uri_camid,"stream") || (strlen(webui->uri_camid) == 0)) { webui->cnct_type = WEBUI_CNCT_FULL; } else if (mystreq(webui->uri_cmd1,"substream") || mystreq(webui->uri_camid,"substream")) { webui->cnct_type = WEBUI_CNCT_SUB; } else if (mystreq(webui->uri_cmd1,"motion") || mystreq(webui->uri_camid,"motion")) { webui->cnct_type = WEBUI_CNCT_MOTION; } else if (mystreq(webui->uri_cmd1,"source") || mystreq(webui->uri_camid,"source")) { webui->cnct_type = WEBUI_CNCT_SOURCE; } else if (mystreq(webui->uri_cmd1,"current") || mystreq(webui->uri_camid,"current")) { webui->cnct_type = WEBUI_CNCT_STATIC; } else if (mystreq(webui->uri_camid, "cameras.json") && strlen(webui->uri_cmd1) == 0) { webui->cnct_type = WEBUI_CNCT_STATUS_LIST; } else if (mystreq(webui->uri_cmd1, "cameras.json") && strlen(webui->uri_cmd2) == 0) { webui->cnct_type = WEBUI_CNCT_STATUS_LIST; } else if (mystreq(webui->uri_camid, "status.json") && strlen(webui->uri_cmd1) == 0) { webui->cnct_type = WEBUI_CNCT_STATUS_ONE; } else if (mystreq(webui->uri_cmd1, "status.json") && strlen(webui->uri_cmd2) == 0) { webui->cnct_type = WEBUI_CNCT_STATUS_ONE; } else if ((strlen(webui->uri_camid) > 0) && (strlen(webui->uri_cmd1) == 0)) { webui->cnct_type = WEBUI_CNCT_FULL; } else { webui->cnct_type = WEBUI_CNCT_UNKNOWN; } } static mymhd_retcd webu_answer_ctrl(void *cls, struct MHD_Connection *connection , const char *url, const char *method, const char *version , const char *upload_data, size_t *upload_data_size, void **ptr) { /* This function "answers" the request for a webcontrol.*/ mymhd_retcd retcd; struct webui_ctx *webui = *ptr; /* Eliminate compiler warnings */ (void)cls; (void)url; (void)version; (void)upload_data; (void)upload_data_size; /* Per MHD docs, this is called twice and we should process the second call */ if (webui->mhd_first) { webui->mhd_first = FALSE; return MHD_YES; } if (mystrne(method, "GET")) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Invalid Method requested: %s"),method); return MHD_NO; } webui->cnct_type = WEBUI_CNCT_CONTROL; util_threadname_set("wu", 0, NULL); webui->connection = connection; if (strlen(webui->clientip) == 0) { webu_clientip(webui); } if (webu_failauth_check(webui) == TRUE) { webu_badreq(webui); retcd = webu_mhd_send(webui, TRUE); return retcd; } /* Throw bad URLS back to user*/ if ((webui->cnt == NULL) || (strlen(webui->url) == 0)) { webu_badreq(webui); retcd = webu_mhd_send(webui, TRUE); return retcd; } if (webui->cnt->webcontrol_finish) { return MHD_NO; } webu_hostname(webui, TRUE); if (!webui->authenticated) { retcd = webu_mhd_auth(webui, TRUE); if (!webui->authenticated) { return retcd; } } webu_failauth_reset(webui); MOTION_LOG(INF,TYPE_ALL, NO_ERRNO, _("Connection from: %s"),webui->clientip); if ((webui->cntlst[0]->conf.webcontrol_interface == 1) || (webui->cntlst[0]->conf.webcontrol_interface == 2)) { webu_text_main(webui); } else { webu_html_main(webui); } retcd = webu_mhd_send(webui, TRUE); if (retcd == MHD_NO) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("send page failed %d"),retcd); } return retcd; } static mymhd_retcd webu_answer_strm(void *cls, struct MHD_Connection *connection , const char *url, const char *method, const char *version , const char *upload_data, size_t *upload_data_size, void **ptr) { /* Answer the request for all the streams*/ mymhd_retcd retcd; struct webui_ctx *webui = *ptr; /* Eliminate compiler warnings */ (void)cls; (void)url; (void)version; (void)upload_data; (void)upload_data_size; /* Per docs, this is called twice and we should process the second call */ if (webui->mhd_first) { webui->mhd_first = FALSE; return MHD_YES; } if (mystrne(method, "GET")) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Invalid Method requested: %s"),method); return MHD_NO; } util_threadname_set("st", 0, NULL); webui->connection = connection; if (strlen(webui->clientip) == 0) { webu_clientip(webui); } if (webu_failauth_check(webui) == TRUE) { webu_badreq(webui); retcd = webu_mhd_send(webui, FALSE); return retcd; } /* Throw bad URLS back to user*/ if ((webui->cnt == NULL) || (strlen(webui->url) == 0)) { webu_badreq(webui); retcd = webu_mhd_send(webui, FALSE); return retcd; } /* Do not answer a request until the motion loop has completed at least once. * Required for the Motioneye application */ if (webui->cnt->passflag == 0) { MOTION_LOG(DBG, TYPE_STREAM, NO_ERRNO, _("Stream picture is not ready yet")); return MHD_NO; } if (webui->cnt->webcontrol_finish) { MOTION_LOG(DBG, TYPE_STREAM, NO_ERRNO, _("Stream process requested to finish.")); return MHD_NO; } webu_hostname(webui, FALSE); if (!webui->authenticated) { retcd = webu_mhd_auth(webui, FALSE); if (!webui->authenticated) { return retcd; } } webu_failauth_reset(webui); MOTION_LOG(INF,TYPE_ALL, NO_ERRNO, _("Connection from: %s"),webui->clientip); webu_answer_strm_type(webui); retcd = 0; if ((webui->cnct_type == WEBUI_CNCT_STATUS_LIST) || (webui->cnct_type == WEBUI_CNCT_STATUS_ONE)) { webu_status_main(webui); retcd = webu_mhd_send(webui, FALSE); } else if (webui->cnct_type == WEBUI_CNCT_STATIC) { retcd = webu_stream_static(webui); if (retcd == MHD_NO) { webu_badreq(webui); retcd = webu_mhd_send(webui, FALSE); } } else if (webui->cnct_type != WEBUI_CNCT_UNKNOWN) { retcd = webu_stream_mjpeg(webui); if (retcd == MHD_NO) { webu_badreq(webui); retcd = webu_mhd_send(webui, FALSE); } } else { webu_badreq(webui); retcd = webu_mhd_send(webui, FALSE); } if (retcd == MHD_NO) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Send page failed.")); } return retcd; } static void *webu_mhd_init(void *cls, const char *uri, struct MHD_Connection *connection) { /* This is called at the very start of getting a request before the "answer" * is processed. There are two variations of this and the difference is how * we call the webu_context_init. When we are processing for the webcontrol or * the stream port specified in the motion.conf file, we pass into the init function * the full list of all the cameras. The other version of the init is used when the * user specifies a unique port for each camera. In this situation, the full list * context is passed in as a null and the context of the camera desired is passed * instead. * When this function is processed, we basically only have the URL that the user requested * so we initialize everything and then parse out the URL to determine what the user is * asking. */ struct context **cnt = cls; struct webui_ctx *webui; int retcd; (void)connection; /* Set the thread name to connection until we know whether control or stream answers*/ util_threadname_set("cn", 0,NULL); webui = malloc(sizeof(struct webui_ctx)); webu_context_init(cnt, NULL, webui); webui->mhd_first = TRUE; snprintf(webui->url,WEBUI_LEN_URLI,"%s",uri); retcd = webu_parseurl(webui); if (retcd != 0) { webu_parseurl_reset(webui); memset(webui->url,'\0',WEBUI_LEN_URLI); } webu_parms_edit(webui); return webui; } static void *webu_mhd_init_one(void *cls, const char *uri, struct MHD_Connection *connection) { /* This function initializes all the webui variables as we are getting a request. This * variation of the init is the one used when the user has specified a unique port number * for each camera. The variation is in how the webu_context_init is invoked. This passes * in a NULL for the full context list (webui->cntlist) and instead assigns the particular * camera context to webui->cnt */ struct context *cnt = cls; struct webui_ctx *webui; int retcd; (void)connection; /* Set the thread name to connection until we know whether control or stream answers*/ util_threadname_set("cn", 0,NULL); webui = malloc(sizeof(struct webui_ctx)); webu_context_init(NULL, cnt, webui); webui->mhd_first = TRUE; snprintf(webui->url,WEBUI_LEN_URLI,"%s",uri); retcd = webu_parseurl(webui); if (retcd != 0) { webu_parseurl_reset(webui); memset(webui->url,'\0',WEBUI_LEN_URLI); } webu_parms_edit(webui); return webui; } static void webu_mhd_deinit(void *cls, struct MHD_Connection *connection , void **con_cls, enum MHD_RequestTerminationCode toe) { /* This is the function called as the connection is closed so we free our webui variables*/ struct webui_ctx *webui = *con_cls; /* Eliminate compiler warnings */ (void)connection; (void)cls; (void)toe; if (webui->cnct_type == WEBUI_CNCT_FULL ) { webu_stream_deinit(webui, &webui->cnt->stream_norm); } else if (webui->cnct_type == WEBUI_CNCT_SUB ) { webu_stream_deinit(webui, &webui->cnt->stream_sub); } else if (webui->cnct_type == WEBUI_CNCT_MOTION ) { webu_stream_deinit(webui, &webui->cnt->stream_motion); } else if (webui->cnct_type == WEBUI_CNCT_SOURCE ) { webu_stream_deinit(webui, &webui->cnt->stream_source); } else if (webui->cnct_type == WEBUI_CNCT_STATIC ) { webu_stream_deinit(webui, &webui->cnt->stream_norm); } webu_context_free(webui); return; } static void webu_mhd_features_basic(struct mhdstart_ctx *mhdst) { /* Use the MHD function to see what features it supports*/ #if MHD_VERSION < 0x00094400 (void)mhdst; #else int retcd; retcd = MHD_is_feature_supported (MHD_FEATURE_BASIC_AUTH); if (retcd == MHD_YES) { MOTION_LOG(DBG, TYPE_STREAM, NO_ERRNO ,_("Basic authentication: available")); } else { if ((mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_auth_method == 1)) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Basic authentication: disabled")); mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_auth_method = 0; } else if ((!mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.stream_auth_method == 1)) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Basic authentication: disabled")); mhdst->cnt[mhdst->indxthrd]->conf.stream_auth_method = 0; } else { MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO ,_("Basic authentication: disabled")); } } #endif } static void webu_mhd_features_digest(struct mhdstart_ctx *mhdst) { /* Use the MHD function to see what features it supports*/ #if MHD_VERSION < 0x00094400 (void)mhdst; #else int retcd; retcd = MHD_is_feature_supported (MHD_FEATURE_DIGEST_AUTH); if (retcd == MHD_YES) { MOTION_LOG(DBG, TYPE_STREAM, NO_ERRNO ,_("Digest authentication: available")); } else { if ((mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_auth_method == 2)) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Digest authentication: disabled")); mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_auth_method = 0; } else if ((!mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.stream_auth_method == 2)) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Digest authentication: disabled")); mhdst->cnt[mhdst->indxthrd]->conf.stream_auth_method = 0; } else { MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO ,_("Digest authentication: disabled")); } } #endif } static void webu_mhd_features_ipv6(struct mhdstart_ctx *mhdst) { /* Use the MHD function to see what features it supports * If we have a really old version of MHD, then we will just support * IPv4 */ #if MHD_VERSION < 0x00094400 if (mhdst->ipv6) { MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO ,_("libmicrohttpd libary too old ipv6 disabled")); if (mhdst->ipv6) { mhdst->ipv6 = 0; } } #else int retcd; retcd = MHD_is_feature_supported (MHD_FEATURE_IPv6); if (retcd == MHD_YES) { MOTION_LOG(DBG, TYPE_STREAM, NO_ERRNO ,_("IPV6: available")); } else { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("IPV6: disabled")); if (mhdst->ipv6) { mhdst->ipv6 = 0; } } #endif } static void webu_mhd_features_tls(struct mhdstart_ctx *mhdst) { /* Use the MHD function to see what features it supports * If we have a really old version of MHD, then we will will not * support the ssl/tls request. */ #if MHD_VERSION < 0x00094400 if ((mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_tls)) { MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO ,_("libmicrohttpd libary too old SSL/TLS disabled")); mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_tls = 0; } else if ((!mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.stream_tls)) { MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO ,_("libmicrohttpd libary too old SSL/TLS disabled")); mhdst->cnt[mhdst->indxthrd]->conf.stream_tls = 0; } #else int retcd; retcd = MHD_is_feature_supported (MHD_FEATURE_SSL); if (retcd == MHD_YES) { MOTION_LOG(DBG, TYPE_STREAM, NO_ERRNO ,_("SSL/TLS: available")); } else { if ((mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_tls)) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("SSL/TLS: disabled")); mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_tls = 0; } else if ((!mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.stream_tls)) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("SSL/TLS: disabled")); mhdst->cnt[mhdst->indxthrd]->conf.stream_tls = 0; } else { MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO ,_("SSL/TLS: disabled")); } } #endif } static void webu_mhd_features(struct mhdstart_ctx *mhdst) { /* This function goes through at least a few of the MHD features * and adjusts the user parameters from the configuration as * needed to reflect what MHD can do */ webu_mhd_features_basic(mhdst); webu_mhd_features_digest(mhdst); webu_mhd_features_ipv6(mhdst); webu_mhd_features_tls(mhdst); } static char *webu_mhd_loadfile(const char *fname) { /* This function loads the requested certificate and key files into memory so we * can use them as needed if the user wants ssl/tls support. If the user did not * specify a file in the configuration, then we return NULL. */ FILE *infile; size_t file_size, read_size; char * file_char; if (fname == NULL) { file_char = NULL; } else { infile = myfopen(fname, "rbe"); if (infile != NULL) { fseek(infile, 0, SEEK_END); file_size = ftell(infile); if (file_size > 0 ) { file_char = mymalloc(file_size +1); fseek(infile, 0, SEEK_SET); read_size = fread(file_char, file_size, 1, infile); if (read_size > 0 ) { file_char[file_size] = 0; } else { free(file_char); file_char = NULL; MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO ,_("Error reading file for SSL/TLS support.")); } } else { file_char = NULL; } fclose(infile); } else { file_char = NULL; } } return file_char; } static void webu_mhd_checktls(struct mhdstart_ctx *mhdst) { /* This function validates that if the user requested a SSL/TLS connection, then * they also need to provide a certificate and key file. If those are not provided * then we revise the configuration request for ssl/tls */ if (mhdst->ctrl) { if (mhdst->cnt[0]->conf.webcontrol_tls) { if ((mhdst->cnt[0]->conf.webcontrol_cert == NULL) || (mhdst->tls_cert == NULL)) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("SSL/TLS requested but no cert file provided. SSL/TLS disabled")); mhdst->cnt[0]->conf.webcontrol_tls = 0; } if ((mhdst->cnt[0]->conf.webcontrol_key == NULL) || (mhdst->tls_key == NULL)) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("SSL/TLS requested but no key file provided. SSL/TLS disabled")); mhdst->cnt[0]->conf.webcontrol_tls = 0; } } } else { if (mhdst->cnt[mhdst->indxthrd]->conf.stream_tls) { if ((mhdst->cnt[0]->conf.webcontrol_cert == NULL) || (mhdst->tls_cert == NULL)) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("SSL/TLS requested but no cert file provided. SSL/TLS disabled")); mhdst->cnt[mhdst->indxthrd]->conf.stream_tls = 0; } if ((mhdst->cnt[0]->conf.webcontrol_key == NULL) || (mhdst->tls_key == NULL)) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("SSL/TLS requested but no key file provided. SSL/TLS disabled")); mhdst->cnt[mhdst->indxthrd]->conf.stream_tls = 0; } } } } static void webu_mhd_opts_init(struct mhdstart_ctx *mhdst) { /* This function sets the init function to use for the MHD connection. If * the connection is related to the webcontrol or the stream specified in the * motion.conf file, then we pass in the full context list of all cameras. If * the MHD connection is only going to be for a single camera (a unique port for * each camera), then we call a different init function which only wants the single * motion context for that particular camera. */ if ((!mhdst->ctrl) && (mhdst->indxthrd != 0)) { mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_URI_LOG_CALLBACK; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = (intptr_t)webu_mhd_init_one; mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = mhdst->cnt[mhdst->indxthrd]; mhdst->mhd_opt_nbr++; } else { mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_URI_LOG_CALLBACK; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = (intptr_t)webu_mhd_init; mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = mhdst->cnt; mhdst->mhd_opt_nbr++; } } static void webu_mhd_opts_deinit(struct mhdstart_ctx *mhdst) { /* Set the MHD option on the function to call when the connection closes */ mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_NOTIFY_COMPLETED; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = (intptr_t)webu_mhd_deinit; mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = NULL; mhdst->mhd_opt_nbr++; } static void webu_mhd_opts_localhost(struct mhdstart_ctx *mhdst) { /* Set the MHD option on the acceptable connections. This is used to handle the * motion configuation option of localhost only. */ if ((mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_localhost)) { if (mhdst->ipv6) { memset(&mhdst->lpbk_ipv6, 0, sizeof(struct sockaddr_in6)); mhdst->lpbk_ipv6.sin6_family = AF_INET6; mhdst->lpbk_ipv6.sin6_port = htons(mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_port); mhdst->lpbk_ipv6.sin6_addr = in6addr_loopback; mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_SOCK_ADDR; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = 0; mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = (struct sosockaddr *)(&mhdst->lpbk_ipv6); mhdst->mhd_opt_nbr++; } else { memset(&mhdst->lpbk_ipv4, 0, sizeof(struct sockaddr_in)); mhdst->lpbk_ipv4.sin_family = AF_INET; mhdst->lpbk_ipv4.sin_port = htons(mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_port); mhdst->lpbk_ipv4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_SOCK_ADDR; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = 0; mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = (struct sockaddr *)(&mhdst->lpbk_ipv4); mhdst->mhd_opt_nbr++; } } else if((!mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.stream_localhost)) { if (mhdst->ipv6) { memset(&mhdst->lpbk_ipv6, 0, sizeof(struct sockaddr_in6)); mhdst->lpbk_ipv6.sin6_family = AF_INET6; mhdst->lpbk_ipv6.sin6_port = htons(mhdst->cnt[mhdst->indxthrd]->conf.stream_port); mhdst->lpbk_ipv6.sin6_addr = in6addr_loopback; mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_SOCK_ADDR; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = 0; mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = (struct sosockaddr *)(&mhdst->lpbk_ipv6); mhdst->mhd_opt_nbr++; } else { memset(&mhdst->lpbk_ipv4, 0, sizeof(struct sockaddr_in)); mhdst->lpbk_ipv4.sin_family = AF_INET; mhdst->lpbk_ipv4.sin_port = htons(mhdst->cnt[mhdst->indxthrd]->conf.stream_port); mhdst->lpbk_ipv4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_SOCK_ADDR; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = 0; mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = (struct sockaddr *)(&mhdst->lpbk_ipv4); mhdst->mhd_opt_nbr++; } } } static void webu_mhd_opts_digest(struct mhdstart_ctx *mhdst) { /* Set the MHD option for the type of authentication that we will be using. This * function is when we are wanting to use digest authentication */ if (((mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_auth_method == 2)) || ((!mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.stream_auth_method == 2))) { if (mhdst->ctrl) { mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_DIGEST_AUTH_RANDOM; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = sizeof(mhdst->cnt[mhdst->indxthrd]->webcontrol_digest_rand); mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = mhdst->cnt[mhdst->indxthrd]->webcontrol_digest_rand; mhdst->mhd_opt_nbr++; } else { mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_DIGEST_AUTH_RANDOM; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = sizeof(mhdst->cnt[mhdst->indxthrd]->webstream_digest_rand); mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = mhdst->cnt[mhdst->indxthrd]->webstream_digest_rand; mhdst->mhd_opt_nbr++; } mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_NONCE_NC_SIZE; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = 300; mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = NULL; mhdst->mhd_opt_nbr++; mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_CONNECTION_TIMEOUT; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = (unsigned int) 120; mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = NULL; mhdst->mhd_opt_nbr++; } } static void webu_mhd_opts_tls(struct mhdstart_ctx *mhdst) { /* Set the MHD options needed when we want TLS connections */ if ((( mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_tls)) || ((!mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.stream_tls))) { mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_HTTPS_MEM_CERT; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = 0; mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = mhdst->tls_cert; mhdst->mhd_opt_nbr++; mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_HTTPS_MEM_KEY; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = 0; mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = mhdst->tls_key; mhdst->mhd_opt_nbr++; } } static void webu_mhd_opts(struct mhdstart_ctx *mhdst) { /* Set all the options we need based upon the motion configuration parameters*/ mhdst->mhd_opt_nbr = 0; webu_mhd_checktls(mhdst); webu_mhd_opts_deinit(mhdst); webu_mhd_opts_init(mhdst); webu_mhd_opts_localhost(mhdst); webu_mhd_opts_digest(mhdst); webu_mhd_opts_tls(mhdst); mhdst->mhd_ops[mhdst->mhd_opt_nbr].option = MHD_OPTION_END; mhdst->mhd_ops[mhdst->mhd_opt_nbr].value = 0; mhdst->mhd_ops[mhdst->mhd_opt_nbr].ptr_value = NULL; mhdst->mhd_opt_nbr++; } static void webu_mhd_flags(struct mhdstart_ctx *mhdst) { /* This sets the MHD startup flags based upon what user put into configuration */ mhdst->mhd_flags = MHD_USE_THREAD_PER_CONNECTION; if (mhdst->ipv6) { mhdst->mhd_flags = mhdst->mhd_flags | MHD_USE_DUAL_STACK; } if ((mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.webcontrol_tls)) { mhdst->mhd_flags = mhdst->mhd_flags | MHD_USE_SSL; } else if ((!mhdst->ctrl) && (mhdst->cnt[mhdst->indxthrd]->conf.stream_tls)) { mhdst->mhd_flags = mhdst->mhd_flags | MHD_USE_SSL; } } static void webu_start_ctrl(struct context **cnt) { /* This is the function that actually starts the MHD daemon for handling the webcontrol. * There are many options for MHD and they will vary depending upon what our Motion user * has requested in the configuration. There are many functions in this module to assign * these options and they are passed in a pointer to the mhdst variable so that they can * assign the correct values for MHD start up. Since this function is doing the webcontrol * we are only using thread 0 values. */ struct mhdstart_ctx mhdst; unsigned int randnbr; mhdst.tls_cert = webu_mhd_loadfile(cnt[0]->conf.webcontrol_cert); mhdst.tls_key = webu_mhd_loadfile(cnt[0]->conf.webcontrol_key); mhdst.ctrl = TRUE; mhdst.indxthrd = 0; mhdst.cnt = cnt; mhdst.ipv6 = cnt[0]->conf.webcontrol_ipv6; /* Set the rand number for webcontrol digest if needed */ srand(time(NULL)); randnbr = (unsigned int)(42000000.0 * rand() / (RAND_MAX + 1.0)); snprintf(cnt[0]->webcontrol_digest_rand ,sizeof(cnt[0]->webcontrol_digest_rand),"%d",randnbr); cnt[0]->webcontrol_daemon = NULL; if (cnt[0]->conf.webcontrol_port != 0 ) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Starting webcontrol on port %d") ,cnt[0]->conf.webcontrol_port); mhdst.mhd_ops = malloc(sizeof(struct MHD_OptionItem)*WEBUI_MHD_OPTS); webu_mhd_features(&mhdst); webu_mhd_opts(&mhdst); webu_mhd_flags(&mhdst); cnt[0]->webcontrol_daemon = MHD_start_daemon (mhdst.mhd_flags ,cnt[0]->conf.webcontrol_port ,NULL, NULL ,&webu_answer_ctrl, cnt ,MHD_OPTION_ARRAY, mhdst.mhd_ops ,MHD_OPTION_END); free(mhdst.mhd_ops); if (cnt[0]->webcontrol_daemon == NULL) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Unable to start MHD")); } else { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Started webcontrol on port %d") ,cnt[0]->conf.webcontrol_port); } } if (mhdst.tls_cert != NULL) { free(mhdst.tls_cert); } if (mhdst.tls_key != NULL) { free(mhdst.tls_key); } return; } static void webu_strm_ntc(struct context **cnt, int indxthrd) { int indx; if (indxthrd == 0 ) { if (cnt[1] != NULL) { indx = 1; while (cnt[indx] != NULL) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Started camera %d stream on port/camera_id %d/%d") ,cnt[indx]->camera_id ,cnt[indxthrd]->conf.stream_port ,cnt[indx]->camera_id); indx++; } } else { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Started camera %d stream on port %d") ,cnt[indxthrd]->camera_id,cnt[indxthrd]->conf.stream_port); } } else { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Started camera %d stream on port %d") ,cnt[indxthrd]->camera_id,cnt[indxthrd]->conf.stream_port); } } static void webu_start_strm(struct context **cnt) { /* This function starts up the daemon for the streams. It loops through * all of the camera context's provided and starts streams as requested. If * the thread number is zero, then it starts the full list stream context */ struct mhdstart_ctx mhdst; unsigned int randnbr; mhdst.tls_cert = webu_mhd_loadfile(cnt[0]->conf.webcontrol_cert); mhdst.tls_key = webu_mhd_loadfile(cnt[0]->conf.webcontrol_key); mhdst.ctrl = FALSE; mhdst.indxthrd = 0; mhdst.cnt = cnt; mhdst.ipv6 = cnt[0]->conf.webcontrol_ipv6; /* Set the rand number for webcontrol digest if needed */ srand(time(NULL)); randnbr = (unsigned int)(42000000.0 * rand() / (RAND_MAX + 1.0)); snprintf(cnt[0]->webstream_digest_rand ,sizeof(cnt[0]->webstream_digest_rand),"%d",randnbr); while (cnt[mhdst.indxthrd] != NULL) { cnt[mhdst.indxthrd]->webstream_daemon = NULL; if (cnt[mhdst.indxthrd]->conf.stream_port != 0 ) { if (mhdst.indxthrd == 0) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Starting all camera streams on port %d") ,cnt[mhdst.indxthrd]->conf.stream_port); } else { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Starting camera %d stream on port %d") ,cnt[mhdst.indxthrd]->camera_id ,cnt[mhdst.indxthrd]->conf.stream_port); } mhdst.mhd_ops= malloc(sizeof(struct MHD_OptionItem)*WEBUI_MHD_OPTS); webu_mhd_features(&mhdst); webu_mhd_opts(&mhdst); webu_mhd_flags(&mhdst); if (mhdst.indxthrd == 0) { cnt[mhdst.indxthrd]->webstream_daemon = MHD_start_daemon (mhdst.mhd_flags ,cnt[mhdst.indxthrd]->conf.stream_port ,NULL, NULL ,&webu_answer_strm, cnt ,MHD_OPTION_ARRAY, mhdst.mhd_ops ,MHD_OPTION_END); } else { cnt[mhdst.indxthrd]->webstream_daemon = MHD_start_daemon (mhdst.mhd_flags ,cnt[mhdst.indxthrd]->conf.stream_port ,NULL, NULL ,&webu_answer_strm, cnt[mhdst.indxthrd] ,MHD_OPTION_ARRAY, mhdst.mhd_ops ,MHD_OPTION_END); } free(mhdst.mhd_ops); if (cnt[mhdst.indxthrd]->webstream_daemon == NULL) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Unable to start stream for camera %d") ,cnt[mhdst.indxthrd]->camera_id); } else { webu_strm_ntc(cnt,mhdst.indxthrd); } } mhdst.indxthrd++; } if (mhdst.tls_cert != NULL) { free(mhdst.tls_cert); } if (mhdst.tls_key != NULL) { free(mhdst.tls_key); } return; } static void webu_start_ports(struct context **cnt) { /* Perform check for duplicate ports being specified. The config loading will * duplicate ports from the motion.conf file to all the cameras so we do not * log these duplicates to the user and instead just silently set them to zero */ int indx, indx2; if (cnt[0]->conf.webcontrol_port != 0) { indx = 0; while (cnt[indx] != NULL) { if ((cnt[0]->conf.webcontrol_port == cnt[indx]->conf.webcontrol_port) && (indx > 0)) { cnt[indx]->conf.webcontrol_port = 0; } if (cnt[0]->conf.webcontrol_port == cnt[indx]->conf.stream_port) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Duplicate port requested %d") ,cnt[indx]->conf.stream_port); cnt[indx]->conf.stream_port = 0; } indx++; } } /* Now check on the stream ports */ indx = 0; while (cnt[indx] != NULL) { if (cnt[indx]->conf.stream_port != 0) { indx2 = indx + 1; while (cnt[indx2] != NULL) { if (cnt[indx]->conf.stream_port == cnt[indx2]->conf.stream_port) { if (indx != 0) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Duplicate port requested %d") ,cnt[indx2]->conf.stream_port); } cnt[indx2]->conf.stream_port = 0; } indx2++; } } indx++; } } static void webu_start_failauth(struct context **cnt) { int indx; failauth = mymalloc(sizeof(struct failauth_ctx)); if (cnt[0]->conf.webcontrol_lock_max_ips <= 0) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO ,_("Invalid webcontrol_lock_max_ips. Setting equal to 25.")); cnt[0]->conf.webcontrol_lock_max_ips = 25; } failauth->lockout_max_ips = cnt[0]->conf.webcontrol_lock_max_ips; failauth->failauth_array = (struct failauth_item_ctx *)mymalloc( sizeof(struct failauth_item_ctx) * failauth->lockout_max_ips); failauth->count = failauth->lockout_max_ips; for (indx = 0; indx < failauth->count; indx++) { failauth->failauth_array[indx].clientip = NULL; failauth->failauth_array[indx].attempt_tm.tv_sec = 0; failauth->failauth_array[indx].attempt_tm.tv_usec = 0; failauth->failauth_array[indx].attempt_nbr = 0; } failauth->lockout_attempts = cnt[0]->conf.webcontrol_lock_attempts; failauth->lockout_minutes = cnt[0]->conf.webcontrol_lock_minutes; pthread_mutex_init(&failauth->mutex_failauth, NULL); } static void webu_stop_failauth(void) { int indx; for (indx = 0; indx < failauth->count; indx++) { if (failauth->failauth_array[indx].clientip != NULL) { free(failauth->failauth_array[indx].clientip); failauth->failauth_array[indx].clientip = NULL; } } if (failauth->failauth_array != NULL) { free(failauth->failauth_array); failauth->failauth_array = NULL; } pthread_mutex_destroy(&failauth->mutex_failauth); free(failauth); } void webu_stop(struct context **cnt) { /* This function is called from the main Motion loop to shutdown the * various MHD connections */ int indxthrd; if (cnt[0]->webcontrol_daemon != NULL) { cnt[0]->webcontrol_finish = TRUE; MHD_stop_daemon (cnt[0]->webcontrol_daemon); } indxthrd = 0; while (cnt[indxthrd] != NULL) { if (cnt[indxthrd]->webstream_daemon != NULL) { cnt[indxthrd]->webcontrol_finish = TRUE; MHD_stop_daemon (cnt[indxthrd]->webstream_daemon); } cnt[indxthrd]->webstream_daemon = NULL; cnt[indxthrd]->webcontrol_daemon = NULL; util_parms_free(cnt[indxthrd]->webcontrol_headers); if (cnt[indxthrd]->webcontrol_headers != NULL) { free(cnt[indxthrd]->webcontrol_headers); cnt[indxthrd]->webcontrol_headers = NULL; } util_parms_free(cnt[indxthrd]->stream_headers); if (cnt[indxthrd]->stream_headers != NULL) { free(cnt[indxthrd]->stream_headers); cnt[indxthrd]->stream_headers = NULL; } indxthrd++; } webu_stop_failauth(); } void webu_start(struct context **cnt) { /* This function is called from the main motion thread to start up the * webcontrol and streams. We need to block some signals otherwise MHD * will not function correctly. */ struct sigaction act; int indxthrd; /* set signal handlers TO IGNORE */ memset(&act, 0, sizeof(act)); sigemptyset(&act.sa_mask); act.sa_handler = SIG_IGN; sigaction(SIGPIPE, &act, NULL); sigaction(SIGCHLD, &act, NULL); indxthrd = 0; while (cnt[indxthrd] != NULL) { cnt[indxthrd]->webstream_daemon = NULL; cnt[indxthrd]->webcontrol_daemon = NULL; cnt[indxthrd]->webcontrol_finish = FALSE; cnt[indxthrd]->webcontrol_headers = mymalloc(sizeof(struct params_context)); cnt[indxthrd]->stream_headers = mymalloc(sizeof(struct params_context)); util_parms_parse(cnt[indxthrd]->webcontrol_headers , cnt[indxthrd]->conf.webcontrol_header_params , cnt[indxthrd]->conf.webcontrol_localhost); util_parms_parse(cnt[indxthrd]->stream_headers , cnt[indxthrd]->conf.stream_header_params , cnt[indxthrd]->conf.stream_localhost); cnt[indxthrd]->stream_headers->update_params = FALSE; cnt[indxthrd]->webcontrol_headers->update_params = FALSE; indxthrd++; } webu_start_ports(cnt); webu_start_failauth(cnt); webu_start_strm(cnt); webu_start_ctrl(cnt); return; } motion-release-4.6.0/src/webu.h000066400000000000000000000105571452402535500163630ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * webu.h * Headers associated with functions in the webu.c module. */ #ifndef _INCLUDE_WEBU_H_ #define _INCLUDE_WEBU_H_ /* Some defines of lengths for our buffers */ #define WEBUI_LEN_PARM 512 /* Parameters specified */ #define WEBUI_LEN_URLI 512 /* Maximum URL permitted */ #define WEBUI_LEN_RESP 1024 /* Initial response size */ #define WEBUI_MHD_OPTS 10 /* Maximum number of options permitted for MHD */ #define WEBUI_LEN_LNK 15 /* Maximum length for chars in strminfo */ enum WEBUI_CNCT{ WEBUI_CNCT_CONTROL = 0, WEBUI_CNCT_FULL = 1, WEBUI_CNCT_SUB = 2, WEBUI_CNCT_MOTION = 3, WEBUI_CNCT_SOURCE = 4, WEBUI_CNCT_STATIC = 5, WEBUI_CNCT_STATUS_LIST = 6, WEBUI_CNCT_STATUS_ONE = 7, WEBUI_CNCT_UNKNOWN = 99 }; struct webui_ctx { char *url; /* The URL sent from the client */ char *uri_camid; /* Parsed thread number from the url*/ char *uri_cmd1; /* Parsed command(action) from the url*/ char *uri_cmd2; /* Parsed command (set) from the url*/ char *uri_parm1; /* Parameter 1 for the command */ char *uri_value1; /* The value for parameter 1*/ char *uri_parm2; /* Parameter 2 for the command */ char *uri_value2; /* The value for parameter 2*/ char *hostname; /* Host name provided from header content*/ char hostproto[6]; /* Protocol for host http or https */ char *clientip; /* IP of the connecting client */ char *auth_denied; /* Denied access response to user*/ char *auth_opaque; /* Opaque string for digest authentication*/ char *auth_realm; /* Realm string for digest authentication*/ char *auth_user; /* Parsed user from config authentication string*/ char *auth_pass; /* Parsed password from config authentication string*/ int authenticated; /* Boolean for whether authentication has been passed */ int cam_count; /* Count of the number of cameras*/ int cam_threads; /* Count of the number of camera threads running*/ char *lang; /* Two character abbreviation for locale language*/ char *lang_full; /* Five character abbreviation for language-country*/ int thread_nbr; /* Thread number provided from the uri */ char *text_eol; /* End of line for text interface either
or "" */ enum WEBUI_CNCT cnct_type; /* Type of connection we are processing */ char *resp_page; /* The response that will be sent */ size_t resp_size; /* The allocated size of the response */ size_t resp_used; /* The amount of the response page used */ uint64_t stream_pos; /* Stream position of sent image */ int stream_fps; /* Stream rate per second */ struct timeval time_last; /* Keep track of processing time for stream thread*/ int mhd_first; /* Boolean for whether it is the first connection*/ struct MHD_Connection *connection; /* The MHD connection value from the client */ struct context **cntlst; /* The context list of all cameras */ struct context *cnt; /* The context information for the camera requested */ }; void webu_start(struct context **cnt); void webu_stop(struct context **cnt); void webu_process_action(struct webui_ctx *webui); int webu_process_config(struct webui_ctx *webui); int webu_process_track(struct webui_ctx *webui); void webu_write(struct webui_ctx *webui, const char *buf); #endif motion-release-4.6.0/src/webu_html.c000066400000000000000000001376631452402535500174120ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * webu_html.c * * Create the html for the webcontrol page * * Functional naming scheme * webu_html* - Functions that create the display webcontrol page. * webu_html_main - Entry point from webu_ans_ctrl(in webu.c) * webu_html_page - Create the web page * webu_html_head - Header section of the page * webu_html_style* - The style section of the web page * webu_html_body - Calls all the functions to create the body * webu_html_navbar* - The navbar section of the web page * webu_html_config* - config parms of page * webu_html_track* - Tracking functions * webu_html_script* - The javascripts of the web page * * To debug, run code, open page, view source and make copy of html * into a local file to revise changes then determine applicable section(s) * in this code to modify to match modified version. * Known HTML Issues: * Single and double quotes are not consistently used. * HTML ids do not follow any naming convention. * After clicking restart, do something...Try to connect again? * * Additional functionality considerations: * Notification to user of items that require restart when changed. * Notification to user that item successfully implemented (config change/tracking) * List motion parms somewhere so they can be found by xgettext * */ #include "motion.h" #include "util.h" #include "logger.h" #include "webu.h" #include "webu_html.h" #include "translate.h" /* struct to save information regarding the links to include in html page */ struct strminfo_ctx { struct context **cntlst; char lnk_ref[WEBUI_LEN_LNK]; char lnk_src[WEBUI_LEN_LNK]; char lnk_camid[WEBUI_LEN_LNK]; char proto[WEBUI_LEN_LNK]; int port; int motion_images; }; static void webu_html_style_navbar(struct webui_ctx *webui) { /* Write out the style section of the web page */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " .navbar {\n" " overflow: hidden;\n" " background-color: #333;\n" " font-family: Arial;\n" " }\n" " .navbar a {\n" " float: left;\n" " font-size: 16px;\n" " color: white;\n" " text-align: center;\n" " padding: 14px 16px;\n" " text-decoration: none;\n" " }\n" " .navbar a:hover, {\n" " background-color: darkgray;\n" " }\n"); webu_write(webui, response); } static void webu_html_style_dropdown(struct webui_ctx *webui) { /* Write out the style section of the web page */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " .dropdown {\n" " float: left;\n" " overflow: hidden;\n" " }\n" " .dropdown .dropbtn {\n" " font-size: 16px;\n" " border: none;\n" " outline: none;\n" " color: white;\n" " padding: 14px 16px;\n" " background-color: inherit;\n" " font-family: inherit;\n" " margin: 0;\n" " }\n" " .dropdown-content {\n" " display: none;\n" " position: absolute;\n" " background-color: #f9f9f9;\n" " min-width: 160px;\n" " box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);\n" " z-index: 1;\n" " }\n" " .dropdown-content a {\n" " float: none;\n" " color: black;\n" " padding: 12px 16px;\n" " text-decoration: none;\n" " display: block;\n" " text-align: left;\n" " }\n" " .dropdown-content a:hover {\n" " background-color: lightgray;\n" " }\n" " .dropdown:hover .dropbtn {\n" " background-color: darkgray;\n" " }\n" " .border {\n" " border-width: 2px;\n" " border-color: white;\n" " border-style: solid;\n" " }\n"); webu_write(webui, response); } static void webu_html_style_input(struct webui_ctx *webui) { /* Write out the style section of the web page */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " input , select {\n" " width: 25%;\n" " padding: 5px;\n" " margin: 0;\n" " display: inline-block;\n" " border: 1px solid #ccc;\n" " border-radius: 4px;\n" " box-sizing: border-box;\n" " height: 50%;\n" " font-size: 75%;\n" " margin-bottom: 5px;\n" " }\n" " .frm-input{\n" " text-align:center;\n" " }\n"); webu_write(webui, response); } static void webu_html_style_base(struct webui_ctx *webui) { /* Write out the style section of the web page */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " * {margin: 0; padding: 0; }\n" " body {\n" " padding: 0;\n" " margin: 0;\n" " font-family: Arial, Helvetica, sans-serif;\n" " font-size: 16px;\n" " line-height: 1;\n" " color: #606c71;\n" " background-color: #159957;\n" " background-image: linear-gradient(120deg, #155799, #159957);\n" " margin-left:0.5% ;\n" " margin-right:0.5% ;\n" " width: device-width ;\n" " }\n" " img {\n" " max-width: 100%;\n" " max-height: 100%;\n" " height: auto;\n" " }\n" " .page-header {\n" " color: #fff;\n" " text-align: center;\n" " margin-top: 0rem;\n" " margin-bottom: 0rem;\n" " font-weight: normal;\n" " }\n"); webu_write(webui, response); snprintf(response, sizeof (response),"%s", " .page-header h4 {\n" " height: 2px;\n" " padding: 0;\n" " margin: 1rem 0;\n" " border: 0;\n" " }\n" " .main-content {\n" " background-color: #000000;\n" " text-align: center;\n" " margin-top: 0rem;\n" " margin-bottom: 0rem;\n" " font-weight: normal;\n" " font-size: 0.90em;\n" " }\n" " .header-right{\n" " float: right;\n" " color: white;\n" " }\n" " .header-center {\n" " text-align: center;\n" " color: white;\n" " margin-top: 10px;\n" " margin-bottom: 10px;\n" " }\n"); webu_write(webui, response); } static void webu_html_style(struct webui_ctx *webui) { /* Write out the style section of the web page */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " \n"); webu_write(webui, response); } static void webu_html_head(struct webui_ctx *webui) { /* Write out the header section of the web page */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s","\n" " \n" " Motion\n" " \n"); webu_write(webui, response); webu_html_style(webui); snprintf(response, sizeof (response),"%s", "\n"); webu_write(webui, response); } static void webu_html_navbar_camera(struct webui_ctx *webui) { /*Write out the options included in the camera dropdown */ char response[WEBUI_LEN_RESP]; int indx; if (webui->cam_threads == 1) { /* Only Motion.conf file */ if (webui->cntlst[0]->conf.camera_name == NULL) { snprintf(response, sizeof (response), "

\n" " \n" "
\n" " %s 1\n" ,_("Cameras") ,webui->cntlst[0]->camera_id ,_("Camera")); webu_write(webui, response); } else { snprintf(response, sizeof (response), "
\n" " \n" "
\n" " %s\n" ,_("Cameras") ,webui->cntlst[0]->camera_id ,webui->cntlst[0]->conf.camera_name); webu_write(webui, response); } } else if (webui->cam_threads > 1) { /* Motion.conf + separate camera.conf file */ snprintf(response, sizeof (response), "
\n" " \n" "
\n" " %s\n" ,_("Cameras") ,_("All")); webu_write(webui, response); for (indx=1;indx <= webui->cam_count;indx++) { if (webui->cntlst[indx]->conf.camera_name == NULL) { snprintf(response, sizeof (response), " %s %d\n" ,webui->cntlst[indx]->camera_id , _("Camera"), webui->cntlst[indx]->camera_id); } else { snprintf(response, sizeof (response), " %s\n" ,webui->cntlst[indx]->camera_id ,webui->cntlst[indx]->conf.camera_name ); } webu_write(webui, response); } } snprintf(response, sizeof (response),"%s", "
\n" "
\n"); webu_write(webui, response); } static void webu_html_navbar_action(struct webui_ctx *webui) { /* Write out the options included in the actions dropdown*/ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response), "
\n" " \n" "
\n" " %s\n" " %s\n" " %s\n" " %s\n" " %s\n" " %s\n" " %s\n" " %s\n" " %s\n" " %s\n" "
\n" "
\n" ,_("Action") ,_("Start Event") ,_("End Event") ,_("Snapshot") ,_("Change Configuration") ,_("Write Configuration") ,_("Tracking") ,_("Pause") ,_("Start") ,_("Restart") ,_("Quit")); webu_write(webui, response); } static void webu_html_navbar(struct webui_ctx *webui) { /* Write the navbar section*/ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", "
\n"); webu_write(webui, response); webu_html_navbar_camera(webui); webu_html_navbar_action(webui); snprintf(response, sizeof (response), " %s\n" "

Motion "VERSION"

\n" "
\n" ,_("Help")); webu_write(webui, response); } static void webu_html_config_notice(struct webui_ctx *webui) { /* Print out the header description of which parameters are included based upon the * webcontrol_parms that was specified */ char response[WEBUI_LEN_RESP]; if (webui->cntlst[0]->conf.webcontrol_parms == 0) { snprintf(response, sizeof (response), "

webcontrol_parms = 0 (%s)

\n" ,_("No Configuration Options")); } else if (webui->cntlst[0]->conf.webcontrol_parms == 1) { snprintf(response, sizeof (response), "

webcontrol_parms = 1 (%s)

\n" ,_("Limited Configuration Options")); } else if (webui->cntlst[0]->conf.webcontrol_parms == 2) { snprintf(response, sizeof (response), "

webcontrol_parms = 2 (%s)

\n" ,_("Advanced Configuration Options")); } else{ snprintf(response, sizeof (response), "

webcontrol_parms = 3 (%s)

\n" ,_("Restricted Configuration Options")); } webu_write(webui, response); } static void webu_html_h3desc(struct webui_ctx *webui) { /* Write out the status description for the camera */ char response[WEBUI_LEN_RESP]; if (webui->cam_threads == 1) { snprintf(response, sizeof (response), "
\n" "

%s (%s)

\n" "
\n" ,_("All Cameras") ,(!webui->cntlst[0]->running)? _("Not running") : (webui->cntlst[0]->lost_connection)? _("Lost connection"): (webui->cntlst[0]->pause)? _("Paused"):_("Active") ); webu_write(webui,response); } else { snprintf(response, sizeof (response), "
\n" "

%s

\n" "
\n" ,_("All Cameras")); webu_write(webui,response); } } static void webu_html_config(struct webui_ctx *webui) { /* Write out the options to put into the config dropdown * We use html data attributes to store the values for the options * We always set a cam_all00 attribute and if the value if different for * any of our cameras, then we also add a cam_xxxxx which has the config * value for camera xxxxx The javascript then decodes these to display */ char response[WEBUI_LEN_RESP]; int indx_parm, indx, diff_vals; const char *val_main, *val_thread; char *val_temp; snprintf(response, sizeof (response),"%s", "
\n"); webu_write(webui, response); webu_html_config_notice(webui); snprintf(response, sizeof (response), "
\n" " \n" " \n" " \n" "
\n" "
\n" ,_("Save")); webu_write(webui, response); } static void webu_html_track(struct webui_ctx *webui) { /* Write the section for handling the tracking function */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response), " \n" ,_("Pan/Tilt") ,_("Absolute Change") ,_("Center") ,_("Pan") ,_("Tilt") ,_("Save")); webu_write(webui, response); } static void webu_html_strminfo(struct strminfo_ctx *strm_info, int indx) { /* This determines all the items we need to know to specify links and * stream sources for the page. The options are 0-3 as of this writing * where 0 = full streams, 1 = substreams, 2 = static images and 3 is * the legacy code for creating streams. So we need to assign not only * what images are to be sent but also whether we have tls/ssl. * There are WAY too many options for this. */ /* If using the main port,we need to insert a thread number into url*/ if (strm_info->cntlst[0]->conf.stream_port != 0) { snprintf(strm_info->lnk_camid,WEBUI_LEN_LNK,"/%d" ,strm_info->cntlst[indx]->camera_id); strm_info->port = strm_info->cntlst[0]->conf.stream_port; if (strm_info->cntlst[0]->conf.stream_tls) { snprintf(strm_info->proto,WEBUI_LEN_LNK,"%s","https"); } else { snprintf(strm_info->proto,WEBUI_LEN_LNK,"%s","http"); } } else { snprintf(strm_info->lnk_camid,WEBUI_LEN_LNK,"%s",""); strm_info->port = strm_info->cntlst[indx]->conf.stream_port; if (strm_info->cntlst[indx]->conf.stream_tls) { snprintf(strm_info->proto,WEBUI_LEN_LNK,"%s","https"); } else { snprintf(strm_info->proto,WEBUI_LEN_LNK,"%s","http"); } } if (strm_info->motion_images) { snprintf(strm_info->lnk_ref,WEBUI_LEN_LNK,"%s","/motion"); snprintf(strm_info->lnk_src,WEBUI_LEN_LNK,"%s","/motion"); } else { /* Assign what images and links we want */ if (strm_info->cntlst[indx]->conf.stream_preview_method == 1) { /* Substream for preview */ snprintf(strm_info->lnk_ref,WEBUI_LEN_LNK,"%s","/stream"); snprintf(strm_info->lnk_src,WEBUI_LEN_LNK,"%s","/substream"); } else if (strm_info->cntlst[indx]->conf.stream_preview_method == 2) { /* Static image for preview */ snprintf(strm_info->lnk_ref,WEBUI_LEN_LNK,"%s","/stream"); snprintf(strm_info->lnk_src,WEBUI_LEN_LNK,"%s","/current"); } else if (strm_info->cntlst[indx]->conf.stream_preview_method == 4) { /* Source image for preview */ snprintf(strm_info->lnk_ref,WEBUI_LEN_LNK,"%s","/source"); snprintf(strm_info->lnk_src,WEBUI_LEN_LNK,"%s","/source"); } else { /* Full stream for preview (method 0 or 3)*/ snprintf(strm_info->lnk_ref,WEBUI_LEN_LNK,"%s","/stream"); snprintf(strm_info->lnk_src,WEBUI_LEN_LNK,"%s","/stream"); } } } static void webu_html_preview(struct webui_ctx *webui) { /* Write the initial version of the preview section. The javascript * will change this section when user selects a different camera */ char response[WEBUI_LEN_RESP]; int indx, indx_st, preview_scale; struct strminfo_ctx strm_info; strm_info.cntlst = webui->cntlst; snprintf(response, sizeof (response),"%s", "
\n" "
\n" "
\n" "

\n"); webu_write(webui, response); if (webui->cam_threads == 1) { indx_st = 0; } else { indx_st = 1; } for (indx = indx_st; indxcam_threads; indx++) { if (webui->cntlst[indx]->conf.stream_preview_newline) { snprintf(response, sizeof (response),"%s","
\n"); webu_write(webui, response); } if (webui->cntlst[indx]->conf.stream_preview_method == 3) { preview_scale = 45; } else { preview_scale = webui->cntlst[indx]->conf.stream_preview_scale; } strm_info.motion_images = FALSE; webu_html_strminfo(&strm_info,indx); snprintf(response, sizeof (response), " " " \n" ,strm_info.proto, webui->hostname, strm_info.port ,strm_info.lnk_camid, strm_info.lnk_ref ,strm_info.proto, webui->hostname, strm_info.port ,strm_info.lnk_camid, strm_info.lnk_src ,preview_scale); webu_write(webui, response); if (webui->cntlst[indx]->conf.stream_preview_method == 3) { strm_info.motion_images = TRUE; webu_html_strminfo(&strm_info,indx); snprintf(response, sizeof (response), " " " \n" ,strm_info.proto, webui->hostname, strm_info.port ,strm_info.lnk_camid, strm_info.lnk_ref ,strm_info.proto, webui->hostname, strm_info.port ,strm_info.lnk_camid, strm_info.lnk_src ,preview_scale); webu_write(webui, response); } } snprintf(response, sizeof (response),"%s", "

\n" "
\n" "
\n" "
\n"); webu_write(webui, response); } static void webu_html_script_action(struct webui_ctx *webui) { /* Write the javascript action_click() function. * We do not have a good notification section on the page so the successful * submission and response is currently a empty if block for the future * enhancement to somehow notify the user everything worked */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " function event_reloadpage() {\n" " window.location.reload();\n" " }\n\n" ); webu_write(webui, response); snprintf(response, sizeof (response),"%s", " function action_click(actval) {\n" " if (actval == \"config\") {\n" " document.getElementById('trk_form').style.display=\"none\";\n" " document.getElementById('cfg_form').style.display=\"inline\";\n" " } else if (actval == \"track\") {\n" " document.getElementById('cfg_form').style.display=\"none\";\n" " document.getElementById('trk_form').style.display=\"inline\";\n" " } else {\n" " document.getElementById('cfg_form').style.display=\"none\";\n" " document.getElementById('trk_form').style.display=\"none\";\n" " var camstr = document.getElementById('h3_cam').getAttribute('data-cam');\n" " var camnbr = camstr.substring(4,9);\n" " var http = new XMLHttpRequest();\n" " if ((actval == \"/detection/pause\") || (actval == \"/detection/start\")) {\n" " http.addEventListener('load', event_reloadpage); \n" " }\n" ); webu_write(webui, response); snprintf(response, sizeof (response), " var url = \"%s://%s:%d/\"; \n" ,webui->hostproto, webui->hostname ,webui->cntlst[0]->conf.webcontrol_port); webu_write(webui, response); snprintf(response, sizeof (response), " if (camnbr == \"all00\") {\n" " url = url + \"%05d\";\n" " } else {\n" " url = url + camnbr;\n" " }\n" " url = url + actval;\n" ,webui->cntlst[0]->camera_id); webu_write(webui, response); snprintf(response, sizeof (response),"%s", " http.open(\"GET\", url, true);\n" " http.onreadystatechange = function() {\n" " if(http.readyState == 4 && http.status == 200) {\n" " }\n" " }\n" " http.send(null);\n" " }\n" " document.getElementById('act_btn').style.display=\"none\"; \n" " document.getElementById('cfg_value').value = '';\n" " document.getElementById('cfg_parms').value = 'default';\n" " }\n\n"); webu_write(webui, response); } static void webu_html_script_camera_thread(struct webui_ctx *webui) { /* Write the javascript thread IF conditions of camera_click() function */ char response[WEBUI_LEN_RESP]; int indx, indx_st, preview_scale; struct strminfo_ctx strm_info; if (webui->cam_threads == 1) { indx_st = 0; } else { indx_st = 1; } strm_info.cntlst = webui->cntlst; for (indx = indx_st; indxcam_threads; indx++) { snprintf(response, sizeof (response), " if (camid == \"cam_%05d\") {\n" ,webui->cntlst[indx]->camera_id); webu_write(webui, response); if (webui->cntlst[indx]->conf.stream_preview_method == 3) { preview_scale = 45; } else { preview_scale = 95; } strm_info.motion_images = FALSE; webu_html_strminfo(&strm_info, indx); snprintf(response, sizeof (response), " preview=\" " " \" \n" ,strm_info.proto, webui->hostname, strm_info.port ,strm_info.lnk_camid, strm_info.lnk_ref ,strm_info.proto, webui->hostname,strm_info.port ,strm_info.lnk_camid, strm_info.lnk_src, preview_scale); webu_write(webui, response); if (webui->cntlst[indx]->conf.stream_preview_method == 3) { strm_info.motion_images = TRUE; webu_html_strminfo(&strm_info, indx); snprintf(response, sizeof (response), " preview=preview + \" " " \" \n" ,strm_info.proto, webui->hostname, strm_info.port ,strm_info.lnk_camid, strm_info.lnk_ref ,strm_info.proto, webui->hostname,strm_info.port ,strm_info.lnk_camid, strm_info.lnk_src, preview_scale); webu_write(webui, response); } if (webui->cntlst[indx]->conf.camera_name == NULL) { snprintf(response, sizeof (response), " header=\"

%s %d (%s)

\"\n" ,_("Camera") , webui->cntlst[indx]->camera_id ,(!webui->cntlst[indx]->running)? _("Not running") : (webui->cntlst[indx]->lost_connection)? _("Lost connection"): (webui->cntlst[indx]->pause)? _("Paused"):_("Active") ); } else { snprintf(response, sizeof (response), " header=\"

%s (%s)

\"\n" , webui->cntlst[indx]->conf.camera_name ,(!webui->cntlst[indx]->running)? _("Not running") : (webui->cntlst[indx]->lost_connection)? _("Lost connection"): (webui->cntlst[indx]->pause)? _("Paused"):_("Active") ); } webu_write(webui, response); snprintf(response, sizeof (response),"%s"," }\n"); webu_write(webui, response); } return; } static void webu_html_script_camera_all(struct webui_ctx *webui) { /* Write the javascript "All" IF condition of camera_click() function */ char response[WEBUI_LEN_RESP]; int indx, indx_st, preview_scale; struct strminfo_ctx strm_info; if (webui->cam_threads == 1) { indx_st = 0; } else { indx_st = 1; } strm_info.cntlst = webui->cntlst; snprintf(response, sizeof (response), " if (camid == \"cam_all00\") {\n"); webu_write(webui, response); for (indx = indx_st; indxcam_threads; indx++) { if (indx == indx_st) { snprintf(response, sizeof (response),"%s"," preview = \"\";\n"); webu_write(webui, response); } if (webui->cntlst[indx]->conf.stream_preview_newline) { snprintf(response, sizeof (response),"%s"," preview = preview + \"
\";\n"); webu_write(webui, response); } if (webui->cntlst[indx]->conf.stream_preview_method == 3) { preview_scale = 45; } else { preview_scale = webui->cntlst[indx]->conf.stream_preview_scale; } strm_info.motion_images = FALSE; webu_html_strminfo(&strm_info, indx); snprintf(response, sizeof (response), " preview = preview + \" " " \"; \n" ,strm_info.proto, webui->hostname, strm_info.port ,strm_info.lnk_camid, strm_info.lnk_ref ,strm_info.proto, webui->hostname, strm_info.port ,strm_info.lnk_camid, strm_info.lnk_src ,preview_scale); webu_write(webui, response); if (webui->cntlst[indx]->conf.stream_preview_method == 3) { strm_info.motion_images = TRUE; webu_html_strminfo(&strm_info, indx); snprintf(response, sizeof (response), " preview = preview + \" " " \"; \n" ,strm_info.proto, webui->hostname, strm_info.port ,strm_info.lnk_camid, strm_info.lnk_ref ,strm_info.proto, webui->hostname, strm_info.port ,strm_info.lnk_camid, strm_info.lnk_src ,preview_scale); webu_write(webui, response); } } snprintf(response, sizeof (response), " header=\"

%s

\"\n" " }\n" ,_("All Cameras")); webu_write(webui, response); return; } static void webu_html_script_camera(struct webui_ctx *webui) { /* Write the javascript camera_click() function */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " function camera_click(camid) {\n" " var preview = \"\";\n" " var header = \"\";\n"); webu_write(webui, response); webu_html_script_camera_thread(webui); webu_html_script_camera_all(webui); snprintf(response, sizeof (response),"%s", " document.getElementById(\"id_preview\").innerHTML = preview; \n" " document.getElementById(\"id_header\").innerHTML = header; \n" " document.getElementById('cfg_form').style.display=\"none\"; \n" " document.getElementById('trk_form').style.display=\"none\"; \n" " document.getElementById('cam_btn').style.display=\"none\"; \n" " document.getElementById('cfg_value').value = '';\n" " document.getElementById('cfg_parms').value = 'default';\n" " }\n\n"); webu_write(webui, response); } static void webu_html_script_menucam(struct webui_ctx *webui) { /* Write the javascript display_cameras() function */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " function display_cameras() {\n" " document.getElementById('act_btn').style.display = 'none';\n" " if (document.getElementById('cam_btn').style.display == 'block') {\n" " document.getElementById('cam_btn').style.display = 'none';\n" " } else {\n" " document.getElementById('cam_btn').style.display = 'block';\n" " }\n" " }\n\n"); webu_write(webui, response); } static void webu_html_script_menuact(struct webui_ctx *webui) { /* Write the javascript display_actions() function */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " function display_actions() {\n" " document.getElementById('cam_btn').style.display = 'none';\n" " if (document.getElementById('act_btn').style.display == 'block') {\n" " document.getElementById('act_btn').style.display = 'none';\n" " } else {\n" " document.getElementById('act_btn').style.display = 'block';\n" " }\n" " }\n\n"); webu_write(webui, response); } static void webu_html_script_evtclk(struct webui_ctx *webui) { /* Write the javascript 'click' EventListener */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " document.addEventListener('click', function(event) {\n" " const dropCam = document.getElementById('cam_drop');\n" " const dropAct = document.getElementById('act_drop');\n" " if (!dropCam.contains(event.target) && !dropAct.contains(event.target)) {\n" " document.getElementById('cam_btn').style.display = 'none';\n" " document.getElementById('act_btn').style.display = 'none';\n" " }\n" " });\n\n"); webu_write(webui, response); } static void webu_html_script_cfgclk(struct webui_ctx *webui) { /* Write the javascript config_click function * We do not have a good notification section on the page so the successful * submission and response is currently a empty if block for the future * enhancement to somehow notify the user everything worked */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " function config_click() {\n" " var camstr = document.getElementById('h3_cam').getAttribute('data-cam');\n" " var camnbr = camstr.substring(4,9);\n" " var opts = document.getElementById('cfg_parms');\n" " var optsel = opts.options[opts.selectedIndex].value;\n" " var baseval = document.getElementById('cfg_value').value;\n" " var http = new XMLHttpRequest();\n"); webu_write(webui, response); snprintf(response, sizeof (response), " var url = \"%s://%s:%d/\"; \n" ,webui->hostproto, webui->hostname ,webui->cntlst[0]->conf.webcontrol_port); webu_write(webui, response); snprintf(response, sizeof (response), " var optval=encodeURI(baseval);\n" " if (camnbr == \"all00\") {\n" " url = url + \"%05d\";\n" " } else {\n" " url = url + camnbr;\n" " }\n" ,webui->cntlst[0]->camera_id); webu_write(webui, response); snprintf(response, sizeof (response),"%s", " url = url + \"/config/set?\" + optsel + \"=\" + optval;\n" " http.open(\"GET\", url, true);\n" " http.onreadystatechange = function() {\n" " if(http.readyState == 4 && http.status == 200) {\n" " }\n" " }\n" " http.send(null);\n" " document.getElementById('cfg_value').value = \"\";\n" " opts.options[opts.selectedIndex].setAttribute('data-'+camstr,baseval);\n" " opts.value = 'default';\n" " }\n\n"); webu_write(webui, response); } static void webu_html_script_cfgchg(struct webui_ctx *webui) { /* Write the javascript option_change function */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " function config_change() {\n" " var camSel = 'data-'+ document.getElementById('h3_cam').getAttribute('data-cam');\n" " var opts = document.getElementById('cfg_parms');\n" " var optval = opts.options[opts.selectedIndex].getAttribute(camSel);\n" " if (optval == null) {\n" " optval = opts.options[opts.selectedIndex].getAttribute('data-cam_all00');\n" " }\n" " document.getElementById('cfg_value').value = optval;\n" " }\n\n"); webu_write(webui, response); } static void webu_html_script_trkchg(struct webui_ctx *webui) { char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " function track_change() {\n" " var opts = document.getElementById('trk_option');\n" " var optval = opts.options[opts.selectedIndex].getAttribute('data-trk');\n" " if (optval == 'pan') {\n" " document.getElementById('trk_panx').disabled=false;\n" " document.getElementById('trk_tilty').disabled = false;\n" " document.getElementById('trk_lblx').style.display='none';\n" " document.getElementById('trk_lbly').style.display='none';\n" " document.getElementById('trk_lblpan').style.display='inline';\n" " document.getElementById('trk_lbltilt').style.display='inline';\n"); webu_write(webui, response); snprintf(response, sizeof (response),"%s", " } else if (optval =='abs') {\n" " document.getElementById('trk_panx').disabled=false;\n" " document.getElementById('trk_tilty').disabled = false;\n" " document.getElementById('trk_lblx').value = 'X';\n" " document.getElementById('trk_lbly').value = 'Y';\n" " document.getElementById('trk_lblpan').style.display='none';\n" " document.getElementById('trk_lbltilt').style.display='none';\n" " document.getElementById('trk_lblx').style.display='inline';\n" " document.getElementById('trk_lbly').style.display='inline';\n"); webu_write(webui, response); snprintf(response, sizeof (response),"%s", " } else {\n" " document.getElementById('cfg_form').style.display='none';\n" " document.getElementById('trk_panx').disabled=true;\n" " document.getElementById('trk_tilty').disabled = true;\n" " }\n" " }\n\n"); webu_write(webui, response); } static void webu_html_script_trkclk(struct webui_ctx *webui) { char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " function track_click() {\n" " var camstr = document.getElementById('h3_cam').getAttribute('data-cam');\n" " var camnbr = camstr.substring(4,9);\n" " var opts = document.getElementById('trk_option');\n" " var optsel = opts.options[opts.selectedIndex].getAttribute('data-trk');\n" " var optval1 = document.getElementById('trk_panx').value;\n" " var optval2 = document.getElementById('trk_tilty').value;\n" " var http = new XMLHttpRequest();\n"); webu_write(webui, response); snprintf(response, sizeof (response), " var url = \"%s://%s:%d/\"; \n" ,webui->hostproto, webui->hostname ,webui->cntlst[0]->conf.webcontrol_port); webu_write(webui, response); snprintf(response, sizeof (response), " if (camnbr == \"all00\") {\n" " url = url + \"%05d\";\n" " } else {\n" " url = url + camnbr;\n" " }\n" ,webui->cntlst[0]->camera_id); webu_write(webui, response); snprintf(response, sizeof (response),"%s", " if (optsel == 'pan') {\n" " url = url + '/track/set?pan=' + optval1 + '&tilt=' + optval2;\n" " } else if (optsel == 'abs') {\n" " url = url + '/track/set?x=' + optval1 + '&y=' + optval2;\n" " } else {\n" " url = url + '/track/center'\n" " }\n" " http.open(\"GET\", url, true);\n" " http.onreadystatechange = function() {\n" " if(http.readyState == 4 && http.status == 200) {\n" " }\n" " }\n" " http.send(null);\n" " }\n\n"); webu_write(webui, response); } static void webu_html_script(struct webui_ctx *webui) { /* Write the javascripts */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", " \n"); webu_write(webui, response); } static void webu_html_body(struct webui_ctx *webui) { /* Write the body section of the form */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s","\n"); webu_write(webui, response); webu_html_navbar(webui); webu_html_h3desc(webui); webu_html_config(webui); webu_html_track(webui); webu_html_preview(webui); webu_html_script(webui); snprintf(response, sizeof (response),"%s", "\n"); webu_write(webui, response); } static void webu_html_page(struct webui_ctx *webui) { /* Write the main page html */ char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response), "\n" "\n",webui->lang); webu_write(webui, response); webu_html_head(webui); webu_html_body(webui); snprintf(response, sizeof (response),"%s", "\n"); webu_write(webui, response); } void webu_html_badreq(struct webui_ctx *webui) { char response[WEBUI_LEN_RESP]; snprintf(response, sizeof (response),"%s", "\n" "\n" "\n" "

Bad Request

\n" "

The server did not understand your request.

\n" "\n" "\n"); webu_write(webui, response); return; } void webu_html_main(struct webui_ctx *webui) { /* Note some detection and config requested actions call the * action function. This is because the legacy interface * put these into those pages. We put them together here * based upon the structure of the new interface */ int retcd; retcd = 0; if (strlen(webui->uri_camid) == 0){ webu_html_page(webui); } else if ((mystreq(webui->uri_cmd1,"config")) && (mystreq(webui->uri_cmd2,"write"))) { webu_process_action(webui); } else if (mystreq(webui->uri_cmd1,"config")) { retcd = webu_process_config(webui); } else if (mystreq(webui->uri_cmd1,"action")) { webu_process_action(webui); } else if (mystreq(webui->uri_cmd1,"detection")) { webu_process_action(webui); } else if (mystreq(webui->uri_cmd1,"track")) { retcd = webu_process_track(webui); } else{ MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO, _("Invalid action requested: >%s< >%s< >%s<") ,webui->uri_camid, webui->uri_cmd1, webui->uri_cmd2); retcd = -1; } if (retcd < 0) { webu_html_badreq(webui); } return; } motion-release-4.6.0/src/webu_html.h000066400000000000000000000016621452402535500174040ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * webu_html.h * Headers associated with functions in the webu_html.c module. */ #ifndef _INCLUDE_WEBU_HTML_H_ #define _INCLUDE_WEBU_HTML_H_ void webu_html_badreq(struct webui_ctx *webui); void webu_html_main(struct webui_ctx *webui); #endif motion-release-4.6.0/src/webu_status.c000066400000000000000000000155411452402535500177570ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * webu_status.c * * Status reports in JSON format via stream HTTP endpoint. * */ #include #include #include "motion.h" #include "webu.h" #include "webu_status.h" /* Conservatively encode characters in an array as a JSON string */ static void webu_json_write_string(struct webui_ctx *webui, const char *str) { const char *ptr; char cur, buf[8]; webu_write(webui, "\""); for (ptr = str; *ptr != '\0'; ++ptr) { cur = *ptr; switch (cur) { case '\\': /*FALLTHROUGH*/ case '"': snprintf(buf, sizeof(buf), "\\%c", cur); webu_write(webui, buf); continue; } /* TODO: Encode non-ASCII characters correctly as UTF-8 */ if (cur & ~0x7F) { cur = '?'; } if (isalnum(cur) || ispunct(cur) || cur == ' ') { /* Output character literally */ buf[0] = cur; buf[1] = '\0'; } else { snprintf(buf, sizeof(buf), "\\u%04x", (uint16_t)cur); } webu_write(webui, buf); } webu_write(webui, "\""); } /* Write time_t as seconds since Unix epoch */ static void webu_json_write_timestamp(struct webui_ctx *webui, time_t ts) { char buf[32]; snprintf(buf, sizeof(buf), "%" PRId64, (int64_t)ts); webu_write(webui, buf); } /* Write duration of time between two time_t */ static void webu_json_write_timestamp_elapsed(struct webui_ctx *webui, time_t ts, time_t since) { char buf[32]; double elapsed; elapsed = difftime(since, ts); snprintf(buf, sizeof(buf), "%" PRId64, (int64_t)elapsed); webu_write(webui, buf); } /* Write time_t as ISO-8601-formatted string */ static void webu_json_write_timestamp_iso8601(struct webui_ctx *webui, time_t ts) { char buf[32]; struct tm timestamp_tm; localtime_r(&ts, ×tamp_tm); strftime(buf, sizeof(buf), "%FT%T%z", ×tamp_tm); webu_json_write_string(webui, buf); } static void webu_status_write_list(struct webui_ctx *webui, const char *toplevel_key , void (*callback)(struct webui_ctx *, struct context *)) { int indx, indx_st; if (webui->thread_nbr == 0) { if (webui->cam_threads == 1) { indx_st = 0; } else { indx_st = 1; } webu_write(webui, "{\""); webu_write(webui, toplevel_key); webu_write(webui, "\": ["); for (indx = indx_st; indx < webui->cam_threads; indx++) { if (indx > indx_st) { webu_write(webui, ", "); } callback(webui, webui->cntlst[indx]); } webu_write(webui, "]}\n"); } else { callback(webui, webui->cnt); } } static void webu_json_cam_list_single(struct webui_ctx *webui, struct context *cnt) { char buf[WEBUI_LEN_RESP]; snprintf(buf, sizeof(buf), "{\"id\": %d, \"name\": ", cnt->camera_id); webu_write(webui, buf); if (cnt->conf.camera_name == NULL) { webu_write(webui, "null"); } else { webu_json_write_string(webui, cnt->conf.camera_name); } webu_write(webui, "}"); } static void webu_status_list(struct webui_ctx *webui) { webu_status_write_list(webui, "cameras", webu_json_cam_list_single); } /* Describe a single camera status */ static void webu_json_cam_status_single(struct webui_ctx *webui, struct context *cnt) { char buf[WEBUI_LEN_RESP]; const struct { const char *name; time_t value; } timestamps[] = { { "lasttime", cnt->last_tv.tv_sec }, { "eventtime", cnt->event_tv.tv_sec }, { "connectionlosttime", cnt->lostconnection_tv.tv_sec }, { NULL, 0 }, }, *cur_timestamp; snprintf(buf, sizeof(buf), "{\"id\": %d, \"name\": ", cnt->camera_id); webu_write(webui, buf); if (cnt->conf.camera_name == NULL) { webu_write(webui, "null"); } else { webu_json_write_string(webui, cnt->conf.camera_name); } snprintf(buf, sizeof(buf), ", \"image_width\": %d" ", \"image_height\": %d" ", \"fps\": %u" ", \"missing_frame_counter\": %u" ", \"running\": %u" ", \"lost_connection\": %u" , cnt->imgs.width , cnt->imgs.height , cnt->lastrate , cnt->missing_frame_counter , cnt->running , cnt->lost_connection); webu_write(webui, buf); webu_write(webui, ", \"currenttime\": "); webu_json_write_timestamp(webui, cnt->current_tv.tv_sec); webu_write(webui, ", \"currenttime_iso8601\": "); webu_json_write_timestamp_iso8601(webui, cnt->current_tv.tv_sec); for (cur_timestamp = timestamps; cur_timestamp && cur_timestamp->name; ++cur_timestamp) { snprintf(buf, sizeof(buf), ", \"%s\": ", cur_timestamp->name); webu_write(webui, buf); webu_json_write_timestamp(webui, cur_timestamp->value); snprintf(buf, sizeof(buf), ", \"%s_iso8601\": ", cur_timestamp->name); webu_write(webui, buf); if (cur_timestamp->value == (time_t)0) { webu_write(webui, "null"); } else { webu_json_write_timestamp_iso8601(webui, cur_timestamp->value); } snprintf(buf, sizeof(buf), ", \"%s_elapsed\": ", cur_timestamp->name); webu_write(webui, buf); if (cur_timestamp->value == (time_t)0) { webu_write(webui, "null"); } else { webu_json_write_timestamp_elapsed(webui, cur_timestamp->value, cnt->current_tv.tv_sec); } } webu_write(webui, "}\n"); } static void webu_status_one(struct webui_ctx *webui) { webu_status_write_list(webui, "camera_status", webu_json_cam_status_single); } static void webu_status_badreq(struct webui_ctx *webui) { webu_write(webui, "{ \"error\": \"Server did not understand the request\" }"); } void webu_status_main(struct webui_ctx *webui) { switch (webui->cnct_type) { case WEBUI_CNCT_STATUS_LIST: webu_status_list(webui); break; case WEBUI_CNCT_STATUS_ONE: webu_status_one(webui); break; default: webu_status_badreq(webui); break; } } motion-release-4.6.0/src/webu_status.h000066400000000000000000000016131452402535500177570ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * webu_status.h * Headers associated with functions in the webu_status.c module. */ #ifndef _INCLUDE_WEBU_STATUS_H_ #define _INCLUDE_WEBU_STATUS_H_ void webu_status_main(struct webui_ctx *webui); #endif motion-release-4.6.0/src/webu_stream.c000066400000000000000000000331011452402535500177170ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * webu_stream.c * * Create the web streams for Motion * * Functional naming scheme * webu_stream* - All functions in this module * webu_stream_mjpeg* - Create the motion-jpeg stream for the user * webu_stream_static* - Create the static jpg image for the user. * webu_stream_checks - Edit/validate request from user */ #include "motion.h" #include "util.h" #include "logger.h" #include "webu.h" #include "webu_stream.h" #include "translate.h" void webu_stream_deinit(struct webui_ctx *webui, struct stream_data *stream) { pthread_mutex_lock(&webui->cnt->mutex_stream); stream->cnct_count--; if (stream->cnct_count == 0) { if (stream->jpeg_data != NULL) { free(stream->jpeg_data); stream->jpeg_data = NULL; } } pthread_mutex_unlock(&webui->cnt->mutex_stream); } static void webu_stream_mjpeg_checkbuffers(struct webui_ctx *webui) { /* Allocate buffers if needed */ if (webui->resp_size < (size_t)webui->cnt->imgs.size_norm) { if (webui->resp_page != NULL) { free(webui->resp_page); } webui->resp_page = mymalloc(webui->cnt->imgs.size_norm); memset(webui->resp_page,'\0',webui->cnt->imgs.size_norm); webui->resp_size = webui->cnt->imgs.size_norm; webui->resp_used = 0; } } static void webu_stream_mjpeg_delay(struct webui_ctx *webui) { /* Sleep required time to get to the user requested frame * rate for the stream */ long stream_rate; struct timeval time_curr; long stream_delay; gettimeofday(&time_curr, NULL); /* The stream rate MUST be less than 1000000000 otherwise undefined behaviour * will occur with the SLEEP function. */ stream_delay = ((time_curr.tv_usec - webui->time_last.tv_usec)*1000) + ((time_curr.tv_sec - webui->time_last.tv_sec)*1000000000); if (stream_delay < 0) { stream_delay = 0; } if (stream_delay > 1000000000 ) { stream_delay = 1000000000; } if (webui->stream_fps >= 1) { stream_rate = ( (1000000000 / webui->stream_fps) - stream_delay); if ((stream_rate > 0) && (stream_rate < 1000000000)) { SLEEP(0,stream_rate); } else if (stream_rate == 1000000000) { SLEEP(1,0); } } gettimeofday(&webui->time_last, NULL); } static void webu_stream_mjpeg_getimg(struct webui_ctx *webui) { long jpeg_size; char resp_head[80]; int header_len; struct stream_data *local_stream; memset(webui->resp_page, '\0', webui->resp_size); /* Assign to a local pointer the stream we want */ if (webui->cnct_type == WEBUI_CNCT_FULL) { local_stream = &webui->cnt->stream_norm; } else if (webui->cnct_type == WEBUI_CNCT_SUB) { local_stream = &webui->cnt->stream_sub; } else if (webui->cnct_type == WEBUI_CNCT_MOTION) { local_stream = &webui->cnt->stream_motion; } else if (webui->cnct_type == WEBUI_CNCT_SOURCE) { local_stream = &webui->cnt->stream_source; } else { return; } /* Copy jpg from the motion loop thread */ pthread_mutex_lock(&webui->cnt->mutex_stream); if ((!webui->cnt->detecting_motion) && (webui->cnt->conf.stream_motion)) { webui->stream_fps = 1; } else { webui->stream_fps = webui->cnt->conf.stream_maxrate; } /* If no image, wait a second*/ if (local_stream->jpeg_data == NULL) { pthread_mutex_unlock(&webui->cnt->mutex_stream); SLEEP(1,0); pthread_mutex_lock(&webui->cnt->mutex_stream); } /* If still no image, give up */ if (local_stream->jpeg_data == NULL) { pthread_mutex_unlock(&webui->cnt->mutex_stream); return; } jpeg_size = local_stream->jpeg_size; header_len = snprintf(resp_head, 80 ,"--BoundaryString\r\n" "Content-type: image/jpeg\r\n" "Content-Length: %9ld\r\n\r\n" ,jpeg_size); memcpy(webui->resp_page, resp_head, header_len); memcpy(webui->resp_page + header_len ,local_stream->jpeg_data ,jpeg_size); /* Copy in the terminator after the jpg data at the end*/ memcpy(webui->resp_page + header_len + jpeg_size,"\r\n",2); webui->resp_used = header_len + jpeg_size + 2; pthread_mutex_unlock(&webui->cnt->mutex_stream); } static ssize_t webu_stream_mjpeg_response (void *cls, uint64_t pos, char *buf, size_t max) { /* This is the callback response function for MHD streams. It is kept "open" and * in process during the entire time that the user has the stream open in the web * browser. We sleep the requested amount of time between fetching images to match * the user configuration parameters. This function may be called multiple times for * a single image so we can write what we can to the buffer and pick up remaining bytes * to send based upon the stream position */ struct webui_ctx *webui = cls; size_t sent_bytes; (void)pos; /*Remove compiler warning */ if (webui->cnt->webcontrol_finish) { return -1; } if ((webui->stream_pos == 0) || (webui->resp_used == 0)) { webu_stream_mjpeg_delay(webui); webui->stream_pos = 0; webui->resp_used = 0; webu_stream_mjpeg_getimg(webui); if (webui->resp_used == 0) { return 0; } } if ((webui->resp_used - webui->stream_pos) > max) { sent_bytes = max; } else { sent_bytes = webui->resp_used - webui->stream_pos; } memcpy(buf, webui->resp_page + webui->stream_pos, sent_bytes); webui->stream_pos = webui->stream_pos + sent_bytes; if (webui->stream_pos >= webui->resp_used) { webui->stream_pos = 0; } return sent_bytes; } static void webu_stream_static_getimg(struct webui_ctx *webui) { /* Obtain the current image, compress it to a JPG and put into webui->resp_page * for MHD to send back to user */ webui->resp_used = 0; memset(webui->resp_page, '\0', webui->resp_size); pthread_mutex_lock(&webui->cnt->mutex_stream); /* If no image, wait a second*/ if (webui->cnt->stream_norm.jpeg_data == NULL) { pthread_mutex_unlock(&webui->cnt->mutex_stream); SLEEP(1,0); pthread_mutex_lock(&webui->cnt->mutex_stream); } /* If still no image, give up */ if (webui->cnt->stream_norm.jpeg_data == NULL) { pthread_mutex_unlock(&webui->cnt->mutex_stream); return; } memcpy(webui->resp_page ,webui->cnt->stream_norm.jpeg_data ,webui->cnt->stream_norm.jpeg_size); webui->resp_used = webui->cnt->stream_norm.jpeg_size; pthread_mutex_unlock(&webui->cnt->mutex_stream); } static int webu_stream_checks(struct webui_ctx *webui) { /* Perform edits to determine whether the user specified a valid URL * for the particular port */ if ((webui->cntlst != NULL) && (webui->thread_nbr >= webui->cam_threads)) { MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO , _("Invalid thread specified: %s"),webui->url); return -1; } if ((webui->cntlst != NULL) && (webui->thread_nbr < 0) && (webui->cam_threads > 1)) { MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO , _("Invalid thread specified: %s"),webui->url); return -1; } /* Thread numbers are not used for context specific ports. */ if ((webui->cntlst == NULL) && (webui->thread_nbr >= 0)) { MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO , _("Invalid URL for a camera specific port: %s"),webui->url); return -1; } /* If multiple threads then thread zero is invalid. */ if ((webui->cam_threads > 1) && (webui->thread_nbr == 0)) { MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO , _("URL for thread 0 is not valid when using camera specific files.: %s") ,webui->url); return -1; } /* Thread numbers are not used for context specific ports. */ if ((webui->cntlst == NULL) && (strlen(webui->uri_cmd1) > 0)) { MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO , _("Bad URL for a camera specific port: %s"),webui->url); return -1; } return 0; } static void webu_stream_cnct_count(struct webui_ctx *webui) { /* Increment the counters for the connections to the streams */ int cnct_count; cnct_count = 0; if (webui->cnct_type == WEBUI_CNCT_SUB) { pthread_mutex_lock(&webui->cnt->mutex_stream); webui->cnt->stream_sub.cnct_count++; cnct_count = webui->cnt->stream_sub.cnct_count; pthread_mutex_unlock(&webui->cnt->mutex_stream); } else if (webui->cnct_type == WEBUI_CNCT_MOTION) { pthread_mutex_lock(&webui->cnt->mutex_stream); webui->cnt->stream_motion.cnct_count++; cnct_count = webui->cnt->stream_motion.cnct_count; pthread_mutex_unlock(&webui->cnt->mutex_stream); } else if (webui->cnct_type == WEBUI_CNCT_SOURCE) { pthread_mutex_lock(&webui->cnt->mutex_stream); webui->cnt->stream_source.cnct_count++; cnct_count = webui->cnt->stream_source.cnct_count; pthread_mutex_unlock(&webui->cnt->mutex_stream); } else { /* Stream, Static */ pthread_mutex_lock(&webui->cnt->mutex_stream); webui->cnt->stream_norm.cnct_count++; cnct_count = webui->cnt->stream_norm.cnct_count; pthread_mutex_unlock(&webui->cnt->mutex_stream); } if (cnct_count == 1) { /* This is the first connection so we need to wait half a sec * so that the motion loop on the other thread can update image */ SLEEP(0,500000000L); } } mymhd_retcd webu_stream_mjpeg(struct webui_ctx *webui) { /* Create the stream for the motion jpeg */ mymhd_retcd retcd; struct MHD_Response *response; int indx; if (webu_stream_checks(webui) == -1) { return MHD_NO; } webu_stream_cnct_count(webui); webu_stream_mjpeg_checkbuffers(webui); gettimeofday(&webui->time_last, NULL); response = MHD_create_response_from_callback (MHD_SIZE_UNKNOWN, 1024 ,&webu_stream_mjpeg_response, webui, NULL); if (!response) { MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO, _("Invalid response")); return MHD_NO; } for (indx = 0; indx < webui->cnt->stream_headers->params_count; indx++) { retcd = MHD_add_response_header (response , webui->cnt->stream_headers->params_array[indx].param_name , webui->cnt->stream_headers->params_array[indx].param_value); if (retcd == MHD_NO) { MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO , _("Error adding stream header %s %s") , webui->cnt->stream_headers->params_array[indx].param_name , webui->cnt->stream_headers->params_array[indx].param_value); } } MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE , "multipart/x-mixed-replace; boundary=BoundaryString"); retcd = MHD_queue_response (webui->connection, MHD_HTTP_OK, response); MHD_destroy_response (response); return retcd; } mymhd_retcd webu_stream_static(struct webui_ctx *webui) { /* Create the response for the static image request*/ mymhd_retcd retcd; struct MHD_Response *response; char resp_used[20]; int indx; if (webu_stream_checks(webui) == -1) { return MHD_NO; } webu_stream_cnct_count(webui); webu_stream_mjpeg_checkbuffers(webui); webu_stream_static_getimg(webui); if (webui->resp_used == 0) { MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO, _("Could not get image to stream.")); return MHD_NO; } response = MHD_create_response_from_buffer (webui->resp_used ,(void *)webui->resp_page, MHD_RESPMEM_MUST_COPY); if (!response) { MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO, _("Invalid response")); return MHD_NO; } for (indx = 0; indx < webui->cnt->stream_headers->params_count; indx++) { retcd = MHD_add_response_header (response , webui->cnt->stream_headers->params_array[indx].param_name , webui->cnt->stream_headers->params_array[indx].param_value); if (retcd == MHD_NO) { MOTION_LOG(ERR, TYPE_STREAM, NO_ERRNO , _("Error adding stream header %s %s") , webui->cnt->stream_headers->params_array[indx].param_name , webui->cnt->stream_headers->params_array[indx].param_value); } } MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE, "image/jpeg"); snprintf(resp_used, 20, "%9ld\r\n\r\n",(long)webui->resp_used); MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_LENGTH, resp_used); retcd = MHD_queue_response (webui->connection, MHD_HTTP_OK, response); MHD_destroy_response (response); return retcd; } motion-release-4.6.0/src/webu_stream.h000066400000000000000000000020331452402535500177240ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * webu_stream.h * Headers associated with functions in the webu_stream.c module. */ #ifndef _INCLUDE_WEBU_STREAM_H_ #define _INCLUDE_WEBU_STREAM_H_ mymhd_retcd webu_stream_mjpeg(struct webui_ctx *webui); mymhd_retcd webu_stream_static(struct webui_ctx *webui); void webu_stream_deinit(struct webui_ctx *webui, struct stream_data *stream); #endif motion-release-4.6.0/src/webu_text.c000066400000000000000000001006711452402535500174170ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * webu_text.c * * Create the text(programatic) interface Motion * * This module processes the requests associated with the text inferface * of the webcontrol. This interface is intended to be used by programs * and does not have any user interface to navigate. The same actions * are available as the HTML as well as a few more. * Additional functions not directly available via HTML * get: Returns the value of a parameter. * quit: Terminates motion * list: Lists all the configuration parameters and values * status Whether the camera is in pause mode. * connection Whether the camera connection is working * */ #include "motion.h" #include "util.h" #include "logger.h" #include "webu.h" #include "webu_text.h" #include "translate.h" static void webu_text_seteol(struct webui_ctx *webui) { /* Set the end of line character for text interface */ if (webui->cntlst[0]->conf.webcontrol_interface == 2) { snprintf(webui->text_eol, WEBUI_LEN_PARM,"%s","
"); } else { snprintf(webui->text_eol, WEBUI_LEN_PARM,"%s",""); } } static void webu_text_camera_name(struct webui_ctx *webui) { char response[WEBUI_LEN_RESP]; if (webui->cntlst[webui->thread_nbr]->conf.camera_name == NULL) { snprintf(response,sizeof(response), "Camera %s %s\n" ,webui->uri_camid,webui->text_eol ); } else { snprintf(response,sizeof(response), "Camera %s %s\n" ,webui->cntlst[webui->thread_nbr]->conf.camera_name ,webui->text_eol ); } webu_write(webui, response); } static void webu_text_back(struct webui_ctx *webui, const char *prevuri) { char response[WEBUI_LEN_RESP]; if (webui->cntlst[0]->conf.webcontrol_interface == 2) { snprintf(response,sizeof(response), "<- back

\n" ,webui->uri_camid, prevuri ); webu_write(webui, response); } } static void webu_text_header(struct webui_ctx *webui) { char response[WEBUI_LEN_RESP]; if (webui->cntlst[0]->conf.webcontrol_interface == 2) { snprintf(response, sizeof (response),"%s", "\n" "\n" "Motion "VERSION" \n" "\n" "\n"); webu_write(webui, response); } } static void webu_text_trailer(struct webui_ctx *webui) { char response[WEBUI_LEN_RESP]; if (webui->cntlst[0]->conf.webcontrol_interface == 2) { snprintf(response, sizeof (response),"%s", "\n" "\n"); webu_write(webui, response); } } void webu_text_badreq(struct webui_ctx *webui) { char response[WEBUI_LEN_RESP]; webu_text_header(webui); snprintf(response, sizeof (response), "Bad Request %s\n" "The server did not understand your request. %s\n" ,webui->text_eol, webui->text_eol ); webu_write(webui, response); webu_text_trailer(webui); return; } static void webu_text_page_raw(struct webui_ctx *webui) { /* Write the main page text */ char response[WEBUI_LEN_RESP]; int indx; snprintf(response, sizeof (response), "Motion "VERSION" Running [%d] Camera%s \n" ,webui->cam_count ,(webui->cam_count > 1 ? "s" : "") ); webu_write(webui, response); if (webui->cam_threads > 1) { for (indx = 1; indx < webui->cam_threads; indx++) { snprintf(response, sizeof (response), "%d \n" ,webui->cntlst[indx]->camera_id ); webu_write(webui, response); } } } static void webu_text_page_basic(struct webui_ctx *webui) { /* Write the main page text */ char response[WEBUI_LEN_RESP]; int indx; webu_text_header(webui); snprintf(response, sizeof (response), "Motion "VERSION" Running [%d] Camera%s
\n" "All
\n" ,webui->cam_count, (webui->cam_count > 1 ? "s" : "") ,webui->cntlst[0]->camera_id); webu_write(webui, response); if (webui->cam_threads > 1) { for (indx = 1; indx < webui->cam_threads; indx++) { if (webui->cntlst[indx]->conf.camera_name == NULL) { snprintf(response, sizeof (response), "Camera %d
\n" , webui->cntlst[indx]->camera_id , indx); webu_write(webui, response); } else { snprintf(response, sizeof (response), "Camera %s
\n" , webui->cntlst[indx]->camera_id ,webui->cntlst[indx]->conf.camera_name); webu_write(webui, response); } } } webu_text_trailer(webui); } static void webu_text_list_raw(struct webui_ctx *webui) { /* Write out the options and values */ char response[WEBUI_LEN_RESP]; int indx_parm; const char *val_parm; indx_parm = 0; while (config_params[indx_parm].param_name != NULL) { if ((config_params[indx_parm].webui_level > webui->cntlst[0]->conf.webcontrol_parms) || (config_params[indx_parm].webui_level == WEBUI_LEVEL_NEVER) || ((webui->thread_nbr != 0) && (config_params[indx_parm].main_thread != 0))) { indx_parm++; continue; } val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, webui->thread_nbr); if (val_parm == NULL) { val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, 0); } snprintf(response, sizeof (response), " %s = %s \n" ,config_params[indx_parm].param_name ,val_parm ); webu_write(webui, response); indx_parm++; } } static void webu_text_list_basic(struct webui_ctx *webui) { /* Write out the options and values */ char response[WEBUI_LEN_RESP]; int indx_parm; const char *val_parm; webu_text_header(webui); snprintf(response,sizeof(response), "<- back

" ,webui->uri_camid ); webu_write(webui, response); webu_text_camera_name(webui); snprintf(response,sizeof(response),"%s","
    \n"); webu_write(webui, response); indx_parm = 0; while (config_params[indx_parm].param_name != NULL) { if ((config_params[indx_parm].webui_level > webui->cntlst[0]->conf.webcontrol_parms) || (config_params[indx_parm].webui_level == WEBUI_LEVEL_NEVER) || ((webui->thread_nbr != 0) && (config_params[indx_parm].main_thread != 0))) { indx_parm++; continue; } val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, webui->thread_nbr); if (val_parm == NULL) { val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, 0); } snprintf(response, sizeof (response), "
  • %s = %s
  • \n" ,webui->uri_camid ,config_params[indx_parm].param_name ,config_params[indx_parm].param_name ,val_parm); webu_write(webui, response); indx_parm++; } snprintf(response,sizeof(response),"%s","
\n"); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_set_menu(struct webui_ctx *webui) { /* Write out the options and values to allow user to set them*/ char response[WEBUI_LEN_RESP]; int indx_parm; const char *val_parm; webu_text_header(webui); webu_text_back(webui,"/config"); webu_text_camera_name(webui); snprintf(response, sizeof (response),"%s", "\n" "
\n" "\n" "
\n" "
\n" "\n" "\n" "
\n" ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_set_query(struct webui_ctx *webui) { /* Write out the options and values to allow user to set them*/ char response[WEBUI_LEN_RESP]; int indx_parm; const char *val_parm; webu_text_header(webui); webu_text_back(webui,"/config/list"); webu_text_camera_name(webui); indx_parm = 0; while (config_params[indx_parm].param_name != NULL) { if ((config_params[indx_parm].webui_level > webui->cntlst[0]->conf.webcontrol_parms) || (config_params[indx_parm].webui_level == WEBUI_LEVEL_NEVER) || ((webui->thread_nbr != 0) && (config_params[indx_parm].main_thread != 0)) || (mystrne(webui->uri_parm1, config_params[indx_parm].param_name))) { indx_parm++; continue; } val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, webui->thread_nbr); if (val_parm == NULL) { val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, 0); } snprintf(response, sizeof (response), "
\n" "%s \n" "\n" ,config_params[indx_parm].param_name ,config_params[indx_parm].param_name ,val_parm ); webu_write(webui, response); break; indx_parm++; } webu_text_trailer(webui); } static void webu_text_set_assign(struct webui_ctx *webui) { /* Set a particular configuration parameter to desired value */ char response[WEBUI_LEN_RESP]; int retcd; retcd = webu_process_config(webui); if (retcd == 0) { webu_text_header(webui); webu_text_back(webui,"/config"); snprintf(response,sizeof(response), "%s = %s %s\n" "Done %s\n" ,webui->uri_parm1 ,webui->uri_value1 ,webui->text_eol, webui->text_eol ); webu_write(webui, response); webu_text_trailer(webui); } else { webu_text_badreq(webui); } } static void webu_text_get_menu(struct webui_ctx *webui) { char response[WEBUI_LEN_RESP]; int indx_parm; webu_text_header(webui); webu_text_back(webui,"/config"); webu_text_camera_name(webui); snprintf(response, sizeof (response),"%s", "\n" "\n" "\n" "
\n" ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_action_quit(struct webui_ctx *webui) { /* Shut down motion or the associated thread */ char response[WEBUI_LEN_RESP]; webu_process_action(webui); webu_text_back(webui,"/action"); webu_text_header(webui); snprintf(response,sizeof(response), "quit in progress ... bye %s\nDone %s\n" ,webui->text_eol, webui->text_eol ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_action_makemovie(struct webui_ctx *webui) { /* end the event. Legacy api name*/ char response[WEBUI_LEN_RESP]; webu_process_action(webui); webu_text_back(webui,"/action"); webu_text_header(webui); snprintf(response,sizeof(response) ,"makemovie for camera %d %s\nDone%s\n" ,webui->cnt->camera_id ,webui->text_eol,webui->text_eol ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_action_eventstart(struct webui_ctx *webui) { /* Start the event*/ char response[WEBUI_LEN_RESP]; webu_process_action(webui); webu_text_header(webui); webu_text_back(webui,"/action"); snprintf(response,sizeof(response) ,"Start event for camera %d %s\nDone%s\n" ,webui->cnt->camera_id ,webui->text_eol,webui->text_eol ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_action_eventend(struct webui_ctx *webui) { /* End any active event*/ char response[WEBUI_LEN_RESP]; webu_process_action(webui); webu_text_header(webui); webu_text_back(webui,"/action"); snprintf(response,sizeof(response) ,"End event for camera %d %s\nDone %s\n" ,webui->cnt->camera_id ,webui->text_eol,webui->text_eol ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_action_snapshot(struct webui_ctx *webui) { /* trigger a snapshot*/ char response[WEBUI_LEN_RESP]; webu_process_action(webui); webu_text_header(webui); webu_text_back(webui,"/action"); snprintf(response,sizeof(response) ,"Snapshot for camera %d %s\nDone%s\n" ,webui->cnt->camera_id ,webui->text_eol,webui->text_eol ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_action_restart(struct webui_ctx *webui) { /* Restart*/ char response[WEBUI_LEN_RESP]; webu_process_action(webui); webu_text_header(webui); webu_text_back(webui,"/action"); snprintf(response,sizeof(response) ,"Restart in progress ...%s\nDone %s\n" ,webui->text_eol,webui->text_eol ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_action_start(struct webui_ctx *webui) { /* un-pause the camera*/ char response[WEBUI_LEN_RESP]; webu_process_action(webui); webu_text_header(webui); webu_text_back(webui,"/detection"); snprintf(response,sizeof(response) ,"Camera %d Detection resumed%s\nDone %s\n" ,webui->cnt->camera_id ,webui->text_eol,webui->text_eol ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_action_pause(struct webui_ctx *webui) { /* pause the camera*/ char response[WEBUI_LEN_RESP]; webu_process_action(webui); webu_text_header(webui); webu_text_back(webui,"/detection"); snprintf(response,sizeof(response) ,"Camera %d Detection paused%s\nDone %s\n" ,webui->cnt->camera_id ,webui->text_eol,webui->text_eol ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_action_write(struct webui_ctx *webui) { /* write the parms to file*/ char response[WEBUI_LEN_RESP]; webu_process_action(webui); webu_text_header(webui); webu_text_back(webui,"/config"); snprintf(response,sizeof(response) ,"Camera %d write %s\nDone %s\n" ,webui->cnt->camera_id ,webui->text_eol,webui->text_eol ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_action(struct webui_ctx *webui) { /* Call the action functions */ if (mystreq(webui->uri_cmd2,"makemovie")) { webu_text_action_makemovie(webui); } else if (mystreq(webui->uri_cmd2,"eventstart")) { webu_text_action_eventstart(webui); } else if (mystreq(webui->uri_cmd2,"eventend")) { webu_text_action_eventend(webui); } else if (mystreq(webui->uri_cmd2,"snapshot")) { webu_text_action_snapshot(webui); } else if (mystreq(webui->uri_cmd2,"restart")) { webu_text_action_restart(webui); } else if (mystreq(webui->uri_cmd2,"start")) { webu_text_action_start(webui); } else if (mystreq(webui->uri_cmd2,"pause")) { webu_text_action_pause(webui); } else if ((mystreq(webui->uri_cmd2,"quit")) || (mystreq(webui->uri_cmd2,"end"))) { webu_text_action_quit(webui); } else if ((mystreq(webui->uri_cmd2,"write")) || (mystreq(webui->uri_cmd2,"writeyes"))) { webu_text_action_write(webui); } else { webu_text_badreq(webui); MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO, _("Invalid action requested: >%s< >%s< >%s<") ,webui->uri_camid, webui->uri_cmd1, webui->uri_cmd2); return; } } static void webu_text_track_pantilt(struct webui_ctx *webui) { /* Call the track function */ char response[WEBUI_LEN_RESP]; webu_text_header(webui); webu_text_back(webui,"/track"); webu_text_camera_name(webui); snprintf(response,sizeof(response),"%s", "
\n" "Pan\n" "Tilt\n" "\n" "
\n" "
\n" "X\n" "Y\n" "\n" "
\n" ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_track(struct webui_ctx *webui) { /* Call the track function */ char response[WEBUI_LEN_RESP]; int retcd; retcd = webu_process_track(webui); if (retcd == 0) { webu_text_header(webui); webu_text_back(webui,"/track"); webu_text_camera_name(webui); snprintf(response,sizeof(response) ,"Track %s %s\n" "Done %s\n" ,webui->uri_cmd2,webui->text_eol ,webui->text_eol ); webu_write(webui, response); webu_text_trailer(webui); } else { webu_text_badreq(webui); } } static void webu_text_menu(struct webui_ctx *webui) { char response[WEBUI_LEN_RESP]; webu_text_header(webui); snprintf(response,sizeof(response), "<- back

" ); webu_write(webui, response); webu_text_camera_name(webui); snprintf(response,sizeof(response), "config
\n" "action
\n" "detection
\n" "track
\n" ,webui->uri_camid, webui->uri_camid ,webui->uri_camid, webui->uri_camid ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_menu_config(struct webui_ctx *webui) { char response[WEBUI_LEN_RESP]; webu_text_header(webui); webu_text_back(webui,"/"); webu_text_camera_name(webui); snprintf(response,sizeof(response), "list
" "write
" "set
" "get
" ,webui->uri_camid, webui->uri_camid ,webui->uri_camid, webui->uri_camid ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_menu_action(struct webui_ctx *webui) { char response[WEBUI_LEN_RESP]; webu_text_header(webui); webu_text_back(webui,"/"); webu_text_camera_name(webui); snprintf(response,sizeof(response), "eventstart
" "eventend
" "snapshot
" "restart
" "quit
" "end
" ,webui->uri_camid, webui->uri_camid, webui->uri_camid ,webui->uri_camid, webui->uri_camid, webui->uri_camid ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_menu_detection(struct webui_ctx *webui) { char response[WEBUI_LEN_RESP]; webu_text_header(webui); webu_text_back(webui,"/"); webu_text_camera_name(webui); snprintf(response,sizeof(response), "status
" "start
" "pause
" "connection
" ,webui->uri_camid, webui->uri_camid ,webui->uri_camid, webui->uri_camid ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_menu_track(struct webui_ctx *webui) { char response[WEBUI_LEN_RESP]; webu_text_header(webui); webu_text_back(webui,"/"); webu_text_camera_name(webui); snprintf(response,sizeof(response), "track set pan/tilt
" "track center
" ,webui->uri_camid, webui->uri_camid ); webu_write(webui, response); webu_text_trailer(webui); } static void webu_text_submenu(struct webui_ctx *webui) { if ((mystreq(webui->uri_cmd1,"config")) && (strlen(webui->uri_cmd2) == 0)) { webu_text_menu_config(webui); } else if ((mystreq(webui->uri_cmd1,"action")) && (strlen(webui->uri_cmd2) == 0)) { webu_text_menu_action(webui); } else if ((mystreq(webui->uri_cmd1,"detection")) && (strlen(webui->uri_cmd2) == 0)) { webu_text_menu_detection(webui); } else if ((mystreq(webui->uri_cmd1,"track")) && (strlen(webui->uri_cmd2) == 0)) { webu_text_menu_track(webui); } else { MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO, _("Invalid action requested: >%s< >%s< >%s<") ,webui->uri_camid, webui->uri_cmd1, webui->uri_cmd2); webu_text_badreq(webui); } } void webu_text_get_query(struct webui_ctx *webui) { /* Write out the option value for one parm */ char response[WEBUI_LEN_RESP]; int indx_parm; const char *val_parm; char temp_name[WEBUI_LEN_PARM]; /* Search through the depreciated parms and if applicable, * get the new parameter name so we can check its webcontrol_parms level */ snprintf(temp_name, WEBUI_LEN_PARM, "%s", webui->uri_value1); indx_parm=0; while (dep_config_params[indx_parm].name != NULL) { if (mystreq(dep_config_params[indx_parm].name, webui->uri_value1)) { snprintf(temp_name, WEBUI_LEN_PARM, "%s", dep_config_params[indx_parm].newname); break; } indx_parm++; } indx_parm = 0; while (config_params[indx_parm].param_name != NULL) { if ((config_params[indx_parm].webui_level > webui->cntlst[0]->conf.webcontrol_parms) || (config_params[indx_parm].webui_level == WEBUI_LEVEL_NEVER) || mystrne(webui->uri_parm1,"query") || mystrne(temp_name, config_params[indx_parm].param_name)) { indx_parm++; continue; } val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, webui->thread_nbr); if (val_parm == NULL) { val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, 0); } if (mystrne(webui->uri_value1, config_params[indx_parm].param_name)) { MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO , _("'%s' option is depreciated. New option name is '%s'") ,webui->uri_value1, config_params[indx_parm].param_name); } webu_text_header(webui); webu_text_back(webui,"/config"); webu_text_camera_name(webui); if (webui->cntlst[0]->conf.webcontrol_interface == 2) { snprintf(response, sizeof (response), "
    \n" "
  • %s = %s
  • \n" "
\n" ,config_params[indx_parm].param_name ,val_parm ); } else { snprintf(response, sizeof (response), "%s = %s %s\n" "Done %s\n" ,config_params[indx_parm].param_name ,val_parm ,webui->text_eol, webui->text_eol ); } webu_write(webui, response); webu_text_trailer(webui); break; } if (config_params[indx_parm].param_name == NULL) { webu_text_badreq(webui); } } void webu_text_status(struct webui_ctx *webui) { /* Write out the pause/active status */ char response[WEBUI_LEN_RESP]; int indx, indx_st; webu_text_header(webui); webu_text_back(webui,"/detection"); if (webui->thread_nbr == 0) { if (webui->cam_threads == 1) { indx_st = 0; } else { indx_st = 1; } for (indx = indx_st; indx < webui->cam_threads; indx++) { snprintf(response, sizeof(response), "Camera %d Detection status %s %s\n" ,webui->cntlst[indx]->camera_id ,(!webui->cntlst[indx]->running)? "NOT RUNNING": (webui->cntlst[indx]->pause)? "PAUSE":"ACTIVE" ,webui->text_eol ); webu_write(webui, response); } } else { snprintf(response, sizeof(response), "Camera %d Detection status %s %s\n" ,webui->cnt->camera_id ,(!webui->cnt->running)? "NOT RUNNING": (webui->cnt->pause)? "PAUSE":"ACTIVE" ,webui->text_eol ); webu_write(webui, response); } webu_text_trailer(webui); } void webu_text_connection(struct webui_ctx *webui) { /* Write out the connection status */ char response[WEBUI_LEN_RESP]; int indx, indx_st; webu_text_header(webui); webu_text_back(webui,"/detection"); webu_text_camera_name(webui); if (webui->thread_nbr == 0) { if (webui->cam_threads == 1) { indx_st = 0; } else { indx_st = 1; } for (indx = indx_st; indx < webui->cam_threads; indx++) { snprintf(response,sizeof(response) , "Camera %d%s%s %s %s\n" ,webui->cntlst[indx]->camera_id ,webui->cntlst[indx]->conf.camera_name ? " -- " : "" ,webui->cntlst[indx]->conf.camera_name ? webui->cntlst[indx]->conf.camera_name : "" ,(!webui->cntlst[indx]->running)? "NOT RUNNING" : (webui->cntlst[indx]->lost_connection)? "Lost connection": "Connection OK" ,webui->text_eol ); webu_write(webui, response); } } else { snprintf(response,sizeof(response) , "Camera %d%s%s %s %s\n" ,webui->cnt->camera_id ,webui->cnt->conf.camera_name ? " -- " : "" ,webui->cnt->conf.camera_name ? webui->cnt->conf.camera_name : "" ,(!webui->cnt->running)? "NOT RUNNING" : (webui->cnt->lost_connection)? "Lost connection": "Connection OK" ,webui->text_eol ); webu_write(webui, response); } webu_text_trailer(webui); } void webu_text_list(struct webui_ctx *webui) { if (webui->cntlst[0]->conf.webcontrol_interface == 2) { webu_text_list_basic(webui); } else { webu_text_list_raw(webui); } } void webu_text_main(struct webui_ctx *webui) { /* Main entry point for processing requests for the text interface */ webu_text_seteol(webui); if (strlen(webui->uri_camid) == 0) { if (webui->cntlst[0]->conf.webcontrol_interface == 2) { webu_text_page_basic(webui); } else { webu_text_page_raw(webui); } } else if (strlen(webui->uri_cmd1) == 0) { webu_text_menu(webui); } else if (strlen(webui->uri_cmd2) == 0) { webu_text_submenu(webui); } else if ((mystreq(webui->uri_cmd1,"config")) && (mystreq(webui->uri_cmd2,"set")) && (strlen(webui->uri_parm1) == 0)) { webu_text_set_menu(webui); } else if ((mystreq(webui->uri_cmd1,"config")) && (mystreq(webui->uri_cmd2,"set")) && (strlen(webui->uri_parm1) > 0) && (strlen(webui->uri_value1) == 0) ) { webu_text_set_query(webui); } else if ((mystreq(webui->uri_cmd1,"config")) && (mystreq(webui->uri_cmd2,"set"))) { webu_text_set_assign(webui); } else if ((mystreq(webui->uri_cmd1,"config")) && (mystreq(webui->uri_cmd2,"write"))) { webu_text_action(webui); } else if ((mystreq(webui->uri_cmd1,"config")) && (mystreq(webui->uri_cmd2,"list"))) { webu_text_list(webui); } else if ((mystreq(webui->uri_cmd1,"config")) && (mystreq(webui->uri_cmd2,"get")) && (strlen(webui->uri_parm1) == 0)) { webu_text_get_menu(webui); } else if ((mystreq(webui->uri_cmd1,"config")) && (mystreq(webui->uri_cmd2,"get"))) { webu_text_get_query(webui); } else if ((mystreq(webui->uri_cmd1,"detection")) && (mystreq(webui->uri_cmd2,"status"))) { webu_text_status(webui); } else if ((mystreq(webui->uri_cmd1,"detection")) && (mystreq(webui->uri_cmd2,"connection"))) { webu_text_connection(webui); } else if ((mystreq(webui->uri_cmd1,"detection")) && (mystreq(webui->uri_cmd2,"start"))) { webu_text_action(webui); } else if ((mystreq(webui->uri_cmd1,"detection")) && (mystreq(webui->uri_cmd2,"pause"))) { webu_text_action(webui); } else if ((mystreq(webui->uri_cmd1,"action")) && (mystreq(webui->uri_cmd2,"quit"))) { webu_text_action(webui); } else if ((mystreq(webui->uri_cmd1,"action")) && (mystreq(webui->uri_cmd2,"end"))) { webu_text_action(webui); } else if (mystreq(webui->uri_cmd1,"action")) { webu_text_action(webui); } else if ((mystreq(webui->uri_cmd1,"track")) && (mystreq(webui->uri_cmd2,"set")) && (strlen(webui->uri_parm1) == 0)) { webu_text_track_pantilt(webui); } else if ((mystreq(webui->uri_cmd1,"track"))) { webu_text_track(webui); } else{ MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO, _("Invalid action requested: >%s< >%s< >%s<") ,webui->uri_camid, webui->uri_cmd1, webui->uri_cmd2); webu_text_badreq(webui); } return; } motion-release-4.6.0/src/webu_text.h000066400000000000000000000021671452402535500174250ustar00rootroot00000000000000/* This file is part of Motion. * * Motion 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. * * Motion 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 Motion. If not, see . */ /* * webu_text.h * Headers associated with functions in the webu_text.c module. */ #ifndef _INCLUDE_WEBU_TEXT_H_ #define _INCLUDE_WEBU_TEXT_H_ void webu_text_badreq(struct webui_ctx *webui); void webu_text_main(struct webui_ctx *webui); void webu_text_status(struct webui_ctx *webui); void webu_text_connection(struct webui_ctx *webui); void webu_text_list(struct webui_ctx *webui); void webu_text_get_query(struct webui_ctx *webui); #endif