Documentation updates, minor bugfixes

git-svn-id: svn://code.dyne.org/veejay/trunk@310 eb8d1916-c9e9-0310-b8de-cf0c9472ead5
This commit is contained in:
Niels Elburg
2005-05-12 17:56:25 +00:00
parent a250893c52
commit a66ff53297
4 changed files with 243 additions and 35 deletions

View File

@@ -3,7 +3,7 @@ Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html> <html>
<head> <head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" > <meta http-equiv="content-type" content="text/html; charset=UTF-8" >
<title>veejay HOWTO</title> <title>veejay HOWTO (work in progress)</title>
</head> </head>
<body><div> <body><div>
<h2>Veejay HOWTO</h2> <h2>Veejay HOWTO</h2>
@@ -38,14 +38,15 @@ This document describes how to use <b>veejay</b>, a visual 'music' instrument f
<dt>3. <a href="veejay-HOWTO.html#3">Installation</a></dt> <dt>3. <a href="veejay-HOWTO.html#3">Installation</a></dt>
<dd><dl><dt>3.1 <a href="veejay-HOWTO.html#3.1">Dependencies</a></dt> <dd><dl><dt>3.1 <a href="veejay-HOWTO.html#3.1">Dependencies</a></dt>
<dt>3.2 <a href="veejay-HOWTO.html#3.2">Installing veejay</a></dt> <dt>3.2 <a href="veejay-HOWTO.html#3.2">Installing veejay</a></dt>
<dt>3.3 <a href="veejay-HOWTO.html#3.3">Setting up multicast</a></dt></dl></dd> <dt>3.3 <a href="veejay-HOWTO.html#3.3">Setting up multicast</a></dt></dl></dd>
<dt>4. <a href="veejay-HOWTO.html#4">Using Veejay</a></dt> <dt>4. <a href="veejay-HOWTO.html#4">Using Veejay</a></dt>
<dd><dl><dt>4.1 <a href="veejay-HOWTO.html#4.1">Terminology</a></dt> <dd><dl><dt>4.1 <a href="veejay-HOWTO.html#4.1">Terminology and limitations</a></dt>
<dt>4.2 <a href="veejay-HOWTO.html#4.2">VIMS</a></dt> <dt>4.2 <a href="veejay-HOWTO.html#4.2">VIMS</a></dt>
<dt>4.3 <a href="veejay-HOWTO.html#4.3">The keyboard interface</a></dt> <dt>4.3 <a href="veejay-HOWTO.html#4.3">The keyboard interface</a></dt>
<dt>4.4 <a href="veejay-HOWTO.html#4.4">Recording video</a></dt> <dt>4.4 <a href="veejay-HOWTO.html#4.4">Recording video</a></dt>
<dt>4.5 <a href="veejay-HOWTO.html#4.5">Streaming video</a></dt>
<dt>4.6 <a href="veejay-HOWTO.html#4.5">Other utilities</a></dt></dt></dl></dd> <dt>4.6 <a href="veejay-HOWTO.html#4.5">Other utilities</a></dt></dt></dl></dd>
<dt>5<a href="veejay-HOWTO.html#5">Popular packages</a></dt> <dt>5<a href="veejay-HOWTO.html#5">Popular packages</a></dt>
@@ -157,6 +158,8 @@ As of version 0.8 Veejay comes with a graphical user interface GVeejay.
As of version 0.8 Veejay comes with a graphical user interface GVeejay. As of version 0.8 Veejay comes with a graphical user interface GVeejay.
You can use GVeejay to connect (and switch) to any Veejay on the network , alternativly You can use GVeejay to connect (and switch) to any Veejay on the network , alternativly
it can launch a veejay locally on your machine.<br> it can launch a veejay locally on your machine.<br>
Use GVeejay to customize keyboard mappings and save the configuration file.<br>
Gveejay supports hot switching between multiple running instances of veejay,
simply disconnect and connect to another veejay.<br> simply disconnect and connect to another veejay.<br>
</p> </p>
@@ -326,7 +329,11 @@ in your kernel configuration.
in your kernel configuration. in your kernel configuration.
<br><br> <br><br>
Finally you need to add a multicast route : Finally you need to add a multicast route :
<pre> <pre>
for 1 ethernet device:
# route add -net 224.0.0.0 netmask 255.255.255.0 dev eth0
for > 1
# route add -net 224.0.0.0 netmask 255.255.255.0 gw 192.168.100.1 dev eth1 # route add -net 224.0.0.0 netmask 255.255.255.0 gw 192.168.100.1 dev eth1
</pre> </pre>
<br> <br>
@@ -349,12 +356,14 @@ $ veejay -d
</pre> </pre>
<br> <br>
</p> </p>
<h2><a name="4.1">4.1 Terminology and limitations</a></h2><p> <h2><a name="4.1">4.1 Terminology and limitations</a></h2><p>
Veejay has a number of playback modes, each playback mode is unique and defines more or less Veejay has a number of playback modes, each playback mode is unique and defines more or less
a different functionality:<br><br> a different functionality:<br><br>
Also, note that veejay runs in only 1 resolution at a time (depending on the video dimensions of Also, note that veejay runs in only 1 resolution at a time (depending on the video dimensions of
the first loaded movie). All movies loaded must have identical properties, otherwise veejay will not start. the first loaded movie). All movies loaded must have identical properties, otherwise veejay will not start.
This limitation is also valid when streaming video from veejay to another veejay.<br>
<br><br> <br><br>
<table border=0 width=80%> <table border=0 width=80%>
<caption><h4>Playback modes in veejay</h4></caption> <caption><h4>Playback modes in veejay</h4></caption>
@@ -398,7 +407,132 @@ This limitation is also valid when streaming video from veejay to another veejay
</table> </table>
</p> </p>
<h2><a name="4.2">4.2 VIMS</a></h2><p>
<pre>
Use the command
$ veejay -u -n |less
to dump all VIMS messages.
1.1 Message Format
==================
A message is described as:
<Action Identifer> : <Argument List> ;
Example:
080:;
099:0 0;
<Action Identifier>
The action identifier is a 3 digit number describing a Network Event
The colon is used to indicate the start of the Argument List and must be given.
<Argument List>
The Argument List is described by a printf() style formatted template
which describes the number and type of arguments to be used.
The semicolon must be given to indicate the end of this message
1.2 Bundled Messages
====================
A message bundle is a special message that contains an ordered list of at least 1 or more messages. Each message is executed from left to right (first in, first out) while parsing the bundle.
Example:
5032|BUN:002{361:0 3 56 230 93 0;361:0 4 1 7;}|
5033|BUN:003{361:0 3 56 230 93 0;361:0 4 1 7;361:0 5 1 7;}|
5034|BUN:003{361:0 3 56 230 93 0;361:0 4 1 7;361:0 5 1 8;}|
A message bundle is described as:
BUN: <Number of Messages> {
<Action Idenfifier> : <Argument List> ;
<Action Identifier> : <Argument List> ;
...
}
;
The token 'BUN:' indicates the start of a messaage bundle, the first 3 digit numeric value represents the total number of messages in the bundle. The '{' symbol indicates the start of a message block and is ended with '};' or just '}'.
1.3 Format of an Action File/Attaching Keys to Bundles
======================================================
<501 - 599> | <message bundle> |
The contents of some action file can be :
516|BUN:001{355:;}|
The message bundle BUN sends '355' for clear effect chain.
This message bundle is attached to action identifier 516.
A key is attached to this function trough using the GUI (GVeejay)
or by using:
DYNAMIC KEYMAPPING:
==================
"083:516 <sdl symbol> <modifier> <optional arguments>;"
The message bundle can be attached to a key , for example 'SHIFT + A' by sending
083:516 97 3;
Which attaches bundle '516' to SDL key '97' using a modifier '3', which is SHIFT.
Modifiers: 0 = none, 1 = alt , 2 = ctrl, 3 = shift
Keys : see SDLkeysym.h somewhere in include/SDL/
If the number 0 is used for an event number, a given key combination can be
unset (wiped) :
083:0 97 3;
Alternativly, you can bind keys to any action identifier. The complete
list can be viewd by typing veejay -u |less or with Gveejay.
083:20 97 0 4;
The example above sets key 'a' to 'change video speed to 4'
General description of VIMS messages
=====================================
Some reserved numbers:
clip id 0 : select currently playing clip
clip id -1 : select highest clip number
chain entry -1 : select current chain entry
stream id 0 : select currently playing stream
stream id -1 : select highest stream number
key modifier : 0 = normal, 1= alt , 2 = ctrl, 3 = shift
frame -1 : use highest possible frame number (usually num video frames)
playback mode : 0 = clip, 1 = stream, 2 = plain
data format : yv16 (yuv 4:2:2 raw) , mpeg4, divx, msmpeg4v3,
div3, dvvideo, dvsd, mjpeg, i420 and yv12 (yuv 4:2:0 raw)
loop type : 0 = no looping, 1 = normal loop, 2 = pingpong (bounce) loop
</pre>
<br><br>
<h2><a name="#4.2"></a>sayVIMS</h2>
<br><br> <br><br>
sayVIMS is a commandline utility distributed with the veejay package, sayVIMS is a commandline utility distributed with the veejay package,
it allows you to give short commands in interactive mode<br><br> it allows you to give short commands in interactive mode<br><br>
@@ -438,7 +572,6 @@ scripts that output a VIMS script.<br>
scripts that output a VIMS script.<br> scripts that output a VIMS script.<br>
<pre> <pre>
sayVIMS -f advocate.vims -h localhost -p 3490 sayVIMS -f advocate.vims -h localhost -p 3490
</pre>
</pre> </pre>
<br> <br>
Alternativly, you can start a secundary veejay and stream from peer to peer in uncompressed video: Alternativly, you can start a secundary veejay and stream from peer to peer in uncompressed video:
@@ -575,7 +708,59 @@ It is possible to start veejay headless and have it write all video data to
It is possible to start veejay headless and have it write all video data to It is possible to start veejay headless and have it write all video data to
a (special) file for further processing.<br><br> a (special) file for further processing.<br><br>
Refer to chapter <a href="veejay-HOWTO.html#5.3">5.3</a> for some examples.<br><br> Refer to chapter <a href="veejay-HOWTO.html#5.3">5.3</a> for some examples.<br><br>
<h2><a name="4.5">4.5 Streaming video</a></h2><p>
You can create an input stream to read video coming from a video4linux device, from a pipe
or from a network socket (both unicast and multicast).<br>
<h3><a name="4.5.1">4.5.1 video4linux</a></h3>
To open a video4linux device use gveejay or type the command:<br>
<br>
<pre>
$ sayVIMS 240:0 1;
</pre>
The selector '240' tells veejay to open a video4linux device, the first argument '0' indicates
the device number (i.e. /dev/video0) and the last argument '1' indicates the video in port
of your capture card (in this case composite).<br>
Veejay will create a new stream see <a href="#4.4">chapter 4.4</a> for activating the stream.<br>
</p>
<h3><a name="4.5.2">4.5.2 pipe</a></h3>
Veejay supports reading video data from a pipe (FIFO) by means of an input stream.<br>
The only supported transport format is yuv4mpeg (yuv 4:2:0). When playing YUV 4:2:2
the video stream will be sampled to YUV 4:2:0 and vice versa<br>
You can create the input stream by typing the command
<pre>
$ sayVIMS 243:/tmp/stream.yuv;
</pre>
<h3><a name="4.5.3">4.5.3 network</a></h3>
To get frames from another running veejay, use the command:
<br>
<pre>
$ sayVIMS 245:<hostname> <portnum>;
</pre>
For example, sayVIMS 245:localhost 5000;<br>
<br>
If you want to send the same video to multiple running veejays accross the network,
you can save bandwith by starting the veejay you wish to use as server with the -V option.
<br>
You can use the -V <multicast address> option to start an optional multicast frame sender.<br>
First, you need a multicast route in your routing table. See chapter <a href="#3.3">3.3</a> for
a short introduction
or consult a howto that disuccess setting up multicast for your operating system.
<br>
<br>
<pre>
$ veejay -V 224.0.0.50 -p 5000
</pre>
Start another veejay, and use this command:
<br>
<pre>
$ sayVIMS "246:5000 224.0.0.50;"
</pre>
To create a new input stream. Start more veejays and use sayVIMS with the -p option to give
it a port offset number. <br>
</p>
<h2><a name="4.6">4.6 Other utilities</a></h2><p> <h2><a name="4.6">4.6 Other utilities</a></h2><p>
Currently there are 4 extra utilities <b>yuv2rawdv</b> , <b>rawdv2yuv</b> , <b>sayVIMS</b> and <b>any2yuv</b> included in the veejay package for encoding Currently there are 4 extra utilities <b>yuv2rawdv</b> , <b>rawdv2yuv</b> , <b>sayVIMS</b> and <b>any2yuv</b> included in the veejay package for encoding

