[vlc-devel] [PATCH] Video_filter motiondetect to send shapes over UDP.
Gonzague Defos du Rau
gonzagueddr at gmail.com
Tue Feb 7 15:14:31 CET 2017
If the option --motiondetect-port is set, detected shapes are sent on localhost over UDP.
Packet looks like "ShapeNumber x_min x_max y_min y_max ;\n..."
---
modules/video_filter/motiondetect.c | 63 +++++++++++++++++++++++++++++++++++++
1 file changed, 63 insertions(+)
diff --git a/modules/video_filter/motiondetect.c b/modules/video_filter/motiondetect.c
index fee7e60..a13d6b8 100644
--- a/modules/video_filter/motiondetect.c
+++ b/modules/video_filter/motiondetect.c
@@ -36,6 +36,7 @@
#include <vlc_picture.h>
#include "filter_picture.h"
+#include <vlc_network.h>
/*****************************************************************************
* Module descriptor
*****************************************************************************/
@@ -44,6 +45,11 @@ static void Destroy ( vlc_object_t * );
#define FILTER_PREFIX "motiondetect-"
+#define PORT_TEXT N_( "motiondetect resend udp port" )
+#define PORT_LONGTEXT N_( \
+ "resend detected boxes values over udp, "\
+ "default port is 0, that means resending is not active" )
+
vlc_module_begin ()
set_description( N_("Motion detect video filter") )
set_shortname( N_( "Motion Detect" ))
@@ -51,6 +57,9 @@ vlc_module_begin ()
set_subcategory( SUBCAT_VIDEO_VFILTER )
set_capability( "video filter", 0 )
+ add_integer(FILTER_PREFIX "port", 0,
+ PORT_TEXT, PORT_LONGTEXT, false)
+
add_shortcut( "motion" )
set_callbacks( Create, Destroy )
vlc_module_end ()
@@ -66,6 +75,11 @@ static int FindShapes( uint32_t *, uint32_t *, int, int, int,
static void Draw( filter_t *p_filter, uint8_t *p_pix, int i_pix_pitch, int i_pix_size );
#define NUM_COLORS (5000)
+/* Boxes UDP resend, options */
+static const char *const ppsz_filter_options[] = {
+ "port", NULL
+};
+
struct filter_sys_t
{
bool is_yuv_planar;
@@ -81,6 +95,10 @@ struct filter_sys_t
int color_x_max[NUM_COLORS];
int color_y_min[NUM_COLORS];
int color_y_max[NUM_COLORS];
+
+ /* Boxes UDP resend , socket */
+ int fd;
+ int port;
};
/*****************************************************************************
@@ -115,6 +133,26 @@ static int Create( vlc_object_t *p_this )
if( p_filter->p_sys == NULL )
return VLC_ENOMEM;
+ /* Boxes UDP resend , open socket */
+ int fd;
+ config_ChainParse( p_filter, FILTER_PREFIX, ppsz_filter_options, p_filter->p_cfg );
+ int i_port = var_CreateGetIntegerCommand( p_filter, FILTER_PREFIX "port" );
+ if( i_port > 0 )
+ {
+ fd = net_ConnectUDP( VLC_OBJECT( p_filter ), "127.0.0.1", i_port, -1 );
+ if (fd == -1)
+ {
+ msg_Err(p_filter, "Can not open socket");
+ i_port = 0 ;
+ p_sys->port = 0 ;
+ }
+ else
+ {
+ p_sys->fd = fd;
+ p_sys->port = i_port ;
+ }
+ }
+
p_sys->is_yuv_planar = is_yuv_planar;
p_sys->b_old = false;
p_sys->p_old = picture_NewFromFormat( p_fmt );
@@ -144,6 +182,11 @@ static void Destroy( vlc_object_t *p_this )
free( p_sys->p_buf2 );
free( p_sys->p_buf );
picture_Release( p_sys->p_old );
+
+ /* Boxes UDP resend , close socket */
+ if( p_sys->port > 0 )
+ net_Close( p_sys->fd );
+
free( p_sys );
}
@@ -522,6 +565,8 @@ static void Draw( filter_t *p_filter, uint8_t *p_pix, int i_pix_pitch, int i_pix
filter_sys_t *p_sys = p_filter->p_sys;
int j = 0;
+
+ char buffer[NUM_COLORS] = "";
for( int i = 1; i < p_sys->i_colors; i++ )
{
@@ -535,6 +580,17 @@ static void Draw( filter_t *p_filter, uint8_t *p_pix, int i_pix_pitch, int i_pix
const int color_y_min = p_sys->color_y_min[i];
const int color_y_max = p_sys->color_y_max[i];
+ /**
+ * Boxes UDP resend, building datas packet.
+ * The packet concatenate lines of boxe's number,
+ * x_min, x_max, y_min and y_max separated by a space,
+ * and ending with "space semi-colon new-line" (" ;\n")
+ */
+ if( p_sys->port > 0)
+ {
+ sprintf(buffer, "%s%d %d %d %d %d ;\n", buffer, j, color_x_min, color_x_max, color_y_min, color_y_max);
+ }
+
if( color_x_min == -1 )
continue;
if( ( color_y_max - color_y_min ) * ( color_x_max - color_x_min ) < 16 )
@@ -558,5 +614,12 @@ static void Draw( filter_t *p_filter, uint8_t *p_pix, int i_pix_pitch, int i_pix
for( y = color_y_min; y <= color_y_max; y++ )
p_pix[y*i_pix_pitch+x*i_pix_size] = 0xff;
}
+
msg_Dbg( p_filter, "Counted %d moving shapes.", j );
+
+ /* Boxes UDP resend, sending buffer */
+ if ( send( p_sys->fd, buffer, sizeof( buffer ), 0 ) <= 0 )
+ {
+ msg_Dbg( p_filter, "Can not send to socket");
+ }
}
--
2.7.4
More information about the vlc-devel
mailing list