aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorN.N. <sevyves@users.sourceforge.net>2005-07-09 19:38:22 +0000
committerN.N. <sevyves@users.sourceforge.net>2005-07-09 19:38:22 +0000
commit36b2d58cbaf75965e67e25ea45d72b5594d43467 (patch)
tree443b3d74290c4b5ed93b6bada26d92b2f3b34a65 /modules
parent304d25a2828076188afbd32757f5a67009ed866b (diff)
PiDiP 0.12.19
svn path=/trunk/externals/pidip/; revision=3312
Diffstat (limited to 'modules')
-rw-r--r--modules/Makefile3
-rw-r--r--modules/Makefile.in1
-rw-r--r--modules/pdp_capture.c6
-rw-r--r--modules/pdp_fdiff.c232
-rw-r--r--modules/pdp_hue.c184
-rw-r--r--modules/pdp_icedthe~.c205
-rw-r--r--modules/pdp_shape.c34
7 files changed, 567 insertions, 98 deletions
diff --git a/modules/Makefile b/modules/Makefile
index c9bd447..bc263e7 100644
--- a/modules/Makefile
+++ b/modules/Makefile
@@ -20,6 +20,7 @@ OBJECTS = pdp_intrusion.o pdp_yqt.o pdp_simura.o pdp_underwatch.o \
pdp_disintegration.o pdp_distance.o pdp_theorin~.o \
pdp_theorout~.o pdp_cropper.o pdp_background.o \
pdp_mapper.o pdp_theonice~.o pdp_icedthe~.o\
- pdp_live~.o pdp_ffmpeg~.o # pdp_xcanvas.o pdp_aa.o
+ pdp_fdiff.o pdp_hue.o \
+ # pdp_xcanvas.o pdp_aa.o
all_modules: $(OBJECTS)
diff --git a/modules/Makefile.in b/modules/Makefile.in
index 88c8bc0..128795c 100644
--- a/modules/Makefile.in
+++ b/modules/Makefile.in
@@ -20,6 +20,7 @@ OBJECTS = pdp_intrusion.o pdp_yqt.o pdp_simura.o pdp_underwatch.o \
pdp_disintegration.o pdp_distance.o pdp_theorin~.o \
pdp_theorout~.o pdp_cropper.o pdp_background.o \
pdp_mapper.o pdp_theonice~.o pdp_icedthe~.o\
+ pdp_fdiff.o pdp_hue.o \
@PDP_STREAMING_OBJECTS@ # pdp_xcanvas.o pdp_aa.o
all_modules: $(OBJECTS)
diff --git a/modules/pdp_capture.c b/modules/pdp_capture.c
index 3231f4d..ccdc5c1 100644
--- a/modules/pdp_capture.c
+++ b/modules/pdp_capture.c
@@ -29,12 +29,18 @@
#include <assert.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
+#include <magick/methods.h>
#include <magick/api.h>
#include <magick/magick.h>
#include <magick/xwindow.h>
#define PDP_DISPLAY_LENGTH 1024
+// trick to handle Image Magick compatibility
+#if MagickLibVersion >= 0x619
+#include "../include/xwindow-private.h"
+#endif
+
static char *pdp_capture_version = "pdp_capture: version 0.1, capture of screen written by Yves Degoyon (ydegoyon@free.fr)";
typedef struct pdp_capture_struct
diff --git a/modules/pdp_fdiff.c b/modules/pdp_fdiff.c
new file mode 100644
index 0000000..aefea1f
--- /dev/null
+++ b/modules/pdp_fdiff.c
@@ -0,0 +1,232 @@
+/*
+ * PiDiP module.
+ * Copyright (c) by Yves Degoyon (ydegoyon@free.fr)
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "pdp.h"
+#include <math.h>
+
+static char *pdp_fdiff_version = "pdp_fdiff: version 0.1, frame difference estimator, written by Yves Degoyon (ydegoyon@free.fr)";
+
+typedef struct pdp_fdiff_struct
+{
+ t_object x_obj;
+ t_float x_f;
+
+ t_outlet *x_outlet0;
+ t_outlet *x_diffy;
+ t_outlet *x_diffu;
+ t_outlet *x_diffv;
+ t_int x_packet0;
+ t_int x_packet1;
+ t_int x_dropped;
+ t_int x_queue_id;
+
+ t_int x_vwidth;
+ t_int x_vheight;
+ t_int x_vsize;
+ unsigned int x_encoding;
+ short int *x_pframe;
+
+} t_pdp_fdiff;
+
+static void pdp_fdiff_allocate(t_pdp_fdiff *x, t_int newsize)
+{
+ int i;
+
+ if ( x->x_pframe != NULL ) freebytes( x->x_pframe, (x->x_vsize + (x->x_vsize>>1))<<1 );
+
+ x->x_vsize = newsize;
+ x->x_pframe = (short int*) getbytes((x->x_vsize + (x->x_vsize>>1))<<1);
+}
+
+static void pdp_fdiff_process_yv12(t_pdp_fdiff *x)
+{
+ t_pdp *header = pdp_packet_header(x->x_packet0);
+ short int *data = (short int *)pdp_packet_data(x->x_packet0);
+ t_pdp *newheader = pdp_packet_header(x->x_packet1);
+ short int *newdata = (short int *)pdp_packet_data(x->x_packet1);
+ int i;
+
+ t_int px, py;
+ short int *diff;
+ short int *sy, *su, *sv, t;
+ short int *sby, *sbu, *sbv;
+ t_int Y=0, U=0, V=0;
+ t_int maxdy=0, maxdu=0, maxdv=0, pdiff;
+
+ /* allocate all ressources */
+ if ( ((int)header->info.image.width != x->x_vwidth ) ||
+ ((int)header->info.image.height != x->x_vheight ) )
+ {
+ pdp_fdiff_allocate(x, header->info.image.width*header->info.image.height );
+ post( "pdp_fdiff : reallocating buffers" );
+ }
+
+ x->x_vwidth = header->info.image.width;
+ x->x_vheight = header->info.image.height;
+ x->x_vsize = x->x_vwidth*x->x_vheight;
+ x->x_encoding = header->info.image.encoding;
+
+ newheader->info.image.encoding = x->x_encoding;
+ newheader->info.image.width = x->x_vwidth;
+ newheader->info.image.height = x->x_vheight;
+
+ sy = data;
+ sv = (data+x->x_vsize);
+ su = (data+x->x_vsize+(x->x_vsize>>2));
+ sby = x->x_pframe;
+ sbv = (x->x_pframe+x->x_vsize);
+ sbu = (x->x_pframe+x->x_vsize+(x->x_vsize>>2));
+ maxdy = 0; maxdv = 0; maxdu =0;
+
+ for(py=0; py<x->x_vheight; py++)
+ {
+ for(px=0; px<x->x_vwidth; px++)
+ {
+ pdiff = abs( *(sy+py*x->x_vwidth+px) - *(sby+py*x->x_vwidth+px) );
+ if ( pdiff > maxdy ) maxdy = pdiff;
+ if ( px%2==0 && py%2==0 )
+ {
+ pdiff = abs( *(su+(py>>1)*(x->x_vwidth>>1)+(px>>1)) - *(sbu+(py>>1)*(x->x_vwidth>>1)+(px>>1)) );
+ if ( pdiff > maxdu ) maxdu = pdiff;
+ pdiff = abs( *(sv+(py>>1)*(x->x_vwidth>>1)+(px>>1)) - *(sbv+(py>>1)*(x->x_vwidth>>1)+(px>>1)) );
+ if ( pdiff > maxdv ) maxdv = pdiff;
+ }
+ }
+ }
+
+ outlet_float( x->x_diffy, (maxdy>>7) );
+ outlet_float( x->x_diffu, (maxdu>>8) );
+ outlet_float( x->x_diffv, (maxdv>>8) );
+
+ /* save previous frame */
+ memcpy( x->x_pframe, data, (( x->x_vsize + (x->x_vsize>>1))<<1));
+ memcpy( newdata, data, (( x->x_vsize + (x->x_vsize>>1))<<1));
+
+ return;
+}
+
+static void pdp_fdiff_sendpacket(t_pdp_fdiff *x)
+{
+ /* release the packet */
+ pdp_packet_mark_unused(x->x_packet0);
+ x->x_packet0 = -1;
+
+ /* unregister and propagate if valid dest packet */
+ pdp_packet_pass_if_valid(x->x_outlet0, &x->x_packet1);
+}
+
+static void pdp_fdiff_process(t_pdp_fdiff *x)
+{
+ int encoding;
+ t_pdp *header = 0;
+
+ /* check if image data packets are compatible */
+ if ( (header = pdp_packet_header(x->x_packet0))
+ && (PDP_IMAGE == header->type)){
+
+ /* pdp_fdiff_process inputs and write into active inlet */
+ switch(pdp_packet_header(x->x_packet0)->info.image.encoding){
+
+ case PDP_IMAGE_YV12:
+ x->x_packet1 = pdp_packet_clone_rw(x->x_packet0);
+ pdp_queue_add(x, pdp_fdiff_process_yv12, pdp_fdiff_sendpacket, &x->x_queue_id);
+ break;
+
+ case PDP_IMAGE_GREY:
+ // pdp_fdiff_process_packet(x);
+ break;
+
+ default:
+ /* don't know the type, so dont pdp_fdiff_process */
+ break;
+
+ }
+ }
+}
+
+static void pdp_fdiff_input_0(t_pdp_fdiff *x, t_symbol *s, t_floatarg f)
+{
+ /* if this is a register_ro message or register_rw message, register with packet factory */
+
+ if (s== gensym("register_rw"))
+ x->x_dropped = pdp_packet_convert_ro_or_drop(&x->x_packet0, (int)f, pdp_gensym("image/YCrCb/*") );
+
+ if ((s == gensym("process")) && (-1 != x->x_packet0) && (!x->x_dropped)){
+
+ /* add the process method and callback to the process queue */
+ pdp_fdiff_process(x);
+
+ }
+}
+
+static void pdp_fdiff_free(t_pdp_fdiff *x)
+{
+ int i;
+
+ pdp_queue_finish(x->x_queue_id);
+ pdp_packet_mark_unused(x->x_packet0);
+
+ if ( x->x_pframe ) freebytes( x->x_pframe, (x->x_vsize + (x->x_vsize>>1))<<1 );
+
+}
+
+t_class *pdp_fdiff_class;
+
+void *pdp_fdiff_new(void)
+{
+ int i;
+
+ t_pdp_fdiff *x = (t_pdp_fdiff *)pd_new(pdp_fdiff_class);
+
+ x->x_outlet0 = outlet_new(&x->x_obj, &s_anything);
+ x->x_diffy = outlet_new(&x->x_obj, &s_float);
+ x->x_diffu = outlet_new(&x->x_obj, &s_float);
+ x->x_diffv = outlet_new(&x->x_obj, &s_float);
+
+ x->x_packet0 = -1;
+ x->x_packet1 = -1;
+ x->x_queue_id = -1;
+
+ x->x_pframe = NULL;
+
+ return (void *)x;
+}
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+void pdp_fdiff_setup(void)
+{
+// post( pdp_fdiff_version );
+ pdp_fdiff_class = class_new(gensym("pdp_fdiff"), (t_newmethod)pdp_fdiff_new,
+ (t_method)pdp_fdiff_free, sizeof(t_pdp_fdiff), 0, A_NULL);
+
+ class_addmethod(pdp_fdiff_class, (t_method)pdp_fdiff_input_0, gensym("pdp"), A_SYMBOL, A_DEFFLOAT, A_NULL);
+ class_sethelpsymbol( pdp_fdiff_class, gensym("pdp_fdiff.pd") );
+
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/pdp_hue.c b/modules/pdp_hue.c
new file mode 100644
index 0000000..28331ff
--- /dev/null
+++ b/modules/pdp_hue.c
@@ -0,0 +1,184 @@
+/*
+ * PiDiP module.
+ * Copyright (c) by Yves Degoyon (ydegoyon@free.fr)
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "pdp.h"
+#include <math.h>
+
+static char *pdp_hue_version = "pdp_hue: version 0.1, frame hue estimator, written by Yves Degoyon (ydegoyon@free.fr)";
+
+typedef struct pdp_hue_struct
+{
+ t_object x_obj;
+ t_float x_f;
+
+ t_outlet *x_meanr;
+ t_outlet *x_meang;
+ t_outlet *x_meanb;
+
+ t_int x_packet0;
+ t_int x_dropped;
+ t_int x_queue_id;
+
+ t_int x_vwidth;
+ t_int x_vheight;
+ t_int x_vsize;
+ unsigned int x_encoding;
+
+} t_pdp_hue;
+
+static void pdp_hue_process_rgb(t_pdp_hue *x)
+{
+ t_pdp *header = pdp_packet_header(x->x_packet0);
+ unsigned char *data = (unsigned char*)pdp_packet_data(x->x_packet0);
+ int i;
+
+ t_int px, py;
+ unsigned char *sr, *sg, *sb;
+ double meanr=0, meang=0, meanb=0;
+ t_int nbpixs=0;
+
+ /* allocate all ressources */
+ x->x_vwidth = header->info.image.width;
+ x->x_vheight = header->info.image.height;
+ x->x_vsize = x->x_vwidth*x->x_vheight;
+ x->x_encoding = header->info.image.encoding;
+
+ sr = data;
+ meanr = 0.; meang = 0.; meanb =0.;
+
+ for(py=0; py<x->x_vheight; py++)
+ {
+ for(px=0; px<x->x_vwidth; px++)
+ {
+ meanr += (double)*(sr);
+ meang += (double)*(sr+1);
+ meanb += (double)*(sr+2);
+ sr+=3;
+ nbpixs++;
+ }
+ }
+ if ( nbpixs > 0 )
+ {
+ meanr = meanr / nbpixs;
+ meang = meang / nbpixs;
+ meanb = meanb / nbpixs;
+ }
+
+ outlet_float( x->x_meanr, (t_float)meanr );
+ outlet_float( x->x_meang, (t_float)meang );
+ outlet_float( x->x_meanb, (t_float)meanb );
+
+ return;
+}
+
+static void pdp_hue_killpacket(t_pdp_hue *x)
+{
+ /* release the packet */
+ pdp_packet_mark_unused(x->x_packet0);
+ x->x_packet0 = -1;
+}
+
+static void pdp_hue_process(t_pdp_hue *x)
+{
+ int encoding;
+ t_pdp *header = 0;
+
+ /* check if image data packets are compatible */
+ if ( (header = pdp_packet_header(x->x_packet0))
+ && (PDP_BITMAP == header->type))
+ {
+
+ /* pdp_hue_process inputs and write into active inlet */
+ switch(pdp_packet_header(x->x_packet0)->info.image.encoding){
+
+ case PDP_BITMAP_RGB:
+ pdp_queue_add(x, pdp_hue_process_rgb, pdp_hue_killpacket, &x->x_queue_id);
+ break;
+
+ default:
+ /* don't know the type, so dont pdp_hue_process */
+ break;
+
+ }
+ }
+}
+
+static void pdp_hue_input_0(t_pdp_hue *x, t_symbol *s, t_floatarg f)
+{
+ /* if this is a register_ro message or register_rw message, register with packet factory */
+
+ if (s== gensym("register_rw"))
+ x->x_dropped = pdp_packet_convert_ro_or_drop(&x->x_packet0, (int)f, pdp_gensym("bitmap/rgb/*") );
+
+ if ((s == gensym("process")) && (-1 != x->x_packet0) && (!x->x_dropped)){
+
+ /* add the process method and callback to the process queue */
+ pdp_hue_process(x);
+
+ }
+}
+
+static void pdp_hue_free(t_pdp_hue *x)
+{
+ int i;
+
+ pdp_queue_finish(x->x_queue_id);
+ pdp_packet_mark_unused(x->x_packet0);
+}
+
+t_class *pdp_hue_class;
+
+void *pdp_hue_new(void)
+{
+ int i;
+
+ t_pdp_hue *x = (t_pdp_hue *)pd_new(pdp_hue_class);
+
+ x->x_meanr = outlet_new(&x->x_obj, &s_float);
+ x->x_meang = outlet_new(&x->x_obj, &s_float);
+ x->x_meanb = outlet_new(&x->x_obj, &s_float);
+
+ x->x_packet0 = -1;
+ x->x_queue_id = -1;
+
+ return (void *)x;
+}
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+void pdp_hue_setup(void)
+{
+// post( pdp_hue_version );
+ pdp_hue_class = class_new(gensym("pdp_hue"), (t_newmethod)pdp_hue_new,
+ (t_method)pdp_hue_free, sizeof(t_pdp_hue), 0, A_NULL);
+
+ class_addmethod(pdp_hue_class, (t_method)pdp_hue_input_0, gensym("pdp"), A_SYMBOL, A_DEFFLOAT, A_NULL);
+ class_sethelpsymbol( pdp_hue_class, gensym("pdp_hue.pd") );
+
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/pdp_icedthe~.c b/modules/pdp_icedthe~.c
index 2a07f96..ee3d959 100644
--- a/modules/pdp_icedthe~.c
+++ b/modules/pdp_icedthe~.c
@@ -112,6 +112,7 @@ typedef struct pdp_icedthe_struct
t_int x_endofstream; // end of the stream reached
t_int x_nbframes; // number of frames emitted
t_float x_framerate; // framerate
+ t_int x_forcedframerate;// the framerate we want to receive
t_int x_samplerate; // audio sample rate
t_int x_audiochannels; // audio channels
t_int x_blocksize; // audio block size
@@ -152,12 +153,20 @@ typedef struct pdp_icedthe_struct
static void pdp_icedthe_priority(t_pdp_icedthe *x, t_floatarg fpriority )
{
- if ( ( x->x_priority >= MIN_PRIORITY ) && ( x->x_priority <= MAX_PRIORITY ) )
+ if ( ( (t_int)fpriority >= MIN_PRIORITY ) && ( (t_int)fpriority <= MAX_PRIORITY ) )
{
x->x_priority = (int)fpriority;
}
}
+static void pdp_icedthe_framerate(t_pdp_icedthe *x, t_floatarg fframerate )
+{
+ if ( fframerate > 0. )
+ {
+ x->x_forcedframerate = (int)fframerate;
+ }
+}
+
static void pdp_icedthe_audio(t_pdp_icedthe *x, t_floatarg faudio )
{
if ( ( faudio == 0. ) || ( faudio == 1. ) )
@@ -392,43 +401,47 @@ static t_int pdp_icedthe_decode_stream(t_pdp_icedthe *x)
}
theora_decode_YUVout(&x->x_theora_state, &x->x_yuvbuffer);
- // create a new pdp packet from PIX_FMT_YUV420P image format
- x->x_vwidth = x->x_yuvbuffer.y_width;
- x->x_vheight = x->x_yuvbuffer.y_height;
- x->x_vsize = x->x_vwidth*x->x_vheight;
- x->x_packet0 = pdp_packet_new_bitmap_yv12( x->x_vwidth, x->x_vheight );
- // post( "pdp_icedthe~ : allocated packet %d", x->x_packet0 );
- x->x_header = pdp_packet_header(x->x_packet0);
- x->x_data = (unsigned char*) pdp_packet_data(x->x_packet0);
-
- x->x_header->info.image.encoding = PDP_BITMAP_YV12;
- x->x_header->info.image.width = x->x_vwidth;
- x->x_header->info.image.height = x->x_vheight;
-
- pY = x->x_data;
- pV = x->x_data+x->x_vsize;
- pU = x->x_data+x->x_vsize+(x->x_vsize>>2);
-
- psY = x->x_yuvbuffer.y;
- psU = x->x_yuvbuffer.u;
- psV = x->x_yuvbuffer.v;
-
- for ( py=0; py<x->x_vheight; py++)
- {
- memcpy( (void*)pY, (void*)psY, x->x_vwidth );
- pY += x->x_vwidth;
- psY += x->x_yuvbuffer.y_stride;
- if ( py%2==0 )
- {
- memcpy( (void*)pU, (void*)psU, (x->x_vwidth>>1) );
- memcpy( (void*)pV, (void*)psV, (x->x_vwidth>>1) );
- pU += (x->x_vwidth>>1);
- pV += (x->x_vwidth>>1);
- psU += x->x_yuvbuffer.uv_stride;
- psV += x->x_yuvbuffer.uv_stride;
- }
+ if ( x->x_secondcount < x->x_forcedframerate )
+ {
+ // create a new pdp packet from PIX_FMT_YUV420P image format
+ x->x_vwidth = x->x_yuvbuffer.y_width;
+ x->x_vheight = x->x_yuvbuffer.y_height;
+ x->x_vsize = x->x_vwidth*x->x_vheight;
+ x->x_packet0 = pdp_packet_new_bitmap_yv12( x->x_vwidth, x->x_vheight );
+ // post( "pdp_icedthe~ : allocated packet %d", x->x_packet0 );
+ x->x_header = pdp_packet_header(x->x_packet0);
+ x->x_data = (unsigned char*) pdp_packet_data(x->x_packet0);
+
+ x->x_header->info.image.encoding = PDP_BITMAP_YV12;
+ x->x_header->info.image.width = x->x_vwidth;
+ x->x_header->info.image.height = x->x_vheight;
+
+ pY = x->x_data;
+ pV = x->x_data+x->x_vsize;
+ pU = x->x_data+x->x_vsize+(x->x_vsize>>2);
+
+ psY = x->x_yuvbuffer.y;
+ psU = x->x_yuvbuffer.u;
+ psV = x->x_yuvbuffer.v;
+
+ for ( py=0; py<x->x_vheight; py++)
+ {
+ memcpy( (void*)pY, (void*)psY, x->x_vwidth );
+ pY += x->x_vwidth;
+ psY += x->x_yuvbuffer.y_stride;
+ if ( py%2==0 )
+ {
+ memcpy( (void*)pU, (void*)psU, (x->x_vwidth>>1) );
+ memcpy( (void*)pV, (void*)psV, (x->x_vwidth>>1) );
+ pU += (x->x_vwidth>>1);
+ pV += (x->x_vwidth>>1);
+ psU += x->x_yuvbuffer.uv_stride;
+ psV += x->x_yuvbuffer.uv_stride;
+ }
+ }
+ x->x_newpicture = 1;
}
- x->x_newpicture = 1;
+
// post( "pdp_icedthe~ : new picture decoded" );
if ( pthread_mutex_unlock( &x->x_videolock ) < 0 )
{
@@ -505,6 +518,58 @@ static void *pdp_icedthe_decode(void *tdata)
return NULL;
}
+static void pdp_icedthe_split_url(t_pdp_icedthe *x)
+{
+ char *hostptr = NULL, *p, *endhost = NULL, *pathptr = NULL;
+ t_int length;
+
+ /* strip http:// or ftp:// */
+ p = x->x_url;
+ if (strncmp(p, "http://", 7) == 0) p+=7;
+
+ hostptr = p;
+ while (*p && *p != '/' && *p != ':') /* look for end of hostname: */ p++;
+
+ endhost = p;
+ switch ( *p )
+ {
+ case ':' :
+ x->x_portnum = atoi( p+1 );
+ while (*p && *p != '/') p++;
+ pathptr = p+1;
+ break;
+ case '/' :
+ x->x_portnum = 8000;
+ pathptr = p+1;
+ break;
+ default :
+ if ( ( p - x->x_url ) != (int)strlen( x->x_url ) )
+ {
+ post( "pdp_icedthe~ : wrong url : %s", hostptr );
+ return;
+ }
+ pathptr = "";
+ break;
+ }
+
+ length = (t_int)(endhost - hostptr);
+ if ( x->x_hostname )
+ {
+ post ("pdp_icedthe~ : freeing hostname" );
+ free( x->x_hostname );
+ }
+ x->x_hostname=(char*)malloc( length + 1);
+ strncpy( x->x_hostname, hostptr, length );
+ x->x_hostname[ length ] = '\0';
+
+ if ( x->x_mountpoint ) free( x->x_mountpoint );
+ x->x_mountpoint=(char*)malloc( strlen( pathptr ) + 1);
+ strncpy( x->x_mountpoint, pathptr, strlen( pathptr ) );
+ x->x_mountpoint[ strlen( pathptr ) ] = '\0';
+
+ post ("pdp_icedthe~ : connecting to host=>%s< port=>%d< mountpoint=>%s<", x->x_hostname, x->x_portnum, x->x_mountpoint );
+}
+
static void pdp_icedthe_connect(t_pdp_icedthe *x, t_symbol *s);
static void *pdp_icedthe_do_connect(void *tdata)
@@ -522,7 +587,6 @@ static void *pdp_icedthe_do_connect(void *tdata)
char *cpoint = NULL;
t_int offset = 0, endofheaders = 0, wpackets = 0;
char *sptr = NULL;
- char *url; /* used for relocation */
if ( x->x_insock != -1 )
{
@@ -530,7 +594,6 @@ static void *pdp_icedthe_do_connect(void *tdata)
pdp_icedthe_disconnect(x);
}
- sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if ( ( sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) ) <= 0 )
{
error("pdp_icedthe~: couldn't obtain a socket");
@@ -624,7 +687,7 @@ static void *pdp_icedthe_do_connect(void *tdata)
}
}
- // post( "pdp_icedthe~ : read HTTP headers : %s", x->x_request );
+ post( "pdp_icedthe~ : read HTTP headers : %s", x->x_request );
post( "pdp_icedthe~ : got HTTP answer" );
strip_ice_header(x->x_request, STRBUF_SIZE);
@@ -639,11 +702,12 @@ static void *pdp_icedthe_do_connect(void *tdata)
x->x_connectchild = 0;
return NULL;
}
- url = strdup(cpoint + 10);
- post("pdp_icedthe~: relocating to %s", url);
- if ( close(sockfd) < 0 ) post("pdp_icedthe~: could not close socket" );
- x->x_connectchild = 0;
- pdp_icedthe_connect(x, gensym(url));
+ if ( x->x_url ) free( x->x_url );
+ x->x_url = strdup(cpoint + 10);
+ post("pdp_icedthe~: relocating to %s", x->x_url);
+ pdp_icedthe_split_url(x);
+ x->x_connected = 0;
+ pdp_icedthe_do_connect(x);
return NULL;
}
if ( !(sptr = strstr(x->x_request, "200")) )
@@ -1049,9 +1113,8 @@ static void *pdp_icedthe_do_connect(void *tdata)
static void pdp_icedthe_connect(t_pdp_icedthe *x, t_symbol *s)
{
- t_int ret, i, length;
+ t_int ret, i;
pthread_attr_t connect_child_attr;
- char *hostptr = NULL, *p, *endhost = NULL, *pathptr = NULL;
if ( x->x_connectchild != 0 )
{
@@ -1071,51 +1134,7 @@ static void pdp_icedthe_connect(t_pdp_icedthe *x, t_symbol *s)
post ("pdp_icedthe~ : connecting to url=%s", x->x_url );
- /* strip http:// or ftp:// */
- p = x->x_url;
- if (strncmp(p, "http://", 7) == 0) p+=7;
-
- hostptr = p;
- while (*p && *p != '/' && *p != ':') /* look for end of hostname: */ p++;
-
- endhost = p;
- switch ( *p )
- {
- case ':' :
- x->x_portnum = atoi( p+1 );
- while (*p && *p != '/') p++;
- pathptr = p+1;
- break;
- case '/' :
- x->x_portnum = 8000;
- pathptr = p+1;
- break;
- default :
- if ( ( p - x->x_url ) != (int)strlen( x->x_url ) )
- {
- post( "pdp_icedthe~ : wrong url : %s", hostptr );
- return;
- }
- pathptr = "";
- break;
- }
-
- length = (t_int)(endhost - hostptr);
- if ( x->x_hostname )
- {
- post ("pdp_icedthe~ : freeing hostname" );
- free( x->x_hostname );
- }
- x->x_hostname=(char*)malloc( length + 1);
- strncpy( x->x_hostname, hostptr, length );
- x->x_hostname[ length ] = '\0';
-
- if ( x->x_mountpoint ) free( x->x_mountpoint );
- x->x_mountpoint=(char*)malloc( strlen( pathptr ) + 1);
- strncpy( x->x_mountpoint, pathptr, strlen( pathptr ) );
- x->x_mountpoint[ strlen( pathptr ) ] = '\0';
-
- post ("pdp_icedthe~ : connecting to host=%s port=%d mountpoint=%s", x->x_hostname, x->x_portnum, x->x_mountpoint );
+ pdp_icedthe_split_url(x);
// launch connection thread
if ( pthread_attr_init( &connect_child_attr ) < 0 ) {
@@ -1313,6 +1332,7 @@ void *pdp_icedthe_new(void)
x->x_theorainit = 0;
x->x_priority = DEFAULT_PRIORITY;
x->x_framerate = DEFAULT_FRAME_RATE;
+ x->x_forcedframerate = 1024; // think it will not occur or maybe in 2156
x->x_nbframes = 0;
x->x_samplerate = 0;
x->x_audio = 1;
@@ -1359,6 +1379,7 @@ void pdp_icedthe_tilde_setup(void)
class_addmethod(pdp_icedthe_class, (t_method)pdp_icedthe_connect, gensym("connect"), A_SYMBOL, A_NULL);
class_addmethod(pdp_icedthe_class, (t_method)pdp_icedthe_disconnect, gensym("disconnect"), A_NULL);
class_addmethod(pdp_icedthe_class, (t_method)pdp_icedthe_priority, gensym("priority"), A_FLOAT, A_NULL);
+ class_addmethod(pdp_icedthe_class, (t_method)pdp_icedthe_framerate, gensym("framerate"), A_FLOAT, A_NULL);
class_addmethod(pdp_icedthe_class, (t_method)pdp_icedthe_audio, gensym("audio"), A_FLOAT, A_NULL);
class_sethelpsymbol( pdp_icedthe_class, gensym("pdp_icedthe~.pd") );
diff --git a/modules/pdp_shape.c b/modules/pdp_shape.c
index 5f21518..6a1ed13 100644
--- a/modules/pdp_shape.c
+++ b/modules/pdp_shape.c
@@ -54,9 +54,10 @@ typedef struct pdp_shape_struct
t_int x_colorU;
t_int x_colorV;
- t_int x_tolerance; // tolerance
- t_int x_paint; // paint option
- t_int x_shape; // drawing shape option
+ t_int x_tolerance; // tolerance
+ t_int x_paint; // paint option
+ t_int x_isolate; // isolate option
+ t_int x_shape; // drawing shape option
t_int x_luminosity; // use luminosity or not
short int *x_bdata;
@@ -106,6 +107,14 @@ static void pdp_shape_luminosity(t_pdp_shape *x, t_floatarg fluminosity )
}
}
+static void pdp_shape_isolate(t_pdp_shape *x, t_floatarg fisolate )
+{
+ if ( ( fisolate == 0 ) || ( fisolate == 1 ) )
+ {
+ x->x_isolate = (int)fisolate;
+ }
+}
+
static void pdp_shape_paint(t_pdp_shape *x, t_floatarg fpaint )
{
if ( ( (t_int)fpaint == 0 ) || ( (t_int)fpaint == 1 ) )
@@ -300,6 +309,12 @@ static void pdp_shape_do_detect(t_pdp_shape *x, t_floatarg X, t_floatarg Y)
}
else
{
+ if ( x->x_isolate )
+ {
+ *(pbbY+nY*x->x_vwidth+nX) = *(pbY+nY*x->x_vwidth+nX);
+ *(pbbU+(nY>>1)*(x->x_vwidth>>1)+(nX>>1)) = *(pbU+(nY>>1)*(x->x_vwidth>>1)+(nX>>1));
+ *(pbbV+(nY>>1)*(x->x_vwidth>>1)+(nX>>1)) = *(pbV+(nY>>1)*(x->x_vwidth>>1)+(nX>>1));
+ }
if ( x->x_paint )
{
*(pbbY+nY*x->x_vwidth+nX) =
@@ -446,12 +461,19 @@ static void pdp_shape_process_yv12(t_pdp_shape *x)
newheader->info.image.height = x->x_vheight;
memcpy( x->x_bdata, data, (x->x_vsize+(x->x_vsize>>1))<<1 );
- memcpy( x->x_bbdata, data, (x->x_vsize+(x->x_vsize>>1))<<1 );
+ if ( !x->x_isolate )
+ {
+ memcpy( x->x_bbdata, data, (x->x_vsize+(x->x_vsize>>1))<<1 );
+ }
+ else
+ {
+ memset( x->x_bbdata, 0x0, (x->x_vsize+(x->x_vsize>>1))<<1 );
+ }
if ( x->x_cursX != -1 ) pdp_shape_frame_detect( x, x->x_cursX, x->x_cursY );
// paint cursor in red for debug purpose
- if ( x->x_cursX != -1 )
+ if ( ( x->x_cursX != -1 ) && ( x->x_shape ) )
{
pbbY = x->x_bbdata;
pbbU = (x->x_bbdata+x->x_vsize);
@@ -557,6 +579,7 @@ void *pdp_shape_new(void)
x->x_tolerance = 20;
x->x_paint = 0;
+ x->x_isolate = 0;
x->x_shape = 1;
x->x_luminosity = 1;
@@ -589,6 +612,7 @@ void pdp_shape_setup(void)
class_addmethod(pdp_shape_class, (t_method)pdp_shape_detect, gensym("detect"), A_DEFFLOAT, A_DEFFLOAT, A_NULL);
class_addmethod(pdp_shape_class, (t_method)pdp_shape_rgb, gensym("rgb"), A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, A_NULL);
class_addmethod(pdp_shape_class, (t_method)pdp_shape_tolerance, gensym("tolerance"), A_FLOAT, A_NULL);
+ class_addmethod(pdp_shape_class, (t_method)pdp_shape_isolate, gensym("isolate"), A_FLOAT, A_NULL);
class_addmethod(pdp_shape_class, (t_method)pdp_shape_paint, gensym("paint"), A_FLOAT, A_NULL);
class_addmethod(pdp_shape_class, (t_method)pdp_shape_shape, gensym("shape"), A_FLOAT, A_NULL);
class_addmethod(pdp_shape_class, (t_method)pdp_shape_luminosity, gensym("luminosity"), A_FLOAT, A_NULL);