View File

@@ -5,16 +5,18 @@ veejay - a visual (video) instrument and video sampler for GNU/Linux
.B veejay [options] Videofile1 [Videofile2 ... VideofileN] .B veejay [options] Videofile1 [Videofile2 ... VideofileN]
.SH DESCRIPTION .SH DESCRIPTION
.B veejay .B veejay
can be used to manipulate video in a realtime environment i.e. 'VJ' Veejay is a visual instrument and realtime video sampler. It allos you
for visual performances or for (automated) interactive video installations. to "play" the video like you would play a Piano and it allows you to
It provides mechanisms for simple non-desctructive editing, loop-based record the resulting video directly to disk for immediate playback (video sampling).
clip editing (video sampling) ,capturing from multiple streams, direct-to-disk
recording in various formats , mixing from multiple sources to one Thus, Veejay can be operated live by using the keyboard (which is 100% user definable)
and network streaming (both unicast and multicast in uncompressed video) and remotely over network (both unicast and multicast) using an inhouse message
Also, it can communicate with other sound and/or video applications system that allows mapping of various protocols on top of it, including OSC.
using the Open Sound Control (or through an inhouse protocol called 'VIMS')
Veejay uses Jack for transporting Audio (currently only output) but its support Veejay is beeing developed in the hope it will be usefull for VJ's , media artists
is currently limited. theathers and other interested users that want to use Free Software for their
performances and/or video installations.
.TP .TP
.SH Supported video codecs .SH Supported video codecs
.TP .TP

