Send Motion-user mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
https://lists.sourceforge.net/lists/listinfo/motion-user
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Motion-user digest..."
Today's Topics:
1. Re: texts & external events (tosiara)
----------------------------------------------------------------------
Message: 1
Date: Tue, 24 Nov 2015 15:16:36 +0200
From: tosiara <[email protected]>
Subject: Re: [Motion-user] texts & external events
To: Motion discussion list <[email protected]>
Message-ID:
<cachtdwqaomnscbr8diua6fssz85vuh9-pexhzgdosg6kzwj...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
Hi,
thanks, it is really cool you share your changes!
However it would be really useful if you could fork motion project on
Github and create branches for every new feature. When branches are ready -
issue pull request so maintainer can review your changes
Use this as base fork: https://github.com/Mr-Dave/motion
If you are not familiar with Github - feel free to ask questions here on
mail list or mail me directly
On Tue, Nov 24, 2015 at 3:09 PM, folkert <[email protected]> wrote:
> Hi,
>
> I've extended my patch a bit. I fixed that the defaults did not work.
> Todo is adding a "center"-mode and maybe even a mode where one can
> explicitly set the coordinates.
>
> I've also added something new:
>
> ext_event_udp_listener_port 1888
> ext_event_show_time 5
> ext_event_location upper-left
>
> What this does: it listens on an UDP port. Then when it receives a
> text-packet on that port, it will show that text for 5 seconds on the
> selected location.
> Sending such a packet can be something simple as with this
> python-script:
> #! /usr/bin/python
>
> import socket
> import sys
>
> UDP_IP = '127.0.0.1'
> UDP_PORT = 1888
> MESSAGE = sys.argv[1]
>
> sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
> sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
>
> e.g.:
> ./send.py "some-one is at the front-door!"
>
> As you can see I use it myself for my door-bell which is connected to
> a raspberry pi which sends udp messages to all kinds of devices around
> the house.
>
> Index: conf.c
> ===================================================================
> --- conf.c (revision 564)
> +++ conf.c (working copy)
> @@ -147,9 +147,10 @@
> netcam_proxy: NULL,
> netcam_tolerant_check: 0,
> text_changes: 0,
> - text_left: NULL,
> - text_right: DEF_TIMESTAMP,
> - text_event: DEF_EVENTSTAMP,
> + timestamp: DEF_TIMESTAMP,
> + timestamp_location: NULL,
> + generic_text: NULL,
> + generic_text_location: NULL,
> text_double: 0,
> despeckle_filter: NULL,
> area_detect: NULL,
> @@ -159,6 +160,9 @@
> log_file: NULL,
> log_level: LEVEL_DEFAULT+10,
> log_type_str: NULL,
> + ext_event_udp_listener_port: 0,
> + ext_event_show_time: 5,
> + ext_event_location: "upper-left",
> };
>
>
> @@ -850,26 +854,46 @@
> print_string
> },
> {
> - "text_right",
> + "timestamp",
> "# Draws the timestamp using same options as C function strftime(3)\n"
> "# Default: %Y-%m-%d\\n%T = date in ISO format and time in 24 hour
> clock\n"
> - "# Text is placed in lower right corner",
> + "# Text is placed in lower right corner (default, override with
> timestamp_location)",
> 0,
> - CONF_OFFSET(text_right),
> + CONF_OFFSET(timestamp),
> copy_string,
> print_string
> },
> {
> - "text_left",
> + "timestamp_location",
> + "# Where to place the timestamp-text. Can be upper-left,
> upper-right,\n"
> + "# bottom-left or bottom-right.\n"
> + "# Default: Not defined = bottom-right\n",
> + 0,
> + CONF_OFFSET(timestamp_location),
> + copy_string,
> + print_string
> + },
> + {
> + "generic_text",
> "# Draw a user defined text on the images using same options as C
> function strftime(3)\n"
> "# Default: Not defined = no text\n"
> - "# Text is placed in lower left corner",
> + "# Text is placed in lower left corner (default, override with
> generic_text_location)",
> 0,
> - CONF_OFFSET(text_left),
> + CONF_OFFSET(generic_text),
> copy_string,
> print_string
> },
> - {
> + {
> + "generic_text_location",
> + "# Where to place the generic text. Can be upper-left, upper-right,\n"
> + "# ceter, bottom-left or bottom-right.\n"
> + "# Default: Not defined = bottom-left\n",
> + 0,
> + CONF_OFFSET(generic_text_location),
> + copy_string,
> + print_string
> + },
> + {
> "text_changes",
> "# Draw the number of changed pixed on the images (default: off)\n"
> "# Will normally be set to off except when you setup and adjust the
> motion settings\n"
> @@ -901,6 +925,34 @@
> print_bool
> },
> {
> + "ext_event_udp_listener_port",
> + "# On what UDP port to listen for external (text-)events. They will\n"
> + "# be show on the screen for ext_event_show_time seconds at
> position\n"
> + "# ext_event_location. You can send any text to it.\n",
> + 0,
> + CONF_OFFSET(ext_event_udp_listener_port),
> + copy_int,
> + print_int
> + },
> + {
> + "ext_event_show_time",
> + "# How long to show an external event text.\n",
> + 0,
> + CONF_OFFSET(ext_event_show_time),
> + copy_int,
> + print_int
> + },
> + {
> + "ext_event_location",
> + "# Where to place the external event text. Can be upper-left,
> upper-right,\n"
> + "# bottom-left or bottom-right.\n"
> + "# Default: Not defined = center\n",
> + 0,
> + CONF_OFFSET(ext_event_location),
> + copy_string,
> + print_string
> + },
> + {
> "exif_text",
> "# Text to include in a JPEG EXIF comment\n"
> "# May be any text, including conversion specifiers.\n"
> @@ -1710,7 +1762,7 @@
> /*
> * 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.
> + * leading spaces in timestamp and generic_text.
> */
> if ((beg[0] == '"' && beg[strlen(beg)-1] == '"') ||
> (beg[0] == '\'' && beg[strlen(beg)-1] == '\'')) {
> Index: conf.h
> ===================================================================
> --- conf.h (revision 564)
> +++ conf.h (working copy)
> @@ -124,9 +124,11 @@
> const char *netcam_proxy;
> unsigned int netcam_tolerant_check;
> int text_changes;
> - const char *text_left;
> - const char *text_right;
> + const char *timestamp, *timestamp_location;
> + const char *generic_text, *generic_text_location;
> const char *text_event;
> + int ext_event_udp_listener_port, ext_event_show_time;
> + const char *ext_event_location;
> int text_double;
> const char *despeckle_filter;
> const char *area_detect;
> Index: ffmpeg.c
> ===================================================================
> --- ffmpeg.c (revision 564)
> +++ ffmpeg.c (working copy)
> @@ -374,7 +374,7 @@
> #endif
> /* Manually override the codec id. */
> if (of)
> - of->video_codec = CODEC_ID_MSMPEG4V2;
> + of->video_codec = AV_CODEC_ID_MSMPEG4V2;
>
> } else if (strcmp(codec, "swf") == 0) {
> ext = ".swf";
> @@ -390,7 +390,7 @@
> #else
> of = av_guess_format("flv", NULL, NULL);
> #endif
> - of->video_codec = CODEC_ID_FLV1;
> + of->video_codec = AV_CODEC_ID_FLV1;
> } else if (strcmp(codec, "ffv1") == 0) {
> ext = ".avi";
> #ifdef GUESS_NO_DEPRECATED
> @@ -403,7 +403,7 @@
> * Requires strict_std_compliance to be <= -2
> */
> if (of)
> - of->video_codec = CODEC_ID_FFV1;
> + of->video_codec = AV_CODEC_ID_FFV1;
>
> } else if (strcmp(codec, "mov") == 0) {
> ext = ".mov";
> @@ -499,7 +499,7 @@
>
> /* Create a new video stream and initialize the codecs. */
> ffmpeg->video_st = NULL;
> - if (ffmpeg->oc->oformat->video_codec != CODEC_ID_NONE) {
> + if (ffmpeg->oc->oformat->video_codec != AV_CODEC_ID_NONE) {
> #if defined FF_API_NEW_AVIO
> ffmpeg->video_st = avformat_new_stream(ffmpeg->oc, NULL /* Codec
> */);
> #else
> @@ -526,7 +526,7 @@
> #else
> c->codec_type = AVMEDIA_TYPE_VIDEO;
> #endif
> - is_mpeg1 = c->codec_id == CODEC_ID_MPEG1VIDEO;
> + is_mpeg1 = c->codec_id == AV_CODEC_ID_MPEG1VIDEO;
>
> if (strcmp(ffmpeg_video_codec, "ffv1") == 0)
> c->strict_std_compliance = -2;
> Index: motion-dist.conf.in
> ===================================================================
> --- motion-dist.conf.in (revision 564)
> +++ motion-dist.conf.in (working copy)
> @@ -369,14 +369,24 @@
>
> # Draws the timestamp using same options as C function strftime(3)
> # Default: %Y-%m-%d\n%T = date in ISO format and time in 24 hour clock
> -# Text is placed in lower right corner
> -text_right %Y-%m-%d\n%T-%q
> +# Text is placed default in lower right corner. Change this with
> timestamp_location
> +timestamp %Y-%m-%d\n%T-%q
>
> +# Select where to place the "timestamp".
> +# Default: Not defined = bottom-right
> +# Can be bottom-left, bottom-right, upper-left, upper-right
> +; timestamp bottom-right
> +
> # Draw a user defined text on the images using same options as C function
> strftime(3)
> # Default: Not defined = no text
> -# Text is placed in lower left corner
> -; text_left CAMERA %t
> +# Text is placed default in lower left corner. Change this with
> generic_text_location
> +; generic_text CAMERA %t
>
> +# Select where to place the "generic_text".
> +# Default: Not defined = bottom-left
> +# Can be bottom-left, bottom-right, upper-left, upper-right
> +; generic_text_location bottom-left
> +
> # Draw the number of changed pixed on the images (default: off)
> # Will normally be set to off except when you setup and adjust the motion
> settings
> # Text is placed in upper right corner
> Index: motion.c
> ===================================================================
> --- motion.c (revision 564)
> +++ motion.c (working copy)
> @@ -26,6 +26,10 @@
> static int motion_init(struct context *cnt);
> static void motion_cleanup(struct context *cnt);
>
> +pthread_t ext_event_th;
> +pthread_mutex_t ext_event_lock = PTHREAD_MUTEX_INITIALIZER;
> +const char *ext_event_text = NULL;
> +time_t ext_event_shown_since = 0;
>
> /**
> * tls_key_threadnr
> @@ -73,6 +77,59 @@
> */
> unsigned int restart = 0;
>
> +static void * ext_event_thread(void *p)
> +{
> + struct context *cnt = (struct context *)p;
> + struct sockaddr_in name;
> + int set = 1, fd = -1;
> +
> + if (cnt->conf.ext_event_udp_listener_port <= 0)
> + return NULL;
> +
> + fd = socket(PF_INET, SOCK_DGRAM, 0);
> + if (fd == -1)
> + {
> + fprintf(stderr, "ext event UDP listener: failed creating socket:
> %s\n", strerror(errno));
> + return NULL;
> + }
> +
> + (void)setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &set, sizeof set);
> +
> + name.sin_family = AF_INET;
> + name.sin_port = htons(cnt->conf.ext_event_udp_listener_port);
> + name.sin_addr.s_addr = htonl(INADDR_ANY);
> + if (bind(fd, (struct sockaddr *)&name, sizeof(name)) == -1)
> + {
> + fprintf(stderr, "ext event UDP listener: failed binding socket:
> %s\n", strerror(errno));
> + close(fd);
> + return NULL;
> + }
> +
> + while (!cnt->finish || cnt->makemovie)
> + {
> + char buffer[1024];
> + int rc = recv(fd, buffer, sizeof buffer - 1, 0);
> +
> + if (rc == -1)
> + break;
> +
> + if (rc == 0)
> + continue;
> +
> + buffer[rc] = 0x00;
> +
> + pthread_mutex_lock(&ext_event_lock);
> + free((void *)ext_event_text);
> + ext_event_text = strdup(buffer);
> + ext_event_shown_since = time(NULL);
> + pthread_mutex_unlock(&ext_event_lock);
> + }
> +
> + close(fd);
> +
> + return NULL;
> +}
> +
> /**
> * image_ring_resize
> *
> @@ -942,6 +999,8 @@
> /* 2 sec startup delay so FPS is calculated correct */
> cnt->startup_frames = cnt->conf.frame_limit * 2;
>
> + pthread_create(&ext_event_th, NULL, ext_event_thread, cnt);
> +
> return 0;
> }
>
> @@ -1069,6 +1128,26 @@
> }
> }
>
> +void format_and_draw_text_at_location(struct context *const cnt, const
> char *const text, const char *const location, const char *const
> default_location)
> +{
> + const char *const use_location = location ? location :
> default_location;
> + int size_mul = cnt->conf.text_double ? 2 : 1;
> + char tmp[PATH_MAX];
> + mystrftime(cnt, tmp, sizeof(tmp), text,
> &cnt->current_image->timestamp_tm, NULL, 0);
> +
> + if (strcasecmp(use_location, "bottom-left") == 0)
> + draw_text(cnt->current_image->image, 10, cnt->imgs.height - 10 *
> size_mul, cnt->imgs.width, tmp, cnt->conf.text_double);
> +
> + else if (strcasecmp(use_location, "bottom-right") == 0)
> + draw_text(cnt->current_image->image, cnt->imgs.width - 10,
> cnt->imgs.height - 10 * size_mul, cnt->imgs.width, tmp,
> cnt->conf.text_double);
> +
> + else if (strcasecmp(use_location, "upper-left") == 0)
> + draw_text(cnt->current_image->image, 10, 10, cnt->imgs.width,
> tmp, cnt->conf.text_double);
> +
> + else if (strcasecmp(use_location, "upper-right") == 0)
> + draw_text(cnt->current_image->image, cnt->imgs.width - 10, 10,
> cnt->imgs.width, tmp, cnt->conf.text_double);
> +}
> +
> /**
> * motion_loop
> *
> @@ -1721,26 +1800,31 @@
> cnt->imgs.width, tmp, cnt->conf.text_double);
> }
>
> - /* Add text in lower left corner of the pictures */
> - if (cnt->conf.text_left) {
> - char tmp[PATH_MAX];
> - mystrftime(cnt, tmp, sizeof(tmp), cnt->conf.text_left,
> - &cnt->current_image->timestamp_tm, NULL, 0);
> - draw_text(cnt->current_image->image, 10, cnt->imgs.height
> - 10 * text_size_factor,
> - cnt->imgs.width, tmp, cnt->conf.text_double);
> - }
> + /* Add generic text */
> + if (cnt->conf.generic_text)
> + format_and_draw_text_at_location(cnt,
> cnt->conf.generic_text, cnt->conf.generic_text_location, "bottom-left");
>
> - /* Add text in lower right corner of the pictures */
> - if (cnt->conf.text_right) {
> - char tmp[PATH_MAX];
> - mystrftime(cnt, tmp, sizeof(tmp), cnt->conf.text_right,
> - &cnt->current_image->timestamp_tm, NULL, 0);
> - draw_text(cnt->current_image->image, cnt->imgs.width - 10,
> - cnt->imgs.height - 10 * text_size_factor,
> - cnt->imgs.width, tmp, cnt->conf.text_double);
> + /* Add timestamp */
> + if (cnt->conf.timestamp)
> + format_and_draw_text_at_location(cnt, cnt->conf.timestamp,
> cnt->conf.timestamp_location, "bottom-right");
> +
> + if (cnt->conf.ext_event_udp_listener_port > 0)
> + {
> + time_t now = time(NULL);
> +
> + pthread_mutex_lock(&ext_event_lock);
> +
> + if (now - ext_event_shown_since <=
> cnt->conf.ext_event_show_time && ext_event_text != NULL)
> + format_and_draw_text_at_location(cnt,
> ext_event_text, cnt->conf.ext_event_location, "upper-left");
> + else
> + {
> + free((void *)ext_event_text);
> + ext_event_text = NULL;
> + }
> +
> + pthread_mutex_unlock(&ext_event_lock);
> }
>
> -
> /***** MOTION LOOP - ACTIONS AND EVENT CONTROL SECTION *****/
>
> if (cnt->current_image->diffs > cnt->threshold) {
> Index: motion.h
> ===================================================================
> --- motion.h (revision 564)
> +++ motion.h (working copy)
> @@ -50,6 +50,8 @@
> #include <sys/param.h>
> #include <stdint.h>
>
> +#include <netinet/in.h>
> +
> #define _LINUX_TIME_H 1
> #if defined(HAVE_LINUX_VIDEODEV_H) && (!defined(WITHOUT_V4L)) &&
> (!defined(BSD))
> #include <linux/videodev.h>
>
>
> Folkert van Heusden
>
> --
> To MultiTail einai ena polymorfiko ergaleio gia ta logfiles kai tin
> eksodo twn entolwn. Prosferei: filtrarisma, xrwmatismo, sygxwneysi,
> diaforetikes provoles. http://www.vanheusden.com/multitail/
> ----------------------------------------------------------------------
> Phone: +31-6-41278122, PGP-key: 1F28D8AE, www.vanheusden.com
>
>
> ------------------------------------------------------------------------------
> Go from Idea to Many App Stores Faster with Intel(R) XDK
> Give your users amazing mobile app experiences with Intel(R) XDK.
> Use one codebase in this all-in-one HTML5 development environment.
> Design, debug & build mobile apps & 2D/3D high-impact games for multiple
> OSs.
> http://pubads.g.doubleclick.net/gampad/clk?id=254741551&iu=/4140
> _______________________________________________
> Motion-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/motion-user
> http://www.lavrsen.dk/twiki/bin/view/Motion/WebHome
>
-------------- next part --------------
An HTML attachment was scrubbed...
------------------------------
------------------------------------------------------------------------------
Go from Idea to Many App Stores Faster with Intel(R) XDK
Give your users amazing mobile app experiences with Intel(R) XDK.
Use one codebase in this all-in-one HTML5 development environment.
Design, debug & build mobile apps & 2D/3D high-impact games for multiple OSs.
http://pubads.g.doubleclick.net/gampad/clk?id=254741551&iu=/4140
------------------------------
_______________________________________________
Motion-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/motion-user
End of Motion-user Digest, Vol 114, Issue 5
*******************************************