diff --git a/veejay-current/veejay-client/configure.ac b/veejay-current/veejay-client/configure.ac
index 770158f3..1fe59615 100644
--- a/veejay-current/veejay-client/configure.ac
+++ b/veejay-current/veejay-client/configure.ac
@@ -1,12 +1,12 @@
dnl Process this file with autoconf to produce a configure script.
dnl AC_INIT
-AC_INIT([reloaded],[1.5.9],[nwelburg@gmail.com])
+AC_INIT([reloaded],[1.5.17],[nwelburg@gmail.com])
AC_PREREQ(2.57)
AC_CONFIG_SRCDIR([src/gveejay.c])
RELOADED_MAJOR_VERSION=1
RELOADED_MINOR_VERSION=5
-RELOADED_MICRO_VERSION=9
+RELOADED_MICRO_VERSION=17
RELOADED_VERSION=$VEEJAY_MAJOR_VERSION.$VEEJAY_MINOR_VERSION.$VEEJAY_MICRO_VERSION
RELOADED_CODENAME="Reloaded - build $RELOADED_MAJOR_VERSION $RELOADED_MINOR_VERSION $RELOADED_MICRO_VERSION"
AC_CONFIG_HEADERS([config.h])
diff --git a/veejay-current/veejay-client/share/gveejay.reloaded.glade b/veejay-current/veejay-client/share/gveejay.reloaded.glade
index 83c15541..16dd51e6 100644
--- a/veejay-current/veejay-client/share/gveejay.reloaded.glade
+++ b/veejay-current/veejay-client/share/gveejay.reloaded.glade
@@ -15533,7 +15533,144 @@ YUV (current)
-
+
+ True
+ False
+ 0
+
+
+
+ True
+ shm in
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 6
+ 0
+ PANGO_ELLIPSIZE_NONE
+ -1
+ False
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ Create new input from veejay on port 3490
+ True
+ 3490
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ Create new input from veejay on port 4490
+ True
+ 4490
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ Create new input from veejay on port 5490
+ True
+ 5490
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ Create new input from veejay on port 6490
+ True
+ 6490
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ Create new input from veejay on port 7490
+ True
+ 7490
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+ 0
+ False
+ False
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+ 0
+ False
+ False
+
@@ -18305,4 +18442,37 @@ YUV (current)
+
+ True
+ Create new input from veejay on port 3490
+ True
+ 1
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+
+ True
+ Create new input from veejay on port 3490
+ True
+ 1
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+
+ True
+ Create new input from veejay on port 3490
+ True
+ 1
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
diff --git a/veejay-current/veejay-client/share/reloaded_classic.glade b/veejay-current/veejay-client/share/reloaded_classic.glade
index a61514df..1a75294c 100644
--- a/veejay-current/veejay-client/share/reloaded_classic.glade
+++ b/veejay-current/veejay-client/share/reloaded_classic.glade
@@ -978,7 +978,8 @@
True
- False
+ True
+ True
False
GTK_POS_TOP
False
@@ -15745,6 +15746,321 @@ MLZO
+
+
+ True
+ True
+ False
+ 0
+
+
+
+ True
+ 0
+ 0.5
+ GTK_SHADOW_NONE
+
+
+
+ True
+ 0.5
+ 0.5
+ 1
+ 0.0799999982119
+ 0
+ 0
+ 12
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ veejay port
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+ PANGO_ELLIPSIZE_NONE
+ -1
+ False
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ True
+ True
+ True
+ 0
+ 3490
+ True
+ *
+ False
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ True
+ Create
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+
+
+
+
+
+
+ True
+ <b>SHM</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+ PANGO_ELLIPSIZE_NONE
+ -1
+ False
+ 0
+
+
+ label_item
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ True
+ False
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ True
+ GTK_POLICY_ALWAYS
+ GTK_POLICY_ALWAYS
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ Single click to select, then fill in optional args and press create
+ True
+ True
+ False
+ False
+ True
+ False
+ False
+ False
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ 0
+ 0.5
+ GTK_SHADOW_NONE
+
+
+
+ True
+ 0.5
+ 0.5
+ 1
+ 0.0599999986589
+ 0
+ 0
+ 12
+ 0
+
+
+
+ True
+ False
+ 0
+
+
+
+ True
+ args:
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+ PANGO_ELLIPSIZE_NONE
+ -1
+ False
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ True
+ True
+ True
+ 0
+
+ True
+ *
+ False
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ True
+ Create
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+
+
+
+ True
+ <b>Plugins</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+ PANGO_ELLIPSIZE_NONE
+ -1
+ False
+ 0
+
+
+ label_item
+
+
+
+
+ 0
+ True
+ True
+
+
+
True
diff --git a/veejay-current/veejay-client/src/callback.c b/veejay-current/veejay-client/src/callback.c
index b6564992..286c3102 100644
--- a/veejay-current/veejay-client/src/callback.c
+++ b/veejay-current/veejay-client/src/callback.c
@@ -1004,7 +1004,46 @@ void on_spin_streamduration_value_changed(GtkWidget *widget , gpointer user_data
update_label_str( "label_streamrecord_duration", time );
g_free(time);
}
+void on_new_shm_stream_clicked(GtkWidget *wid, gpointer data)
+{
+ char *port = get_text("shm_text_port");
+ multi_vims( VIMS_STREAM_NEW_SHARED, "%s", port );
+ gveejay_new_slot(MODE_STREAM);
+}
+void on_new_generator_stream_clicked(GtkWidget *wid, gpointer data)
+{
+ // generator_text_args optionals args
+ // tree_generators get selected row
+ // VIMS_STREAM_NEW_GENERATOR
+ veejay_msg(0, "implemented me");
+}
+
+void on_shm_3490_clicked(GtkWidget *w, gpointer data)
+{
+ multi_vims( VIMS_STREAM_NEW_SHARED, "%d", 3490 );
+ gveejay_new_slot(MODE_STREAM);
+}
+void on_shm_4490_clicked(GtkWidget *w, gpointer data)
+{
+ multi_vims( VIMS_STREAM_NEW_SHARED, "%d", 4490 );
+ gveejay_new_slot(MODE_STREAM);
+}
+void on_shm_5490_clicked(GtkWidget *w, gpointer data)
+{
+ multi_vims( VIMS_STREAM_NEW_SHARED, "%d", 5490 );
+ gveejay_new_slot(MODE_STREAM);
+}
+void on_shm_6490_clicked(GtkWidget *w, gpointer data)
+{
+ multi_vims( VIMS_STREAM_NEW_SHARED, "%d", 6490 );
+ gveejay_new_slot(MODE_STREAM);
+}
+void on_shm_7490_clicked(GtkWidget *w, gpointer data)
+{
+ multi_vims( VIMS_STREAM_NEW_SHARED, "%d", 7490 );
+ gveejay_new_slot(MODE_STREAM);
+}
void on_button_sample_recordstart_clicked(GtkWidget *widget, gpointer user_data)
{
diff --git a/veejay-current/veejay-server/README b/veejay-current/veejay-server/README
index cc090722..12b17912 100644
--- a/veejay-current/veejay-server/README
+++ b/veejay-current/veejay-server/README
@@ -30,6 +30,27 @@ It allows you to "play" the video like you would play a piano.
While playing, you can record the resulting video directly to disk (video sampling).
+====== quick install:
+
+ order of packages:
+ veejay-server, veejay-client, veejay-utils
+
+ for each package:
+ ./configure
+ make && make install
+
+
+ for plugins:
+
+ cd veejay-sever/livido-plugins
+ ./RUNME.sh /tmp/plugins
+
+ mkdir ~/.veejay # or start veejay
+ echo "/tmp/plugins" >> ~/.veejay/plugins.cfg
+
+
+
+
FEATURE OVERVIEW
diff --git a/veejay-current/veejay-server/configure.ac b/veejay-current/veejay-server/configure.ac
index d40a6193..80e8cc31 100644
--- a/veejay-current/veejay-server/configure.ac
+++ b/veejay-current/veejay-server/configure.ac
@@ -1,12 +1,12 @@
dnl Process this file with autoconf to produce a configure script.
dnl AC_INIT
-AC_INIT([veejay],[1.5.16],[veejay-users@lists.sourceforge.net])
+AC_INIT([veejay],[1.5.17],[veejay-users@lists.sourceforge.net])
AC_PREREQ(2.57)
AC_CONFIG_SRCDIR([veejay/veejay.c])
VEEJAY_MAJOR_VERSION=1
VEEJAY_MINOR_VERSION=5
-VEEJAY_MICRO_VERSION=16
+VEEJAY_MICRO_VERSION=17
VEEJAY_VERSION=$VEEJAY_MAJOR_VERSION.$VEEJAY_MINOR_VERSION.$VEEJAY_MICRO_VERSION
VEEJAY_CODENAME="Veejay Classic - build $VEEJAY_MINOR_VERSION $VEEJAY_MICRO_VERSION"
AC_CONFIG_HEADERS([config.h])
diff --git a/veejay-current/veejay-server/libplugger/Makefile.am b/veejay-current/veejay-server/libplugger/Makefile.am
index d1cab395..423aa1b3 100644
--- a/veejay-current/veejay-server/libplugger/Makefile.am
+++ b/veejay-current/veejay-server/libplugger/Makefile.am
@@ -7,5 +7,5 @@ AM_CFLAGS = $(CFLAGS) $(FREEFRAME_CFLAGS)
LIBVJPLUG_LIB_FILE = libvjplug.la
noinst_LTLIBRARIES = $(LIBVJPLUG_LIB_FILE)
-libvjplug_la_SOURCES = utility.c freeframe-loader.c frei0r-loader.c livido-loader.c plugload.c
+libvjplug_la_SOURCES = utility.c weed-utils.c freeframe-loader.c frei0r-loader.c livido-loader.c plugload.c
diff --git a/veejay-current/veejay-server/libplugger/livido-loader.c b/veejay-current/veejay-server/libplugger/livido-loader.c
index 3076d40b..0c654572 100644
--- a/veejay-current/veejay-server/libplugger/livido-loader.c
+++ b/veejay-current/veejay-server/libplugger/livido-loader.c
@@ -1047,8 +1047,6 @@ void *livido_plug_init(void *plugin,int w, int h, int base_fmt_ )
shmid = vj_shm_get_id(); //@ put in HOST value
error = vevo_property_set( filter_instance,"HOST_shmid", VEVO_ATOM_TYPE_INT,1,&shmid );
}
- veejay_msg(0, "HOST_shmid err=%d",error);
-
error = (*init_f)( (livido_port_t*) filter_instance );
if( error != LIVIDO_NO_ERROR ) {
diff --git a/veejay-current/veejay-server/libplugger/plugload.c b/veejay-current/veejay-server/libplugger/plugload.c
index aad0b4aa..16c737d7 100644
--- a/veejay-current/veejay-server/libplugger/plugload.c
+++ b/veejay-current/veejay-server/libplugger/plugload.c
@@ -315,8 +315,6 @@ int plug_get_idx_by_so_name( char *soname )
char *str = vevo_property_get_string( index_map_[i], "so_name" );
if( str == NULL )
continue;
- veejay_msg(0, "'%s' vs '%s'", str,soname );
-
if( strcmp( soname,str ) == 0 )
return i;
diff --git a/veejay-current/veejay-server/libstream/vj-net.c b/veejay-current/veejay-server/libstream/vj-net.c
index b28e6515..dd3702e3 100644
--- a/veejay-current/veejay-server/libstream/vj-net.c
+++ b/veejay-current/veejay-server/libstream/vj-net.c
@@ -104,12 +104,12 @@ void *reader_thread(void *data)
lock(t);
- if( t->grab && tag->source_type == VJ_TAG_TYPE_NET && retrieve == 0 ) {
+ if(!error && t->grab && tag->source_type == VJ_TAG_TYPE_NET && retrieve == 0 ) {
ret = vj_client_send( v, V_CMD, buf );
- if( ret < 0 )
+ if( ret <= 0 )
{
veejay_msg(VEEJAY_MSG_DEBUG,
- "%s:%d failed to query frame",
+ "Error sending get frame command to %s:%d",
tag->source_name,
tag->video_channel );
@@ -121,7 +121,7 @@ void *reader_thread(void *data)
}
}
- if( tag->source_type == VJ_TAG_TYPE_NET )
+ if(!error && tag->source_type == VJ_TAG_TYPE_NET )
{
res = vj_client_poll(v, V_CMD );
if( ret )
@@ -129,7 +129,7 @@ void *reader_thread(void *data)
retrieve = 1;
} else if ( ret < 0 ) {
veejay_msg(VEEJAY_MSG_DEBUG,
- "%s:%d failed to poll frame",
+ "Error polling connection %s:%d",
tag->source_name,
tag->video_channel );
error = 1;
@@ -142,7 +142,7 @@ void *reader_thread(void *data)
res = 1;
}
- long wait_time = 20;
+ long wait_time = 0;
if(!error && retrieve)
{
@@ -151,14 +151,14 @@ void *reader_thread(void *data)
ret = vj_client_read_i ( v, tag->socket_frame,tag->socket_len );
if( ret <= 0 )
{
- // if( tag->source_type == VJ_TAG_TYPE_NET )
- // {
+ if( tag->source_type == VJ_TAG_TYPE_NET )
+ {
veejay_msg(VEEJAY_MSG_DEBUG,
- "%s:%d failed to read frame",
+ "Error reading video frame from %s:%d",
tag->source_name,
tag->video_channel );
error = 1;
- // }
+ }
// else
// {
// wait_time += 10;
@@ -182,9 +182,9 @@ void *reader_thread(void *data)
if( wait_time )
{
- if ( wait_time > 40 )
- wait_time = 15;
- net_delay( wait_time,0 );
+ if ( wait_time > 15 )
+ wait_time = 10;
+ //net_delay( wait_time,0 );
wait_time = 0;
}
@@ -249,8 +249,8 @@ int net_thread_get_frame( vj_tag *tag, uint8_t *buffer[3] )
int uv_len = len;
switch(v->cur_fmt)
{
- case FMT_420:
- case FMT_420F:
+ case PIX_FMT_YUV420P:
+ case PIX_FMT_YUVJ420P:
uv_len=len/4;
break;
default:
@@ -269,25 +269,35 @@ int net_thread_get_frame( vj_tag *tag, uint8_t *buffer[3] )
}
else if(t->have_frame == 2 )
{
- int b_len = v->in_width * v->in_height;
- int buvlen = b_len;
- switch(v->in_fmt)
- {
- case FMT_420:
- case FMT_420F:
- buvlen = b_len/4;
- break;
- default:
- buvlen = b_len/2;
- break;
+ VJFrame *a = NULL;
+ VJFrame *b = NULL;
+
+ if( v->in_fmt == PIX_FMT_RGB24 || v->in_fmt == PIX_FMT_BGR24 || v->in_fmt == PIX_FMT_RGBA ||
+ v->in_fmt == PIX_FMT_RGB32_1 ) {
+
+ a = yuv_rgb_template( tag->socket_frame, v->in_width, v->in_width, v->in_fmt );
+
+ } else {
+ int b_len = v->in_width * v->in_height;
+ int buvlen = b_len;
+
+ switch(v->in_fmt)
+ {
+ case PIX_FMT_YUV420P:
+ case PIX_FMT_YUVJ420P:
+ buvlen = b_len/4;
+ break;
+ default:
+ buvlen = b_len/2;
+ break;
+ }
+
+
+ a =yuv_yuv_template( tag->socket_frame, tag->socket_frame + b_len, tag->socket_frame+b_len+buvlen,
+ v->in_width,v->in_height, v->in_fmt);
}
- int tmp_fmt = get_ffmpeg_pixfmt( v->in_fmt );
-
- VJFrame *a = yuv_yuv_template( tag->socket_frame, tag->socket_frame + b_len, tag->socket_frame+b_len+buvlen,
- v->in_width,v->in_height, tmp_fmt);
- VJFrame *b = yuv_yuv_template( buffer[0],buffer[1], buffer[2],
- v->cur_width,v->cur_height,get_ffmpeg_pixfmt(v->cur_fmt));
+ b = yuv_yuv_template( buffer[0],buffer[1], buffer[2],v->cur_width,v->cur_height,v->cur_fmt);
yuv_convert_any_ac(a,b, a->format,b->format );
free(a);
free(b);
diff --git a/veejay-current/veejay-server/libstream/vj-tag.c b/veejay-current/veejay-server/libstream/vj-tag.c
index e2352228..b841538c 100644
--- a/veejay-current/veejay-server/libstream/vj-tag.c
+++ b/veejay-current/veejay-server/libstream/vj-tag.c
@@ -1093,7 +1093,7 @@ int _vj_tag_new_unicap( vj_tag * tag, int stream_nr, int width, int height, int
tag->active = 1;
break;
case VJ_TAG_TYPE_SPLITTER:
- sprintf(tag->source_name, "[SPLITTER]");
+ sprintf(tag->source_name, "[Three Split]");
tag->generator = vj_split_display( el->video_width, el->video_height );
if(tag->generator==NULL ) {
return -1;
@@ -1384,9 +1384,12 @@ int vj_tag_del(int id)
}
break;
case VJ_TAG_TYPE_COLOR:
+ break;
case VJ_TAG_TYPE_SPLITTER:
- // FIXME
- break;
+ if(tag->generator) {
+ vj_split_destroy(tag->generator);
+ }
+ break;
case VJ_TAG_TYPE_GENERATOR:
if( tag->generator ) {
// plug_deactivate( tag->generator );
@@ -3759,21 +3762,12 @@ int vj_tag_get_frame(int t1, uint8_t *buffer[3], uint8_t * abuffer)
break;
#ifdef SUPPORT_READ_DV2
- case VJ_TAG_TYPE_DV1394:
- vj_dv1394_read_frame( vj_tag_input->dv1394[tag->index], buffer , abuffer,vj_tag_input->pix_fmt);
- break;
+ case VJ_TAG_TYPE_DV1394:
+ vj_dv1394_read_frame( vj_tag_input->dv1394[tag->index], buffer , abuffer,vj_tag_input->pix_fmt);
+ break;
#endif
case VJ_TAG_TYPE_SPLITTER:
-
- tag->color_r = 7;
-
-
- vj_split_change_screen_setup( tag->generator, tag->color_r );
-
- //vj_split_set_stream_in_screen( tag->generator, tag->color_g, tag->color_b );
-
vj_split_process_frame( tag->generator, buffer );
-
break;
case VJ_TAG_TYPE_GENERATOR:
_tmp.len = len;
diff --git a/veejay-current/veejay-server/libvjnet/cmd.c b/veejay-current/veejay-server/libvjnet/cmd.c
index b1b6ec81..8719e708 100644
--- a/veejay-current/veejay-server/libvjnet/cmd.c
+++ b/veejay-current/veejay-server/libvjnet/cmd.c
@@ -33,6 +33,7 @@
vj_sock_t *alloc_sock_t(void)
{
vj_sock_t *s = (vj_sock_t*) malloc(sizeof(vj_sock_t));
+ memset( s, 0, sizeof(vj_sock_t));
if(!s) return NULL;
return s;
}
@@ -274,26 +275,31 @@ int sock_t_send_fd( int fd, int send_size, unsigned char *buf, int len )
assert( buf != NULL );
#endif
- int length = len;
- int bw = 0;
- int done = 0;
+ unsigned int length = len;
+ unsigned int done = 0;
+ unsigned char *ptr = buf;
while( length > 0 ) {
- bw = length;
- n = send( fd, buf, length , 0 );
+ n = send( fd, ptr, length , 0 );
if( n == -1 ) {
-#ifdef STRICT_CHECKING
veejay_msg(0, "Error sending buffer:%s", strerror(errno));
return -1;
-#endif
}
+
if( n == 0 ) {
veejay_msg(VEEJAY_MSG_DEBUG, "Remote closed connection.");
return 0;
}
- buf += n;
- length -= n;
- done += n;
+
+ ptr += n; //@ advance ptr by bytes send
+ length -= n; //@ decrement length by bytes send
+ done += n; //@ keep count of bytes done
}
+
+#ifdef STRICT_CHECKING
+ assert( length == 0 );
+ assert( done == len );
+#endif
+
return done;
}
@@ -303,7 +309,7 @@ void sock_t_close( vj_sock_t *s )
if(s)
{
close(s->sock_fd);
- s->sock_fd = 0;
+ s->sock_fd = -1;
FD_ZERO(&(s->rds));
FD_ZERO(&(s->wds));
}
diff --git a/veejay-current/veejay-server/libvjnet/vj-client.c b/veejay-current/veejay-server/libvjnet/vj-client.c
index c8aadeb6..fe06c2ec 100644
--- a/veejay-current/veejay-server/libvjnet/vj-client.c
+++ b/veejay-current/veejay-server/libvjnet/vj-client.c
@@ -36,6 +36,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -60,7 +61,7 @@ vj_client *vj_client_alloc( int w, int h, int f )
}
v->cur_width = w;
v->cur_height = h;
- v->cur_fmt = f;
+ v->cur_fmt = get_ffmpeg_pixfmt(f);
v->space = NULL;
v->c = (conn_type_t**) malloc(sizeof(conn_type_t*) * 3);
v->c[0] = (conn_type_t*) malloc(sizeof(conn_type_t));
@@ -292,12 +293,113 @@ static uint32_t getint(uint8_t *in, int len ) {
free(word);
return (uint32_t) v;
}
+/*
+#define LIVES_HEADER_LENGTH 1024
+#define SALSAMAN_DATASIZE 3
+#define SALSAMAN_HSIZE 5
+#define SALSAMAN_VSIZE 6
+#define SALSAMAN_SUBSPACE 11
+static int vj_client_parse_salsaman( vj_client *v,uint8_t *partial_header, int partial_size, int *dst, uint8_t *header )
+{
+ uint8_t header[LIVES_HEADER_LENGTH];
+ memset( header,0,sizeof(LIVES_HEADER_LENGTH ));
+ memcpy( header, partial_header, partial_size );
+
+ uint8_t *header_ptr = header + partial_size;
+
+ //@ read rest of LiVES header
+ int rest = sock_t_recv( v->c[0]->fd, header_ptr, LIVES_HEADER_LENGTH - partial_header );
+
+ //@ values are space seperated
+ gchar **tokens = g_strsplit( header, " ", -1 );
+ if( tokens == NULL || tokens[0] == NULL ) {
+ if( tokens != NULL ) free(tokens);
+ return 0;
+ }
+
+ //@ fetch the values into vars
+ dst[0] = atoi( header[0] );
+ dst[1] = 0; //
+
+ dst[2] = atoi( header[2] ); // flags uint32
+ dst[SALSAMAN_DATASIZE] = atoi( header[SALSAMAN_DATASIZE] ); // dsize size_t
+
+ dst[4] = 0;
+
+ dst[5] = atoi( header[5] ); //@ hsize int
+ dst[6] = atoi( header[6] ); //@ vsize int
+ dst[7] = g_strtod( header[7], NULL ); // fps double
+ dst[8] = atoi( header[8] ); // palette int
+ dst[9] = atoi( header[9] ); // yuv sampling int
+ dst[10] = atoi( header[10] ); // clamp int
+ dst[11] = atoi( header[11] ); // subspace int
+ dst[12] = atoi( header[12] ); // compression type int
+
+ g_strfreev( tokens );
+ return 1;
+}
+*/
+
+/* packet negotation.
+ * read a small portion (44 bytes for veejay, its veejay's full header size)
+ * and try to identify which software is sending frames
+ *
+ */
+
+static int vj_client_packet_negotiate( vj_client *v, int *tokens )
+{
+ uint8_t line[45];
+
+ //@ 1. read 44 bytes and see if its us
+ veejay_memset( line,0, sizeof(line));
+ int plen = sock_t_recv( v->c[0]->fd, line, 44 );
+ if( plen == 0 ) {
+ veejay_msg(VEEJAY_MSG_DEBUG, "Remote closed connection.");
+ return -1;
+ }
+
+ if( plen < 0 )
+ {
+ veejay_msg(VEEJAY_MSG_ERROR, "Network I/O Error while reading header: %s", strerror(errno));
+ return -1;
+ }
+
+ //@ there is 44 bytes read, identify producer software here,
+ //@ the function below parses the header in LiVES
+ /*
+ int res = vj_client_parse_salsaman( v, line, 44, tokens );
+ if( res == 0 ) {
+ veejay_msg(0, "Error parsing salsaman header!");
+ return -1;
+ }
+ return 0;
+ */
+
+
+
+ // default: packet is from veejay
+ tokens[0] = getint( line , 4 );
+ tokens[1] = getint( line + 4, 4 );
+ tokens[2] = getint( line + 8, 4 );
+ tokens[3] = getint( line + 12, 8 );
+
+ tokens[4] = getint( line + 12 + 8, 8 );
+ tokens[5] = getint( line + 12 + 16, 8 );
+ tokens[6] = getint( line + 12 + 24, 8 );
+
+
+ return 1;
+}
+
int vj_client_read_i( vj_client *v, uint8_t *dst, int len )
{
uint8_t line[128];
uint32_t p[4] = {0, 0,0,0 };
uint32_t strides[4] = { 0,0,0,0 };
+
+ int tokens[16];
+
int n = 0;
int plen = 0;
int conv = 1;
@@ -305,7 +407,6 @@ int vj_client_read_i( vj_client *v, uint8_t *dst, int len )
int uv_len = 0;
if( v->c[0]->type == VMCAST_C )
{
-//@FIXME
uint8_t *in = mcast_recv_frame( v->c[0]->r, &p[0],&p[1], &p[2], &plen );
if( in == NULL )
return 0;
@@ -318,100 +419,132 @@ int vj_client_read_i( vj_client *v, uint8_t *dst, int len )
y_len = p[0] * p[1];
switch(v->in_fmt )
{
- case FMT_422:
- case FMT_422F:
+ case PIX_FMT_YUV422P:
+ case PIX_FMT_YUVJ422P:
uv_len = y_len / 2;
break;
- case FMT_420:
- case FMT_420F:
+ case PIX_FMT_YUV420P:
+ case PIX_FMT_YUVJ420P:
uv_len = y_len / 4;break;
default:
veejay_msg(VEEJAY_MSG_ERROR, "Unknown data format: %02x", v->in_fmt);
break;
}
- if( p[0] != v->cur_width || p[1] != v->cur_height || p[2] != v->cur_fmt )
- return 2;
-
strides[0] = getint( in + 12 + 8, 8 );
strides[1] = getint( in + 12 + 16, 8 );
strides[2] = getint( in + 12 + 24, 8 );
vj_client_decompress( v,in, dst, p[3], y_len, uv_len , plen, strides[0],strides[1],strides[2]);
- return 1;
+ if( p[0] != v->cur_width || p[1] != v->cur_height )
+ return 2;
+
+
+ return 1; //@ caller will memcpy it to destination buffer
}
else if ( v->c[0]->type == VSOCK_C )
{
- veejay_memset( line,0, sizeof(line));
- plen = sock_t_recv( v->c[0]->fd, line, 44 );
+ //@ result returns software package id
+ int result = vj_client_packet_negotiate( v, tokens );
+ if( result == 0 ) { //@ ids are out of thin air
+
+ //@ header is from lives
+ /*
+ if( v->cur_width != tokens[ SALSAMAN_VSIZE ] || v->cur_height != tokens[SALSAMAN_HSIZE] ) {
+ //@ no changing of sizes on the fly
+ veejay_msg(VEEJAY_MSG_ERROR, "Unexpected video frame format");
+ int n;
+ for( n = 0;n < 16; n ++ ) {
+ veejay_msg(VEEJAY_MSG_DEBUG, "%d: [%d] %02x ", n,tokens[n],tokens[n]);
+ }
+ return 0;
+ }
- if( plen == 0 ) {
- veejay_msg(VEEJAY_MSG_DEBUG, "Remote closed connection.");
- return -1;
- }
+ //@ read information from the header and figure out which pixelformat it is
+ v->in_fmt = weed_palette2_pixfmt( tokens[SALSAMAN_PALETTE] , tokens[SALSAMAN_SUBSPACE ] );
+ if( v->in_fmt == -1 ) {
+ veejay_msg(VEEJAY_MSG_ERROR, "No support for weed palette %d", tokens[SALSAMAN_PALETTE]);
+ return 0;
+ }
- if( plen < 0 )
- {
- veejay_msg(VEEJAY_MSG_ERROR, "Network I/O Error while reading header: %s", strerror(errno));
- return -1;
- }
-
- //vj_client_stdout_dump_recv( v->c[0]->fd, plen, line );
-
- p[0] = getint( line , 4 );
- p[1] = getint( line + 4, 4 );
- p[2] = getint( line + 8, 4 );
- p[3] = getint( line + 12, 8 );
+ //@ assign required values for veejay (format,width,height)
+ v->in_width = tokens[SALSAMAN_VSIZE];
+ v->in_height= tokens[SALSAMAN_HSIZE];
+
+ //@ start reading rest of frame, assuming size is given by SALSAMAN_DATASIZE
+ int n = sock_t_recv( v->c[0]->fd,v->space, tokens[SALSAMAN_DATASIZE] );
+ if( n <= 0 ) {
+ if( n == -1 ) {
+ veejay_msg(VEEJAY_MSG_ERROR, "Error '%s' while reading socket", strerror(errno));
+ } else {
+ veejay_msg(VEEJAY_MSG_DEBUG,"Remote closed connection");
+ }
+ return -1;
+ }
+ //@ ready
+ //@ vj-net.c
+
+ //@ returning 2 means caller will scale
+ return 2;
+ */
+ return 0;
+ } else if ( result == 1 ) {
+ //@ header is veejay
+ p[0] = tokens[0];
+ p[1] = tokens[1];
+ p[2] = tokens[2];
+ p[3] = tokens[3];
+ strides[0] = tokens[4];
+ strides[1] = tokens[5];
+ strides[2] = tokens[6];
- strides[0] = getint( line + 12 + 8, 8 );
- strides[1] = getint( line + 12 + 16, 8 );
- strides[2] = getint( line + 12 + 24, 8 );
+ v->in_width = p[0];
+ v->in_height = p[1];
+ v->in_fmt = p[2];
+
+ uv_len = 0;
+ y_len = p[0] * p[1];
- if( v->cur_width != p[0] || v->cur_height != p[1] || v->cur_fmt != p[2]) {
- veejay_msg(VEEJAY_MSG_ERROR, "Unexpected video frame format, %dx%d (%d) , received %dx%d(%d)",
- v->cur_width,v->cur_height,v->cur_fmt,p[0],p[1],p[2]);
+ switch(v->in_fmt ) //@ veejay is sending compressed YUV data, calculate UV size
+ {
+ case PIX_FMT_YUV422P:
+ case PIX_FMT_YUVJ422P:
+ uv_len = y_len / 2;
+ break;
+ case PIX_FMT_YUV420P:
+ case PIX_FMT_YUVJ420P:
+ uv_len = y_len / 4;break;
+ default:
+ veejay_msg(VEEJAY_MSG_ERROR, "Unknown data format: %02x", v->in_fmt);
+ break;
+ }
+
+ int n = sock_t_recv( v->c[0]->fd,v->space,p[3] );
+ if( n <= 0 ) {
+ if( n == -1 ) {
+ veejay_msg(VEEJAY_MSG_ERROR, "Error '%s' while reading socket", strerror(errno));
+ } else {
+ veejay_msg(VEEJAY_MSG_DEBUG,"Remote closed connection");
+ }
+ return -1;
+ }
+
+ if( n != p[3] && n > 0 )
+ {
+ veejay_msg(VEEJAY_MSG_ERROR, "Broken video packet , got %d out of %d bytes",n, p[3] );
+ return -1;
+ }
+
+ //@ decompress YUV buffer
+ vj_client_decompress( v,NULL, dst, p[3], y_len, uv_len , plen, strides[0],strides[1],strides[2]);
+
+ return 2; //@ caller will scale frame in dst
+ } else {
return 0;
}
- v->in_width = p[0];
- v->in_height = p[1];
- v->in_fmt = p[2];
- uv_len = 0;
- y_len = p[0] * p[1];
- switch(v->in_fmt )
- {
- case FMT_422:
- case FMT_422F:
- uv_len = y_len / 2;
- break;
- case FMT_420:
- case FMT_420F:
- uv_len = y_len / 4;break;
- default:
- veejay_msg(VEEJAY_MSG_ERROR, "Unknown data format: %02x", v->in_fmt);
- break;
- }
-
- int n = sock_t_recv( v->c[0]->fd,v->space,p[3] );
- if( n <= 0 ) {
- if( n == -1 ) {
- veejay_msg(VEEJAY_MSG_ERROR, "Error '%s' while reading socket", strerror(errno));
- } else {
- veejay_msg(VEEJAY_MSG_DEBUG,"Remote closed connection");
- }
- return -1;
- }
-
- if( n != p[3] && n > 0 )
- {
- veejay_msg(VEEJAY_MSG_ERROR, "Broken video packet , got %d out of %d bytes",n, p[3] );
- return -1;
- }
-
- vj_client_decompress( v,NULL, dst, p[3], y_len, uv_len , plen, strides[0],strides[1],strides[2]);
-
- return 2;
+ return 0;
}
return 0;
}
diff --git a/veejay-current/veejay-server/libvjnet/vj-server.c b/veejay-current/veejay-server/libvjnet/vj-server.c
index 91daadb1..3b14df76 100644
--- a/veejay-current/veejay-server/libvjnet/vj-server.c
+++ b/veejay-current/veejay-server/libvjnet/vj-server.c
@@ -418,6 +418,7 @@ int vj_server_send( vj_server *vje, int link_id, uint8_t *buf, int len )
if( !vje->use_mcast)
{
+ //@ FIXME: vje->send_size is not used in sock_t_send_fd
total = sock_t_send_fd( Link[link_id]->handle, vje->send_size, buf, len);
#ifdef STRICT_CHECKING
if( vje->logfd ) {
@@ -431,6 +432,7 @@ int vj_server_send( vj_server *vje, int link_id, uint8_t *buf, int len )
(char*)(inet_ntoa(vje->remote.sin_addr)),strerror(errno));
return -1;
}
+
if( total < len )
return -1;
}
@@ -514,7 +516,7 @@ int vj_server_send_frame( vj_server *vje, int link_id, uint8_t *buf, int len,
{
return vj_server_send_frame_now( vje, link_id, buf, len );
} else {
- veejay_msg(VEEJAY_MSG_DEBUG, "%s: not ready to write.");
+ veejay_msg(VEEJAY_MSG_DEBUG, "Link %d's socket not ready for immediate send: %s", link_id, strerror(errno));
}
return 0;
}
@@ -567,7 +569,7 @@ int _vj_server_del_client(vj_server * vje, int link_id)
{
vj_link **Link = (vj_link**) vje->link;
Link[link_id]->in_use = 0;
- if(Link[link_id]->handle)
+ if(Link[link_id]->handle > 0)
{
int res = close(Link[link_id]->handle);
if( res == -1 ) {
@@ -583,7 +585,7 @@ int _vj_server_del_client(vj_server * vje, int link_id)
#endif
}
- Link[link_id]->handle = 0;
+ Link[link_id]->handle = -1;
Link[link_id]->promote = 0;
Link[link_id]->n_queued = 0;
Link[link_id]->n_retrieved = 0;
@@ -641,7 +643,7 @@ int vj_server_poll(vj_server * vje)
for( i = 0; i < VJ_MAX_CONNECTIONS; i ++ )
{
vj_link **Link= (vj_link**) vje->link;
- if( Link[i]->handle <= 0 )
+ if( Link[i]->handle <= 0 || !Link[i]->in_use )
continue;
// if( Link[i]->in_use )
// {
@@ -939,16 +941,19 @@ int vj_server_new_connection(vj_server *vje)
int addr_len = sizeof(vje->remote);
int n = 0;
int fd = accept( vje->handle, (struct sockaddr*) &(vje->remote), &addr_len );
+#ifdef STRICT_CHECKING
+ assert( fd != 0 ); //@ grab a beer if fd == FILENO_STDIN
+#endif
if(fd == -1)
{
veejay_msg(VEEJAY_MSG_ERROR, "Error accepting connection: %s",
strerror(errno));
+
return 0;
}
char *host = inet_ntoa( vje->remote.sin_addr );
- veejay_msg(VEEJAY_MSG_INFO, "Connection with %s on port %d", host,
- vje->remote.sin_port);
+
if( vje->nr_of_connections < fd )
vje->nr_of_connections = fd;
@@ -960,6 +965,9 @@ int vj_server_new_connection(vj_server *vje)
close(fd);
return 0;
}
+
+ veejay_msg(VEEJAY_MSG_INFO, "Link: %d connected with %s on port %d", n,host,vje->remote.sin_port);
+
#ifdef STRICT_CHECKING
if( vje->logfd ) {
fprintf(vje->logfd, "new connection, socket=%d, max connections=%d\n",
@@ -967,6 +975,8 @@ int vj_server_new_connection(vj_server *vje)
}
#endif
+
+ FD_CLR( vje->handle, &(vje->fds) );
return 1;
}
return 0;
diff --git a/veejay-current/veejay-server/livido-plugins/lvd_shmin.c b/veejay-current/veejay-server/livido-plugins/lvd_shmin.c
index df6448ab..10d40180 100644
--- a/veejay-current/veejay-server/livido-plugins/lvd_shmin.c
+++ b/veejay-current/veejay-server/livido-plugins/lvd_shmin.c
@@ -76,11 +76,11 @@ livido_init_f init_instance( livido_port_t *my_instance )
char *env_id = getenv( "VEEJAY_SHMID" );
if ( livido_property_get( my_instance, "HOST_shmid", 0, &shm_id ) == LIVIDO_NO_ERROR ) {
- if( shm_id > 0 )
+ if( shm_id != 0 )
env_id = NULL; //@ use shm_id from HOST instead.
}
- if( env_id == NULL && shm_id <= 0) {
+ if( env_id == NULL && shm_id == 0) {
//@ try veejay homedir last resort.
char path[1024];
char *home = getenv("HOME");
@@ -101,7 +101,7 @@ livido_init_f init_instance( livido_port_t *my_instance )
shm_id = atoi( env_id );
}
- int r = shmget( shm_id, 0, 0666 );
+ int r = shmget( shm_id, 0, 0400 );
if( r == -1 ) {
printf("error: %s for shm_id %d\n", strerror(errno),shm_id);
return LIVIDO_ERROR_HARDWARE;
diff --git a/veejay-current/veejay-server/veejay/liblavplayvj.c b/veejay-current/veejay-server/veejay/liblavplayvj.c
index e84f1fc6..540867e1 100644
--- a/veejay-current/veejay-server/veejay/liblavplayvj.c
+++ b/veejay-current/veejay-server/veejay/liblavplayvj.c
@@ -1537,11 +1537,14 @@ static void veejay_handle_callbacks(veejay_t *info) {
int status_line_len = strlen( info->status_line );
int i;
for( i = 0; i < VJ_MAX_CONNECTIONS ; i ++ ) {
+ if( !vj_server_link_can_write( info->vjs[VEEJAY_PORT_STA], i ) )
+ continue;
int res = vj_server_send( info->vjs[VEEJAY_PORT_STA], i, info->status_line, status_line_len);
- /* if( res < 0 ) {
+ if( res < 0 ) {
_vj_server_del_client( info->vjs[VEEJAY_PORT_CMD], i );
_vj_server_del_client( info->vjs[VEEJAY_PORT_STA], i );
- }*/
+ _vj_server_del_client( info->vjs[VEEJAY_PORT_DAT], i );
+ }
}
}
diff --git a/veejay-current/veejay-server/veejay/veejay.c b/veejay-current/veejay-server/veejay/veejay.c
index f593b6a3..b839abac 100644
--- a/veejay-current/veejay-server/veejay/veejay.c
+++ b/veejay-current/veejay-server/veejay/veejay.c
@@ -749,14 +749,13 @@ int main(int argc, char **argv)
while( 1 ) { //@ until your PC stops working
usleep(50000);
- vj_lock(info);
+
current_state = veejay_get_state(info);
- vj_unlock(info);
+
if( current_state == LAVPLAY_STATE_STOP )
break;
}
- veejay_quit(info);
veejay_busy(info);
veejay_free(info);
diff --git a/veejay-current/veejay-server/veejay/vj-event.c b/veejay-current/veejay-server/veejay/vj-event.c
index 9a194b41..c37d2457 100644
--- a/veejay-current/veejay-server/veejay/vj-event.c
+++ b/veejay-current/veejay-server/veejay/vj-event.c
@@ -1672,8 +1672,7 @@ int vj_event_parse_msg( void *ptr, char *msg, int msg_len )
return 0;
}
-void breaker()
-{}
+
void vj_event_update_remote(void *ptr)
{
veejay_t *v = (veejay_t*)ptr;
@@ -1683,17 +1682,22 @@ void vj_event_update_remote(void *ptr)
int p2 = vj_server_poll( v->vjs[VEEJAY_PORT_STA] );
int p3 = vj_server_poll( v->vjs[VEEJAY_PORT_DAT] );
- int has_n=0;
+ int has_n=0, has_b=0;
+ if( p1 )
has_n += vj_server_new_connection(v->vjs[VEEJAY_PORT_CMD]);
+
+ if( p2 )
has_n += vj_server_new_connection( v->vjs[VEEJAY_PORT_STA] );
+
+ if( p3 )
+ has_n += vj_server_new_connection( v->vjs[VEEJAY_PORT_DAT] );
- if( has_n ) {
+ if( has_n )
+ {
return;
}
- has_n += vj_server_new_connection( v->vjs[VEEJAY_PORT_DAT] );
-
if( v->settings->use_vims_mcast )
{
int res = vj_server_update(v->vjs[VEEJAY_PORT_MAT],0 );
@@ -1788,6 +1792,8 @@ void vj_event_update_remote(void *ptr)
if(!veejay_keep_messages())
veejay_reap_messages();
+
+ return;
}
void vj_event_commit_bundle( veejay_t *v, int key_num, int key_mod)
@@ -6927,19 +6933,13 @@ void vj_event_tag_new_generator( void *ptr, const char format[], va_list ap )
int args[2] = { 0,0 };
P_A(args,str,format,ap);
- int shm_before = vj_shm_get_id(); //@ get temporary shmid
-
- vj_shm_set_id( args[0] ); //@ temporary store shm id somewhere
-
- int id = veejay_create_tag(v, VJ_TAG_TYPE_GENERATOR, str, v->nstreams,vj_shm_get_id(),0);
+ int id = veejay_create_tag(v, VJ_TAG_TYPE_GENERATOR, str, v->nstreams,args[0],0);
vj_event_send_new_id ( v, id );
if( id <= 0 ) {
- veejay_msg(0,"No plugin '%s' was found", str );
+ veejay_msg(0,"Error launching plugin '%s'.", str );
}
-
- vj_shm_set_id( shm_before );
}
#ifdef USE_GDK_PIXBUF
@@ -9773,6 +9773,7 @@ void vj_event_get_shm( void *ptr, const char format[], va_list ap )
{
veejay_t *v = (veejay_t*)ptr;
char tmp[64];
+ memset(tmp,0,sizeof(tmp));
if(!v->shm) {
snprintf(tmp,sizeof(tmp)-1,"%016d",0);
SEND_MSG(v, tmp );
@@ -9823,16 +9824,20 @@ void vj_event_connect_shm( void *ptr, const char format[], va_list ap )
{
veejay_t *v = (veejay_t*) ptr;
int args[2];
- char str[255];
+ char *str = NULL;
P_A(args,str,format,ap);
- //@ port, shm_id
+ if( args[0] == v->uc->port ) {
+ veejay_msg(0, "Cannot pull info from myself inside VIMS event!");
+ vj_event_send_new_id( v, -1 );
+ return;
+ }
int32_t key = vj_share_pull_master( v->shm,"127.0.0.1", args[0] );
-
-
int id = veejay_create_tag( v, VJ_TAG_TYPE_GENERATOR, "lvd_shmin.so", v->nstreams, key,0);
+
vj_event_send_new_id( v, id );
+
if( id <= 0 ) {
veejay_msg(0, "Unable to connect to shared resource id %d", key );
}
diff --git a/veejay-current/veejay-server/veejay/vj-perform.c b/veejay-current/veejay-server/veejay/vj-perform.c
index ff0f6020..13a40680 100644
--- a/veejay-current/veejay-server/veejay/vj-perform.c
+++ b/veejay-current/veejay-server/veejay/vj-perform.c
@@ -1142,7 +1142,7 @@ int vj_perform_send_primary_frame_s2(veejay_t *info, int mcast, int to_mcast_lin
snprintf(info_line,
data_len + 1, //@ '\0' counts
"%04d%04d%04d%08d%08d%08d%08d", info->effect_frame1->width,
- info->effect_frame1->height, info->pixel_format,
+ info->effect_frame1->height, info->effect_frame1->format,
compr_len,planes[0],planes[1],planes[2] );
veejay_memcpy( socket_buffer, info_line, sizeof(uint8_t) * data_len );
}
@@ -1167,7 +1167,6 @@ int vj_perform_send_primary_frame_s2(veejay_t *info, int mcast, int to_mcast_lin
if(vj_server_send_frame( info->vjs[id], info->rlinks[i], socket_buffer, __socket_len,
info->effect_frame1, info->real_fps )<=0)
{
- veejay_msg(VEEJAY_MSG_ERROR, "Error sending frame to remote");
_vj_server_del_client( info->vjs[id], info->rlinks[i] );
}
info->rlinks[i] = -1;
diff --git a/veejay-current/veejay-server/veejay/vj-sdl.c b/veejay-current/veejay-server/veejay/vj-sdl.c
index 4778c2aa..55a43ff6 100644
--- a/veejay-current/veejay-server/veejay/vj-sdl.c
+++ b/veejay-current/veejay-server/veejay/vj-sdl.c
@@ -501,6 +501,11 @@ int vj_sdl_screen_h( vj_sdl *vjsdl )
return vjsdl->screen->h;
}
+void vj_sdl_set_title( const char *caption )
+{
+ SDL_WM_SetCaption(caption, NULL);
+}
+
void vj_sdl_grab(vj_sdl *vjsdl, int status)
{
SDL_WM_GrabInput( (status==1? SDL_GRAB_ON : SDL_GRAB_OFF) );
diff --git a/veejay-current/veejay-server/veejay/vj-sdl.h b/veejay-current/veejay-server/veejay/vj-sdl.h
index c343f372..3dd0c535 100644
--- a/veejay-current/veejay-server/veejay/vj-sdl.h
+++ b/veejay-current/veejay-server/veejay/vj-sdl.h
@@ -61,7 +61,7 @@ int vj_sdl_direct_yuv_overlay(vj_sdl * vjsdl, uint8_t * buffer, int buflen,
void vj_sdl_free(vj_sdl * vjsdl);
void vj_sdl_quit();
uint8_t *vj_sdl_get_yuv_overlay(vj_sdl *vjsdl );
-
+void vj_sdl_set_title( const char *caption );
void vj_sdl_resize( vj_sdl *vjsdl , int scaled_width, int scaled_height, int fs );
int vj_sdl_screen_w( vj_sdl *vjsdl );
int vj_sdl_screen_h( vj_sdl *vjsdl );
diff --git a/veejay-current/veejay-server/veejay/vj-share.c b/veejay-current/veejay-server/veejay/vj-share.c
index b750edb5..6e2284b5 100644
--- a/veejay-current/veejay-server/veejay/vj-share.c
+++ b/veejay-current/veejay-server/veejay/vj-share.c
@@ -89,22 +89,22 @@ int32_t vj_share_pull_master( void *shm, char *master_host, int master_port )
memset(tmp,0,sizeof(tmp));
vj_client_send( c, V_CMD, "425:0;" );
-
+
vj_client_read( c, V_CMD, tmp, 16 ); //@ get SHM id from
+ vj_flush(c,1);
+
// int32_t key = atoi(tmp);
int32_t key = strtol( tmp, (char**) NULL, 10);
veejay_msg(VEEJAY_MSG_DEBUG, "Veejay sister at port %d says shared resoure ID is %d",master_port,key);
+
vj_client_send( c, V_CMD, "025:1;" ); //@ master starts writing frames to shm
vj_shm_set_id( key ); //@ temporary store
-
- vj_flush(c,1);
-
vj_client_close( c );
vj_client_free( c );
diff --git a/veejay-current/veejay-server/veejay/vj-shm.c b/veejay-current/veejay-server/veejay/vj-shm.c
index 76e15466..11f5f6a7 100644
--- a/veejay-current/veejay-server/veejay/vj-shm.c
+++ b/veejay-current/veejay-server/veejay/vj-shm.c
@@ -62,9 +62,13 @@ typedef struct
} vj_shared_data;
static int just_a_shmid = 0;
-
+static int simply_my_shmkey = 0;
static key_t simply_my_shmid = 0;
+int vj_shm_get_my_shmid() {
+ return simply_my_shmkey;
+}
+
int vj_shm_get_my_id() {
return simply_my_shmid;
}
@@ -85,15 +89,15 @@ void vj_shm_free(void *vv)
int res = pthread_rwlock_destroy( &data->rwlock );
- res = shmdt( data );
+ res = shmdt( v->sms );
if(res ) {
- veejay_msg(0, "failed to detach shared memory: %s",strerror(errno));
+ veejay_msg(VEEJAY_MSG_DEBUG, "Failed to detach shared memory: %s",strerror(errno));
}
res = shmctl( v->shm_id, IPC_RMID, NULL );
if( res ) {
- veejay_msg(0, "failed to remove shared memory %d: %s", v->shm_id, strerror(errno));
+ veejay_msg(0, "Failed to remove shared memory %d: %s", v->shm_id, strerror(errno));
} else {
- veejay_msg(VEEJAY_MSG_INFO, "Removed shared segment %d", v->shm_id );
+ veejay_msg(VEEJAY_MSG_INFO, "Shared resource will %d be destroyed.", v->shm_id );
}
if( v->file ) {
@@ -189,7 +193,7 @@ int vj_shm_write( void *vv, uint8_t *frame[3], int plane_sizes[3] )
int res = pthread_rwlock_wrlock( &data->rwlock );
if( res == -1 ) {
- // veejay_msg(0, "%s",strerror(errno));
+ veejay_msg(0, "SHM locking error: %s",strerror(errno));
return -1;
}
@@ -203,15 +207,15 @@ int vj_shm_write( void *vv, uint8_t *frame[3], int plane_sizes[3] )
res = pthread_rwlock_unlock( &data->rwlock );
if( res == -1 ) {
- //veejay_msg(0, "%s",strerror(errno));
+ veejay_msg(0, "SHM locking error: %s",strerror(errno));
return -1;
}
return 0;
}
-
+/*
void *vj_shm_new_slave(int shm_id)
-{ //@ incomplete!
+{
int rc = 0;
if( shm_id <= 0 ) {
@@ -249,7 +253,7 @@ void *vj_shm_new_slave(int shm_id)
veejay_msg(VEEJAY_MSG_INFO, "Attached to shared memory segment %d", shm_id );
return v;
-}
+}*/
static int vj_shm_file_ref_use_this( char *path ) {
struct stat inf;
@@ -284,6 +288,10 @@ static int vj_shm_file_ref( vj_shm_t *v, const char *homedir )
}
key_t key = ftok( path, tries ); //@ whatever
+ if( key == -1 ) {
+ veejay_msg(0,"ftok returns error: %s", strerror(errno));
+ return 0;
+ }
fprintf( f, "veejay_shm_out-%d: shm_id=%d\n", tries,key );
fclose(f );
@@ -333,7 +341,7 @@ void *vj_shm_new_master( const char *homedir, VJFrame *frame)
//@ attach
v->sms = shmat( v->shm_id, NULL , 0 );
- if( v->sms == NULL ) {
+ if( v->sms == NULL || v->sms == (uint8_t*) (-1) ) {
shmctl( v->shm_id, IPC_RMID, NULL );
veejay_msg(0, "Failed to attach to shared memory:%s",strerror(errno));
failed_init_cleanup(v);
@@ -396,6 +404,8 @@ void *vj_shm_new_master( const char *homedir, VJFrame *frame)
simply_my_shmid = v->key;
+ simply_my_shmkey = v->shm_id;
+
return v;
}
diff --git a/veejay-current/veejay-server/veejay/vj-shm.h b/veejay-current/veejay-server/veejay/vj-shm.h
index dea5158d..68f36e73 100644
--- a/veejay-current/veejay-server/veejay/vj-shm.h
+++ b/veejay-current/veejay-server/veejay/vj-shm.h
@@ -31,6 +31,7 @@ int vj_shm_get_status( void *vv );
void vj_shm_set_status( void *vv, int status );
int vj_shm_get_shm_id( void *vv );
int vj_shm_get_id();
+int vj_shm_get_my_shmid();
void vj_shm_set_id(int v);
int vj_shm_get_my_id();
#endif
diff --git a/veejay-current/veejay-server/veejay/vj-splitdisplay.c b/veejay-current/veejay-server/veejay/vj-splitdisplay.c
index 548f60f8..5cda70ea 100644
--- a/veejay-current/veejay-server/veejay/vj-splitdisplay.c
+++ b/veejay-current/veejay-server/veejay/vj-splitdisplay.c
@@ -74,6 +74,11 @@ static void vj_split_change_screens(split_display_t *sd, int n)
}
}
+void vj_split_destroy( void *s )
+{
+
+}
+
void *vj_split_display(int w, int h)
{
split_display_t *sd = (split_display_t*) vj_calloc( sizeof( split_display_t));
@@ -307,7 +312,7 @@ void vj_split_process_frame( void *sd , uint8_t *dst[3])
continue;
}
- //@ streams only for now
+ //@ streams only
if(! vj_tag_get_frame( sdt->samples[k]->sample_id, sdt->darea, NULL ) )
continue;
diff --git a/veejay-current/veejay-server/veejay/vj-splitdisplay.h b/veejay-current/veejay-server/veejay/vj-splitdisplay.h
index 57787a30..12ce4b22 100644
--- a/veejay-current/veejay-server/veejay/vj-splitdisplay.h
+++ b/veejay-current/veejay-server/veejay/vj-splitdisplay.h
@@ -3,6 +3,8 @@
void *vj_split_display(int w, int h);
void vj_split_process_frame( void *sd, uint8_t *work_buffer[3] );
+void vj_split_destroy(void *v);
+
void vj_split_change_num_screens( void *sd, int n_screens );
void vj_split_change_screen_setup(void *sd, int value);
diff --git a/veejay-current/veejay-utils/configure.ac b/veejay-current/veejay-utils/configure.ac
index 7cbfdde4..80783c37 100644
--- a/veejay-current/veejay-utils/configure.ac
+++ b/veejay-current/veejay-utils/configure.ac
@@ -1,12 +1,12 @@
dnl Process this file with autoconf to produce a configure script.
dnl AC_INIT
-AC_INIT([veejay-utils],[1.1.2],[veejay-users@lists.sourceforge.net])
+AC_INIT([veejay-utils],[1.1.3],[veejay-users@lists.sourceforge.net])
AC_PREREQ(2.57)
AC_CONFIG_SRCDIR([src/sayVIMS.c])
VEEJAY_MAJOR_VERSION=1
VEEJAY_MINOR_VERSION=1
-VEEJAY_MICRO_VERSION=2
+VEEJAY_MICRO_VERSION=3
VEEJAY_VERSION=$VEEJAY_MAJOR_VERSION.$VEEJAY_MINOR_VERSION.$VEEJAY_MICRO_VERSION
VEEJAY_CODENAME="Veejay Utilities - build $VEEJAY_MINOR_VERSION $VEEJAY_MICRO_VERSION"
AC_CONFIG_HEADERS([config.h])
diff --git a/veejay-current/veejay-utils/src/sayVIMS.c b/veejay-current/veejay-utils/src/sayVIMS.c
index 3fa2ea53..34762985 100644
--- a/veejay-current/veejay-utils/src/sayVIMS.c
+++ b/veejay-current/veejay-utils/src/sayVIMS.c
@@ -184,10 +184,10 @@ int main(int argc, char *argv[])
sayvims = sayvims_connect();
- vj_flush(1);
-
- if(!sayvims)
+ if(!sayvims) {
+ fprintf(stderr, "error connecting.\n");
return -1;
+ }
if(single_msg || interactive )
{
@@ -250,6 +250,8 @@ int main(int argc, char *argv[])
}
}
+
+ vj_flush(1);
vj_client_close(sayvims);
vj_client_free(sayvims);