View File

@@ -55,6 +55,10 @@ static void vj_flush(int frames) {
{ {
frames -- ; frames -- ;
} }
if(n == -1)
{
exit(0);
}
} }
} }
} }
@@ -213,6 +217,8 @@ int main(int argc, char *argv[])
bzero( buf, 65535 ); bzero( buf, 65535 );
client = vj_client_alloc( 0,0,0 ); client = vj_client_alloc( 0,0,0 );
if(host_name == NULL)
host_name = strdup( "localhost" );
if(!vj_client_connect( client, host_name,group_name, port_num )) if(!vj_client_connect( client, host_name,group_name, port_num ))
{ {
@@ -258,11 +264,14 @@ int main(int argc, char *argv[])
} }
else else
{ {
if(buf[0]!='#') { if(buf[0]!='#')
int len = strlen(buf)-1; {
if(len>0){ int len = strlen(buf);
buf[len] = '\0'; if(len>0)
vj_client_send(client,V_CMD,buf);} {
buf[len] = '\0';
vj_client_send(client,V_CMD,buf);
}
} }
} }
} }

View File

@@ -1115,7 +1115,7 @@ int vj_event_parse_msg(veejay_t *v, char *msg)
char *tmp = NULL; char *tmp = NULL;
int msg_len = strlen(msg)-1; int msg_len = strlen(msg);
int id = 0; int id = 0;
bzero(args,150); bzero(args,150);
/* message is at least 5 bytes in length */ /* message is at least 5 bytes in length */
@@ -1126,6 +1126,18 @@ int vj_event_parse_msg(veejay_t *v, char *msg)
return 0; return 0;
} }
/* Sometimes, messages can have a trailing sequence of characters (like newline or spaces)*/
while( msg[msg_len] != ';' )
{
msg[msg_len] = '\0';
msg_len --;
if(msg_len < MSG_MIN_LEN)
{
veejay_msg(VEEJAY_MSG_ERROR, "(VIMS) Syntax error: Message does not end with ';'");
return 0;
}
}
tmp = strndup( msg, 3 ); tmp = strndup( msg, 3 );
if( strncasecmp( tmp, "bun", 3) == 0 ) if( strncasecmp( tmp, "bun", 3) == 0 )
{ {
@@ -1150,6 +1162,8 @@ int vj_event_parse_msg(veejay_t *v, char *msg)
if( msg[3] != 0x3a || msg[msg_len] != ';' ) if( msg[3] != 0x3a || msg[msg_len] != ';' )
{ {
veejay_msg(VEEJAY_MSG_ERROR,"(VIMS) Syntax error, use \"<VIMS selector>:<arguments>;\" "); veejay_msg(VEEJAY_MSG_ERROR,"(VIMS) Syntax error, use \"<VIMS selector>:<arguments>;\" ");
veejay_msg(VEEJAY_MSG_ERROR,"(VIMS) [%s] : '%c' , '%c' ", msg,
msg[3], msg[msg_len] );
return 0; return 0;
} }
@@ -1195,7 +1209,6 @@ int vj_event_parse_msg(veejay_t *v, char *msg)
{ {
const char *fmt = vj_event_list[id].format; const char *fmt = vj_event_list[id].format;
const int np = vj_event_list[id].num_params; const int np = vj_event_list[id].num_params;
int offlen = ((msg_len-4) > 0 ? 4 : msg_len );
int fmt_offset = 1; // fmt offset int fmt_offset = 1; // fmt offset
int i; int i;
int offset = 0; // arguments offset int offset = 0; // arguments offset
@@ -2062,8 +2075,7 @@ int vj_event_register_keyb_event(int event_id, int symbol, int modifier, const
void vj_event_init_network_events() void vj_event_init_network_events()
{ {
int i; int i;
int net_id = 0;
int net_id;
for( i = 1; vj_event_list[i].event_id != 0; i ++ ) for( i = 1; vj_event_list[i].event_id != 0; i ++ )
{ {
net_id = vj_event_list[i].event_id; net_id = vj_event_list[i].event_id;
@@ -2341,7 +2353,7 @@ void vj_event_send_bundles(void *ptr, const char format[], va_list ap)
} }
else else
{ {
const char *buf = "0000"; char *buf = "0000";
SEND_MSG(v,buf); SEND_MSG(v,buf);
} }
} }
@@ -2401,7 +2413,7 @@ void vj_event_send_vimslist(void *ptr, const char format[], va_list ap)
} }
else else
{ {
const char *buf = "0000"; char *buf = "0000";
SEND_MSG(v,buf); SEND_MSG(v,buf);
} }
} }
@@ -6040,7 +6052,7 @@ void vj_event_tag_rec_offline_start(void *ptr, const char format[], va_list ap)
if( vj_tag_exists(args[0])) if( vj_tag_exists(args[0]))
{ {
char tmp[255]; char tmp[255];
char time[20];
int format = _recorder_format; int format = _recorder_format;
char prefix[40]; char prefix[40];
sprintf(prefix, "stream-%02d", args[0]); sprintf(prefix, "stream-%02d", args[0]);
@@ -6710,7 +6722,7 @@ void vj_event_send_tag_list ( void *ptr, const char format[], va_list ap )
if( ((vj_tag_size()-1) <= 0) || (args[0] >= vj_tag_size()-1)) if( ((vj_tag_size()-1) <= 0) || (args[0] >= vj_tag_size()-1))
{ {
/* there are no tags */ /* there are no tags */
const char *empty = "00000"; char *empty = "00000";
veejay_msg(VEEJAY_MSG_ERROR, "No Streams (%d) or asking for non existing (%d)", veejay_msg(VEEJAY_MSG_ERROR, "No Streams (%d) or asking for non existing (%d)",
vj_tag_size()-1,args[0]); vj_tag_size()-1,args[0]);
SEND_MSG(v, empty); SEND_MSG(v, empty);
@@ -7061,7 +7073,7 @@ void vj_event_send_clip_history_list ( void *ptr, const char format[], va_list a
for( entry = 0; entry < CLIP_MAX_RENDER; entry ++ ) for( entry = 0; entry < CLIP_MAX_RENDER; entry ++ )
{ {
// check if entry is playable // check if entry is playable
void *data = clip_get_user_data( id ); //void *data = clip_get_user_data( id );
editlist **el = (editlist**) clip_get_user_data( id ); editlist **el = (editlist**) clip_get_user_data( id );
bzero(hisline,25); bzero(hisline,25);
if(el && el[entry]) if(el && el[entry])