diff --git a/veejay-current/veejay-client/src/vj-api.c b/veejay-current/veejay-client/src/vj-api.c
index 58328ba1..1c1de072 100644
--- a/veejay-current/veejay-client/src/vj-api.c
+++ b/veejay-current/veejay-client/src/vj-api.c
@@ -8313,16 +8313,6 @@ static void update_sample_slot_data(int page_num, int slot_num, int sample_id, g
sample_slot_t *slot = info->sample_banks[page_num]->slot[slot_num];
sample_gui_slot_t *gui_slot = info->sample_banks[page_num]->gui_slot[slot_num];
-#ifdef STRICT_CHECKING
- veejay_msg(VEEJAY_MSG_DEBUG, "update slot %d on page %d with (type=%d,id=%d)",
- slot_num, page_num, sample_type, sample_id );
- veejay_msg(VEEJAY_MSG_DEBUG, "(#%d,type=%d,%s,%s) change to (#%d,type=%d,%s,%s)",
- slot->sample_id,slot->sample_type,slot->timecode,slot->title,
- sample_id,sample_type,timecode,title );
-#endif
-
-
-
if(slot->timecode) free(slot->timecode);
if(slot->title) free(slot->title);
@@ -8350,9 +8340,7 @@ static void update_sample_slot_data(int page_num, int slot_num, int sample_id, g
if(sample_id > 0 )
{
- gchar frame_title[8];
- snprintf(frame_title, sizeof(frame_title)-1, "%s", slot->title );
- gtk_frame_set_label( GTK_FRAME(gui_slot->frame),frame_title );
+ gtk_frame_set_label( GTK_FRAME(gui_slot->frame),slot->title );
}
else
{
diff --git a/veejay-current/veejay-server/doc/README.memory b/veejay-current/veejay-server/doc/README.memory
new file mode 100644
index 00000000..55194d19
--- /dev/null
+++ b/veejay-current/veejay-server/doc/README.memory
@@ -0,0 +1,18 @@
+
+STATIC FX CHAIN
+
+Veejay pre-allocates a large buffer (aprox. 180 MB for 1280x720 video) to cache the entire fx_chain.
+If you wish to turn off this option, you can use the -X or --dynamic-fx-chain commandline parameters.
+When dynamic allocation is enabled, each chain entry is allocated and freed on the fly between switching samples.
+Individual FX are always allocated and freed between switching samples.
+
+MEMORY CACHE
+
+Veejay can (optionally) use your RAM to cache video frames from file to memory. By default this option is turned off.
+you can enable it by specifying both the -m and -l commandline parameters. They both expect arguments.
+Enter a percentage of your total phsyical RAM memory to use for -m and divide it equally over -l slots.
+
+These options will allow you to commit the frames from the sample's EDL to memory while playing, so that subsequent loops no longer require disk-access.
+This option should help you increase the audio playback quality when using the FX chain (reducing or elminating stutter)
+
+
diff --git a/veejay-current/veejay-server/libel/vj-el.c b/veejay-current/veejay-server/libel/vj-el.c
index 971800fe..a6907106 100644
--- a/veejay-current/veejay-server/libel/vj-el.c
+++ b/veejay-current/veejay-server/libel/vj-el.c
@@ -479,7 +479,7 @@ vj_decoder *_el_new_decoder( void *ctx, int id , int width, int height, float fp
d->img->height = height;
}
- ssize_t safe_max_frame_size = (max_frame_size < GREMLIN_GUARDIAN) ? 128 * 1024: RUP8(max_frame_size);
+ size_t safe_max_frame_size = (max_frame_size < GREMLIN_GUARDIAN) ? 128 * 1024: RUP8(max_frame_size);
d->tmp_buffer = (uint8_t*) vj_malloc( sizeof(uint8_t) * safe_max_frame_size );
d->fmt = id;
diff --git a/veejay-current/veejay-server/libel/vj-el.h b/veejay-current/veejay-server/libel/vj-el.h
index 2c868c3e..3ff0f131 100644
--- a/veejay-current/veejay-server/libel/vj-el.h
+++ b/veejay-current/veejay-server/libel/vj-el.h
@@ -155,6 +155,8 @@ float vj_el_get_default_framerate( int norm );
char vj_el_get_default_norm( float fps );
+long vj_el_get_mem_size();
+
int vj_el_auto_detect_scenes( editlist *el, uint8_t *tmp[4], int w, int h, int dl_threshold );
#endif
diff --git a/veejay-current/veejay-server/libsample/sampleadm.c b/veejay-current/veejay-server/libsample/sampleadm.c
index 3bc8b9c7..afc973c2 100644
--- a/veejay-current/veejay-server/libsample/sampleadm.c
+++ b/veejay-current/veejay-server/libsample/sampleadm.c
@@ -2811,7 +2811,7 @@ void ParseEffect(xmlDocPtr doc, xmlNodePtr cur, int dst_sample, int start_at)
if (effect_id != -1) {
int j;
if (!sample_chain_add(dst_sample, chain_index, effect_id)) {
- veejay_msg(VEEJAY_MSG_ERROR, "Error parsing effect %d (pos %d)\n", effect_id, chain_index);
+ veejay_msg(VEEJAY_MSG_ERROR, "Error parsing effect %d (pos %d)", effect_id, chain_index);
}
else {
/* load the parameter values */
diff --git a/veejay-current/veejay-server/libstream/vj-net.c b/veejay-current/veejay-server/libstream/vj-net.c
index 1042a82f..ce47176b 100644
--- a/veejay-current/veejay-server/libstream/vj-net.c
+++ b/veejay-current/veejay-server/libstream/vj-net.c
@@ -56,7 +56,7 @@ typedef struct
void *scaler;
VJFrame *a;
VJFrame *b;
- ssize_t bufsize;
+ size_t bufsize;
} threaded_t;
#define STATE_INACTIVE 0
diff --git a/veejay-current/veejay-server/libstream/vj-tag.c b/veejay-current/veejay-server/libstream/vj-tag.c
index 7b7517f1..30e4d699 100644
--- a/veejay-current/veejay-server/libstream/vj-tag.c
+++ b/veejay-current/veejay-server/libstream/vj-tag.c
@@ -3878,7 +3878,7 @@ static void tagParseEffect(xmlDocPtr doc, xmlNodePtr cur, int dst_sample)
int res = vj_tag_set_effect( dst_sample, chain_index, effect_id );
if(res < 0 ) {
- veejay_msg(VEEJAY_MSG_ERROR, "Error parsing effect %d (pos %d) to stream %d\n",
+ veejay_msg(VEEJAY_MSG_ERROR, "Error parsing effect %d (pos %d) to stream %d",
effect_id, chain_index, dst_sample);
}
else {
diff --git a/veejay-current/veejay-server/libvje/effects/threshold.c b/veejay-current/veejay-server/libvje/effects/threshold.c
index cd912138..3e330bf6 100644
--- a/veejay-current/veejay-server/libvje/effects/threshold.c
+++ b/veejay-current/veejay-server/libvje/effects/threshold.c
@@ -83,58 +83,10 @@ static int _dilate_kernel3x3( uint8_t *kernel, uint8_t img[9])
return 1;
return 0;
}
-#ifdef HAVE_ASM_MMX
-static inline void load_binary_map( uint8_t *mask )
-{
- __asm __volatile(
- "movq (%0), %%mm0\n\t"
- :: "r" (mask)
- );
-}
-
-static inline void map_luma( uint8_t *dst, uint8_t *B )
-//static inline void map_luma( uint8_t *dst, uint8_t *B, uint8_t *mask )
-{
- __asm __volatile(
- // "movq (%0), %%mm0\n\t"
- "movq (%0), %%mm1\n\t"
- "pand %%mm0, %%mm1\n\t"
- "movq %%mm1, (%1)\n\t"
- // :: "r" (mask), "r" (B), "r" (dst)
- :: "r" (B) , "r" (dst)
- );
-}
-
-static inline void load_chroma( uint8_t val )
-{
- uint8_t mask[8] = { val,val,val,val, val,val,val,val };
- uint8_t *m = &mask[0];
-
- __asm __volatile(
- "movq (%0), %%mm3\n\t # mm3: 128,128,128,128, ..."
- :: "r" (m)
- );
-}
-
-static inline void map_chroma( uint8_t *dst, uint8_t *B )
-{
- __asm __volatile(
- "movq (%0), %%mm1\n\t"
- "pand %%mm0, %%mm1\n\t"
- "pxor %%mm5, %%mm5\n\t"
- "pcmpeqb %%mm1,%%mm5\n\t"
- "pand %%mm3,%%mm5\n\t"
- "paddb %%mm5,%%mm1\n\t"
- "movq %%mm1, (%1) \n\t"
- :: "r" (B), "r" (dst)
- );
-
-}
-#endif
void threshold_apply( VJFrame *frame, VJFrame *frame2,int width, int height, int threshold, int reverse )
{
- unsigned int y;
+ unsigned int y,x;
uint8_t *Y = frame->data[0];
uint8_t *Cb = frame->data[1];
uint8_t *Cr = frame->data[2];
@@ -143,40 +95,10 @@ void threshold_apply( VJFrame *frame, VJFrame *frame2,int width, int height, int
uint8_t *Cr2=frame2->data[2];
uint8_t *bmap = binary_img;
-
+ int len = frame->len;
softblur_apply( frame, width,height,0 );
- binarify_1src( binary_img,Y,threshold,reverse, width,height);
-
-#ifdef HAVE_ASM_MMX
- int work = (width*height)>>3;
- load_chroma( 128 );
- for( y = 0 ; y < work; y ++ )
- {
- load_binary_map( bmap );
- map_luma(Y , Y2 );
- map_chroma( Cb, Cb2 );
- map_chroma( Cr, Cr2 );
- //@ we could mmx-ify dilation
- Y += 8;
- Y2 += 8;
- Cb += 8;
- Cb2 += 8;
- Cr += 8;
- Cr2 +=8;
- bmap += 8;
- }
-
- do_emms;
-#else
-
-// veejay_memset( Y, 0, width );
-// veejay_memset( Cb, 128, width );
-// veejay_memset( Cr, 128, width );
-
-// veejay_memset(Y+(len-width),0, width );
-// veejay_memset(Cb+(len-width),128,width);
-// veejay_memset(Cr+(len-width),128,width);
+ binarify_1src( binary_img,Y,threshold,0, width,height);
// len -= width;
@@ -223,5 +145,4 @@ void threshold_apply( VJFrame *frame, VJFrame *frame2,int width, int height, int
}
}
}
-#endif
}
diff --git a/veejay-current/veejay-server/libvje/vj-effect.c b/veejay-current/veejay-server/libvje/vj-effect.c
index 0680fdc1..ef3fce1f 100644
--- a/veejay-current/veejay-server/libvje/vj-effect.c
+++ b/veejay-current/veejay-server/libvje/vj-effect.c
@@ -176,6 +176,9 @@ int pixel_U_hi_ = 240;
int pixel_Y_lo_ = 16;
int pixel_U_lo_ = 16;
+static uint8_t *vje_buffer = NULL;
+static ssize_t vje_buflen = 0;
+
int get_pixel_range_min_Y() {
return pixel_Y_lo_;
}
@@ -511,8 +514,8 @@ void vj_effect_initialize(int width, int height, int full_range)
veejay_msg(VEEJAY_MSG_WARNING,"Video width should be a multiple of 32 for some effects" );
}
- for(k=0; k < MAX_EFFECTS; k++)
- vj_effects[k] = NULL;
+ veejay_memset( vj_effects, 0, sizeof(vj_effects));
+ veejay_memset( vj_effect_ready,0,sizeof(vj_effect_ready));
vj_effects[0] = dummy_init(width,height);
vj_effects[1] = overlaymagic_init( width,height );
@@ -683,32 +686,35 @@ void vj_effect_initialize(int width, int height, int full_range)
}
+static void vj_effect_free_parameters( vj_effect *v )
+{
+ int i;
+ for( i = 0; i < v->num_params; i ++ ) {
+ if( v->param_description[i] )
+ free( v->param_description[i] );
+ }
+ free( v->param_description );
+}
+
void vj_effect_free(vj_effect *ve) {
- if(ve->limits[0]) free(ve->limits[0]);
- if(ve->limits[1]) free(ve->limits[1]);
- if(ve->defaults) free(ve->defaults);
- int i = 0;
-/* if( ve->param_description != NULL ) {
- for( i = 0; ve->param_description[i] != NULL; i ++ )
- free(ve->param_description[i]);
-
- free(ve->param_description);
- } */
- // FIXME cleanup
- // if(ve->vjed) free(ve->vjed);
- free(ve);
+ if( ve ) {
+ if(ve->limits[0]) free(ve->limits[0]);
+ if(ve->limits[1]) free(ve->limits[1]);
+ if(ve->defaults) free(ve->defaults);
+ if(ve->param_description) vj_effect_free_parameters( ve );
+ free(ve);
+ }
}
void vj_effect_shutdown() {
int i;
vj_effect_deactivate_all();
for(i=0; i < vj_effect_max_effects(); i++) {
- if(vj_effects[i]) {
- if( i >= MAX_EFFECTS )
- if(vj_effects[i]->description) free(vj_effects[i]->description);
- vj_effect_free(vj_effects[i]);
-
- }
+ if(vj_effects[i]) {
+ if( i >= MAX_EFFECTS && vj_effects[i]->description)
+ free(vj_effects[i]->description);
+ vj_effect_free(vj_effects[i]);
+ }
}
diff_destroy();
@@ -717,7 +723,6 @@ void vj_effect_shutdown() {
rotozoom_destroy();
distortion_destroy();
cali_destroy();
-
plug_sys_free();
}
@@ -833,7 +838,7 @@ char *vj_effect_get_param_description(int effect_id, int param_nr)
int entry;
entry = vj_effect_real_to_sequence(effect_id);
if (entry > 0 && param_nr < vj_effects[entry]->num_params)
- return vj_effects[entry]->param_description[param_nr];
+ return vj_effects[entry]->param_description[param_nr];
return "Invalid paramater";
}
diff --git a/veejay-current/veejay-server/libvjmem/memcpy.c b/veejay-current/veejay-server/libvjmem/memcpy.c
index 09f7ab5c..9b015d91 100644
--- a/veejay-current/veejay-server/libvjmem/memcpy.c
+++ b/veejay-current/veejay-server/libvjmem/memcpy.c
@@ -1728,3 +1728,21 @@ void benchmark_veejay(int w, int h)
benchmark_tasks( n_tasks, n_frames,w,h );
}
+void *vj_hmalloc(size_t sze, const char *name)
+{
+ void *data = vj_malloc( sze );
+ if( data == NULL ) {
+ veejay_msg(VEEJAY_MSG_ERROR, "Unable to allocate memory (needed %ld bytes)", (long) sze );
+ return NULL;
+ }
+ int tiedtoram = 1;
+ if( mlock( data,sze ) != 0 )
+ tiedtoram = 0;
+
+ veejay_msg(VEEJAY_MSG_DEBUG,"Using %.2f MB RAM %s (memory %s paged to the swap area)",
+ ((float) sze/1048576.0f),
+ name,
+ (tiedtoram ? "is not going to be" : "may be" )
+ );
+ return data;
+}
diff --git a/veejay-current/veejay-server/libvjmem/vj-x86.c b/veejay-current/veejay-server/libvjmem/vj-x86.c
index 8053f533..c2714665 100644
--- a/veejay-current/veejay-server/libvjmem/vj-x86.c
+++ b/veejay-current/veejay-server/libvjmem/vj-x86.c
@@ -35,7 +35,7 @@ extern void find_best_memset(void);
extern void yuyv_plane_init();
extern void benchmark_tasks(int n_tasks, long n_frames, int w, int h);
extern void init_parallel_tasks(int n_tasks);
-static int MEM_ALIGNMENT_SIZE = 0;
+static int MEM_ALIGNMENT_SIZE = 32;
static int CACHE_LINE_SIZE = 64;
diff --git a/veejay-current/veejay-server/libvjmem/vjmem.h b/veejay-current/veejay-server/libvjmem/vjmem.h
index 2cd79929..c7fbf6e1 100644
--- a/veejay-current/veejay-server/libvjmem/vjmem.h
+++ b/veejay-current/veejay-server/libvjmem/vjmem.h
@@ -52,4 +52,5 @@ extern void vj_frame_clear1( uint8_t *input, unsigned int value, int size );
extern uint8_t num_threaded_tasks();
extern void vj_frame_slow_threaded( uint8_t **p0_buffer, uint8_t **p1_buffer, uint8_t **img, int len, int uv_len,const float frac );
extern void benchmark_veejay(int w, int h);
+extern void *vj_hmalloc(size_t sze, const char *name);
#endif
diff --git a/veejay-current/veejay-server/libvjmsg/vj-common.c b/veejay-current/veejay-server/libvjmsg/vj-common.c
index ec245bcc..b35b2e11 100644
--- a/veejay-current/veejay-server/libvjmsg/vj-common.c
+++ b/veejay-current/veejay-server/libvjmsg/vj-common.c
@@ -82,7 +82,7 @@ typedef struct {
sem_t *semaphore;
char **dommel;
uint64_t pos;
- ssize_t size;
+ size_t size;
} message_ring_t;
/*
diff --git a/veejay-current/veejay-server/man/veejay.1 b/veejay-current/veejay-server/man/veejay.1
index f1b692cc..71ad9a9f 100644
--- a/veejay-current/veejay-server/man/veejay.1
+++ b/veejay-current/veejay-server/man/veejay.1
@@ -151,7 +151,7 @@ Specify framerate of dummy video
.B \-N [01]
Specify norm of dummy video (0=PAL, 1=NTSC). defaults to PAL
.TP
-.B \-M/--multicast-osc
+.B \--multicast-osc
Starts OSC receiver in multicast mode
.TP
.B \-T/--multicast-vims
@@ -182,6 +182,9 @@ Encode veejay server IP and port number in QR code image
.B \-S/--scene-detection
Create new samples based on scene detection threshold.
.TP
+.B \-M/--dynamic-fx-chain
+Do not keep the fx chain buffers in RAM. Specify this option if you prefer dynamic allocation instead (slower, but no RAM is reserved)
+.TP
.B \--benchmark NxN
Benchmark veejay's core functions (multi-thread vs single thread model) using a specific resolution NxN
.TP
diff --git a/veejay-current/veejay-server/veejay/liblavplayvj.c b/veejay-current/veejay-server/veejay/liblavplayvj.c
index e73c5896..4765c2a7 100644
--- a/veejay-current/veejay-server/veejay/liblavplayvj.c
+++ b/veejay-current/veejay-server/veejay/liblavplayvj.c
@@ -637,8 +637,6 @@ static int veejay_start_playing_sample( veejay_t *info, int sample_id )
info->sfd = sample_get_framedup(sample_id);
- info->uc->render_changed = 1; /* different render list */
-
if( info->settings->sample_restart )
sample_reset_offset( sample_id ); /* reset mixing offsets */
@@ -666,7 +664,6 @@ static int veejay_start_playing_stream(veejay_t *info, int stream_id )
int tmp = vj_tag_chain_malloc( stream_id);
- info->uc->render_changed = 1;
settings->min_frame_num = 1;
settings->max_frame_num = vj_tag_get_n_frames( stream_id );
#ifdef HAVE_FREETYPE
@@ -1157,10 +1154,6 @@ void veejay_pipe_write_status(veejay_t * info)
if (info->uc->chain_changed == 1)
info->uc->chain_changed = 0;
- if (info->uc->render_changed == 1)
- info->uc->render_changed = 0;
-
-
}
static char *veejay_concat_paths(char *path, char *suffix)
{
@@ -1825,7 +1818,11 @@ int veejay_init(veejay_t * info, int x, int y,char *arg, int def_tags, int gen_t
{
veejay_msg(VEEJAY_MSG_ERROR, "Unable to initialize Veejay Performer");
return -1;
- }
+ }
+
+ if( vj_el_get_mem_size() == 0 )
+ prepare_cache_line( info->uc->max_cached_mem,info->uc->max_cached_slots );
+
info->shm = vj_shm_new_master( info->homedir,info->effect_frame1 );
if( !info->shm ) {
veejay_msg(VEEJAY_MSG_WARNING, "Unable to initialize shared resource!");
@@ -2665,6 +2662,14 @@ int prepare_cache_line(int perc, int n_slots)
}
max_memory -= mmap_memory;
+ max_memory -= (vj_perform_fx_chain_size()/1024);
+
+ if( max_memory <= 0 ) {
+ veejay_msg(VEEJAY_MSG_ERROR, "Please enter a larger value for -m");
+ veejay_msg(VEEJAY_MSG_ERROR, "Need a minimum of %ld MB RAM to run if -M is not specified", vj_perform_fx_chain_size()/(1024*1024));
+ veejay_msg(VEEJAY_MSG_ERROR, "Memory frame cache disabled");
+ return 1;
+ }
if( n_slots <= 0)
n_slots = 1;
@@ -2684,10 +2689,9 @@ int prepare_cache_line(int perc, int n_slots)
vj_el_init_chunk( chunk_size );
}
else {
- veejay_msg(VEEJAY_MSG_INFO, "Memory cache disabled");
+ veejay_msg(VEEJAY_MSG_INFO, "Memory frame cache disabled");
}
- veejay_msg(VEEJAY_MSG_INFO, "Memory map size per EDL is %2.2f Mb",(float) mmap_memory / 1024.0f);
-
+ veejay_msg(VEEJAY_MSG_INFO, "Memory cache size per EDL is %2.2f Mb",(float) mmap_memory / 1024.0f);
return 1;
}
@@ -2763,11 +2767,12 @@ veejay_t *veejay_malloc()
info->uc->direction = 1; /* pause */
info->uc->sample_start = 0;
info->uc->sample_end = 0;
- info->net = 1;
+ info->uc->ram_chain = 1; /* enable, keep FX chain buffers in memory (reduces the number of malloc/free of frame buffers) */
+ info->net = 1;
info->status_line = (char*) vj_calloc(sizeof(char) * 1500 );
for( i =0; i < VJ_MAX_CONNECTIONS ; i ++ ) {
- info->rlinks[i] = -1;
- info->rmodes[i] = -1;
+ info->rlinks[i] = -1;
+ info->rmodes[i] = -1;
}
veejay_memset(info->action_file[0],0,sizeof(info->action_file[0]));
diff --git a/veejay-current/veejay-server/veejay/veejay.c b/veejay-current/veejay-server/veejay/veejay.c
index b579597f..007cccf7 100644
--- a/veejay-current/veejay-server/veejay/veejay.c
+++ b/veejay-current/veejay-server/veejay/veejay.c
@@ -48,7 +48,6 @@
#include
#include
extern void veejay_init_msg_ring();
-extern long vj_el_get_mem_size();
extern void vj_libav_ffmpeg_version();
static veejay_t *info = NULL;
static float override_fps = 0.0;
@@ -66,7 +65,7 @@ static int n_slots_ = 0;
static int max_mem_ = 0;
static int live =0;
static int ta = 0;
-static int osl = 0;
+
static void CompiledWith()
{
veejay_msg(VEEJAY_MSG_INFO,"Compilation flags:");
@@ -296,6 +295,8 @@ static void Usage(char *progname)
#endif
fprintf(stderr,
" -S/--scene-detection \tCreate new samples based on scene detection threshold \n");
+ fprintf(stderr,
+ " -M/--dynamic-fx-chain\t\tDo not keep FX chain buffers in RAM (default off)\n");
fprintf(stderr," -q/--quit \t\t\tQuit at end of file\n");
fprintf(stderr,"\n\n");
}
@@ -351,7 +352,7 @@ static int set_option(const char *name, char *value)
info->settings->use_vims_mcast = 1;
info->settings->vims_group_name = strdup(optarg);
}
- else if (strcmp(name, "multicast-osc") == 0 || strcmp(name, "M") == 0 )
+ else if (strcmp(name, "multicast-osc") == 0 )
{
check_val(optarg,name);
info->settings->use_mcast = 1;
@@ -361,11 +362,13 @@ static int set_option(const char *name, char *value)
{
n_slots_ = atoi( optarg );
if(n_slots_ < 0 ) n_slots_ = 0; else if (n_slots_ > 100) n_slots_ = 100;
+ info->uc->max_cached_slots = n_slots_;
}
else if (strcmp(name, "memory" ) == 0 || strcmp(name, "m" ) == 0)
{
max_mem_ = atoi(optarg);
if(max_mem_ < 0 ) max_mem_ = 0; else if (max_mem_ > 100) max_mem_ = 100;
+ info->uc->max_cached_mem = max_mem_;
} else if (strcmp(name, "synchronization") == 0
|| strcmp(name, "c") == 0) {
info->sync_correction = atoi(optarg);
@@ -515,6 +518,10 @@ static int set_option(const char *name, char *value)
{
info->dummy->active = 1; // enable DUMMY MODE
}
+ else if (strcmp(name, "dynamic-fx-chain" ) == 0 || strcmp(name, "M" ) == 0 )
+ {
+ info->uc->ram_chain = 0;
+ }
else
nerr++; /* unknown option - error */
@@ -582,6 +589,7 @@ static int check_command_line_options(int argc, char *argv[])
{"load-generators",1,0,0},
{"qrcode-connection-info",0,0,0},
{"scene-detection",1,0,0},
+ {"dynamic-fx-chain",0,0,0},
{0, 0, 0, 0}
};
#endif
@@ -595,12 +603,12 @@ static int check_command_line_options(int argc, char *argv[])
#ifdef HAVE_GETOPT_LONG
while ((n =
getopt_long(argc, argv,
- "o:G:O:a:H:s:c:t:j:l:p:m:h:w:x:y:r:f:Y:A:N:H:W:M:T:F:nILPVDugvBdibjqeZ:S:",
+ "o:G:O:a:H:s:c:t:j:l:p:m:h:w:x:y:r:f:Y:A:N:H:W:T:F:nILPVDugvBdibjqeZMS:X:",
long_options, &option_index)) != EOF)
#else
while ((n =
getopt(argc, argv,
- "o:G:O:a:H:s:c:t:j:l:p:m:h:w:x:y:r:f:Y:A:N:H:W:M:T:F:nILPVDugvBdibjqeZ:S:"
+ "o:G:O:a:H:s:c:t:j:l:p:m:h:w:x:y:r:f:Y:A:N:H:W:T:F:nILPVDugvBdibjqeZMS:X:"
)) != EOF)
#endif
{
@@ -740,9 +748,6 @@ int main(int argc, char **argv)
return 0;
}
- if( vj_el_get_mem_size() == 0 )
- prepare_cache_line( max_mem_, n_slots_ );
-
veejay_check_homedir( info );
sigsegfault_handler();
diff --git a/veejay-current/veejay-server/veejay/vj-event.c b/veejay-current/veejay-server/veejay/vj-event.c
index ad3c0c9b..b83ee428 100644
--- a/veejay-current/veejay-server/veejay/vj-event.c
+++ b/veejay-current/veejay-server/veejay/vj-event.c
@@ -4911,6 +4911,8 @@ void vj_event_sample_clear_all(void *ptr, const char format[], va_list ap)
}
sample_del_all(v->edit_list);
+ vj_font_set_dict( v->font, NULL );
+
veejay_memset(v->seq->samples, 0, sizeof(int) * MAX_SEQUENCES );
v->seq->active = 0;
v->seq->size = 0;
@@ -9814,6 +9816,12 @@ void vj_event_get_srt_list( void *ptr, const char format[], va_list ap )
return;
}
+ void *font = vj_font_get_dict( v->font );
+ if(!font) {
+ SEND_MSG(v, "000000" );
+ return;
+ }
+
char **list = vj_font_get_sequences( v->font );
int i;
@@ -9835,7 +9843,9 @@ void vj_event_get_srt_list( void *ptr, const char format[], va_list ap )
return;
}
- str = vj_calloc( len + 20 );
+ for ( i = 0; list[i] != NULL; i ++ ) { }
+
+ str = vj_calloc( len + (i*2) + 6 );
char *p = str;
sprintf(p, "%06d", len );
p += 6;
diff --git a/veejay-current/veejay-server/veejay/vj-font.c b/veejay-current/veejay-server/veejay/vj-font.c
index 8eb9d8e0..5ec2aee9 100644
--- a/veejay-current/veejay-server/veejay/vj-font.c
+++ b/veejay-current/veejay-server/veejay/vj-font.c
@@ -1096,7 +1096,6 @@ static char *select_font( vj_font_t *ec, int id )
static char *get_font_name( vj_font_t *f,const char *font, int id )
{
- int len = 0;
char *string;
int platform,encoding,lang;
int error;
@@ -1112,7 +1111,6 @@ static char *get_font_name( vj_font_t *f,const char *font, int id )
}
FT_SfntName sn,qn,zn;
- FT_SfntName sname;
FT_UInt snamei,snamec;
FT_Face face;
@@ -1176,7 +1174,7 @@ static char *get_font_name( vj_font_t *f,const char *font, int id )
}
}
- int i,k;
+ int i;
for( i=0; i < tlen; i +=2 ) {
fontName[i/2] = string[i+1];
@@ -1294,11 +1292,10 @@ void vj_font_dictionary_destroy( void *font, void *dict )
char **items = vevo_list_properties(dict );
if(!items) {
vpf(dict);
+ dict = NULL;
return;
}
- vj_font_t *f = (vj_font_t*) font;
-
int i;
for( i = 0; items[i] != NULL ; i ++ )
{
@@ -1312,6 +1309,7 @@ void vj_font_dictionary_destroy( void *font, void *dict )
}
free(items);
vpf( dict );
+ dict = NULL;
}
@@ -1382,7 +1380,7 @@ static int configure(vj_font_t *f, int size, int font)
fallback_font( f );
}
- veejay_msg(VEEJAY_MSG_DEBUG, "Using font %s, size %d (#%d)", f->font, size, font );
+// veejay_msg(VEEJAY_MSG_DEBUG, "Using font %s, size %d (#%d)", f->font, size, font );
veejay_memset( selected_default_font, 0, sizeof(selected_default_font));
strncpy( selected_default_font, f->font,strlen(f->font)) ;
@@ -2264,7 +2262,6 @@ int vj_font_norender(void *ctx, long position)
void vj_font_render_osd_status( void *ctx, void *_picture, char *status_str, int placement )
{
- vj_font_t *f = (vj_font_t*) ctx;
vj_font_set_osd_text(ctx,status_str);
if(placement == 1) {
vj_font_text_osd_render( ctx, _picture, 5, 5 );
diff --git a/veejay-current/veejay-server/veejay/vj-lib.h b/veejay-current/veejay-server/veejay/vj-lib.h
index 61a656a6..055515ef 100644
--- a/veejay-current/veejay-server/veejay/vj-lib.h
+++ b/veejay-current/veejay-server/veejay/vj-lib.h
@@ -32,18 +32,13 @@
enum {
NO_AUDIO = 0,
- AUDIO_PLAY = 1,
- AUDIO_RENDER = 2,
+ AUDIO_PLAY = 1
};
-
-
-
enum {
LAVPLAY_STATE_STOP = 0, /* uninitialized state */
LAVPLAY_STATE_PAUSED = 1, /* also known as: speed = 0 */
- LAVPLAY_STATE_PLAYING = 2, /* speed != 0 */
- LAVPLAY_STATE_RENDER_READY = 3, /* render mode */
+ LAVPLAY_STATE_PLAYING = 2 /* speed != 0 */
};
/* nmacro recorder, 5 lines code for play back of what you changed at navigation */
@@ -115,7 +110,6 @@ typedef struct
int rec_id;
} sequencer_t;
-
typedef struct {
pthread_t software_playback_thread;
pthread_t playback_thread;
@@ -128,10 +122,8 @@ typedef struct {
pthread_t signal_thread;
sigset_t signal_set;
struct timespec lastframe_completion; /* software sync variable */
-
long old_field_len;
uint64_t save_list_len; /* for editing purposes */
-
double spvf; /* seconds per video frame */
int usec_per_frame; /* milliseconds per frame */
int min_frame_num; /* the lowest frame to be played back - normally 0 */
@@ -153,7 +145,6 @@ typedef struct {
double spas; /* seconds per audio sample */
int audio_mute; /* controls whether to currently play audio or not */
int state; /* playing, paused or stoppped */
- // pthread_t playback_thread; /* the thread for the whole playback-library */
int offline_ready;
int offline_record;
int offline_tag_id;
@@ -247,7 +238,6 @@ typedef struct {
int port;
float rtc_delay;
int is_server;
- int render_changed;
int input_device;
int geox;
int geoy;
@@ -255,6 +245,9 @@ typedef struct {
int scene_detection;
int mouse[4];
char *osd_extra;
+ int ram_chain; /* keep fx chain buffers in RAM (1) or dynamic pattern (0) */
+ int max_cached_mem;
+ int max_cached_slots;
} user_control;
typedef struct {
@@ -272,8 +265,6 @@ typedef struct {
editlist *current_edit_list;
editlist *edit_list; /* the playing editlist */
user_control *uc; /* user control */
-
-// v4l_video *vj[4]; /* v4l input */
void *osc;
VJFrame *plugin_frame;
VJFrameInfo *plugin_frame_info;
@@ -284,8 +275,6 @@ typedef struct {
#ifdef HAVE_DIRECTFB
void *dfb;
#endif
- //vj_ladspa_instance *vli;
- //int vli_enabled;
int video_out;
#ifdef HAVE_GL
void *gl;
diff --git a/veejay-current/veejay-server/veejay/vj-perform.c b/veejay-current/veejay-server/veejay/vj-perform.c
index 55039f89..475f2ac7 100644
--- a/veejay-current/veejay-server/veejay/vj-perform.c
+++ b/veejay-current/veejay-server/veejay/vj-perform.c
@@ -118,6 +118,8 @@ static uint8_t *down_sample_buffer = NULL;
static uint8_t *temp_buffer[4];
static uint8_t *feedback_buffer[4];
static uint8_t *socket_buffer = NULL;
+static uint8_t *fx_chain_buffer = NULL;
+static size_t fx_chain_buflen = 0;
static int sbic = 0;
static ycbcr_frame *record_buffer = NULL; // needed for recording invisible streams
static VJFrame *helper_frame = NULL;
@@ -160,7 +162,7 @@ static void vj_perform_apply_secundary(veejay_t * info, int sample_id,int type,
static int vj_perform_tag_complete_buffers(veejay_t * info, int *h);
static int vj_perform_increase_sample_frame(veejay_t * info, long num);
static int vj_perform_sample_complete_buffers(veejay_t * info, int *h);
-static void vj_perform_use_cached_ycbcr_frame(veejay_t *info, int centry, int chain_entry, int width, int height);
+static void vj_perform_use_cached_ycbcr_frame(veejay_t *info, int centry, int chain_entry);
static int vj_perform_apply_first(veejay_t *info, vjp_kf *todo_info, VJFrame **frames, VJFrameInfo *frameinfo, int e, int c, int n_frames, void *ptr, int playmode );
static int vj_perform_render_sample_frame(veejay_t *info, uint8_t *frame[4], int sample);
static int vj_perform_render_tag_frame(veejay_t *info, uint8_t *frame[4]);
@@ -519,8 +521,14 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num)
static long vj_perform_alloc_row(veejay_t *info, int c, int plane_len)
{
const long frame_len = RUP8( ((plane_len+helper_frame->width)/7)*8 );
- uint8_t *buf = vj_malloc(sizeof(uint8_t) * frame_len * 3 * 3);
- mlock( buf, frame_len * 3 * sizeof(uint8_t));
+ uint8_t *buf;
+ if(fx_chain_buffer!=NULL) {
+ buf = fx_chain_buffer + (c * frame_len * 3 * 3);
+ }
+ else {
+ buf = vj_malloc(sizeof(uint8_t) * frame_len * 3 * 3);
+ mlock( buf, frame_len * 3 * sizeof(uint8_t));
+ }
if(!buf)
return 0;
@@ -539,8 +547,10 @@ static void vj_perform_free_row(int c)
if(frame_buffer[c]->Y)
{
- munlock( frame_buffer[c]->Y, frame_len * 3 * 3 );
- free( frame_buffer[c]->Y );
+ if(fx_chain_buffer == NULL ) {
+ munlock( frame_buffer[c]->Y, frame_len * 3 * 3 );
+ free( frame_buffer[c]->Y );
+ }
}
frame_buffer[c]->Y = NULL;
frame_buffer[c]->Cb = NULL;
@@ -672,9 +682,8 @@ int vj_perform_init(veejay_t * info)
preview_buffer->Y = (uint8_t*) vj_calloc( RUP8(preview_max_w * preview_max_h * 3) );
- video_output_buffer_convert = 0;
- video_output_buffer =
- (ycbcr_frame**) vj_malloc(sizeof(ycbcr_frame*) * 2 );
+ video_output_buffer_convert = 0;
+ video_output_buffer = (ycbcr_frame**) vj_malloc(sizeof(ycbcr_frame*) * 2 );
if(!video_output_buffer)
return 0;
@@ -719,12 +728,12 @@ int vj_perform_init(veejay_t * info)
total_used += buf_len; //temp_buffer
total_used += buf_len; //feedback_buffer
- /* allocate space for frame_buffer, the place we render effects in */
- for (c = 0; c < SAMPLE_MAX_EFFECTS; c++) {
+ /* allocate space for frame_buffer pointers */
+ for (c = 0; c < SAMPLE_MAX_EFFECTS; c++) {
frame_buffer[c] = (ycbcr_frame *)
vj_calloc(sizeof(ycbcr_frame));
- if(!frame_buffer[c]) return 0;
- }
+ if(!frame_buffer[c]) return 0;
+ }
vj_perform_clear_cache();
veejay_memset( frame_info[0],0,SAMPLE_MAX_EFFECTS);
@@ -734,10 +743,26 @@ int vj_perform_init(veejay_t * info)
veejay_memset( &pvar_, 0, sizeof( varcache_t));
+ size_t tmp1 = 0;
+ if( info->uc->ram_chain ) {
+ //allocate fx_chain_buffer
+ tmp1 = buf_len * 3 * sizeof(uint8_t) * SAMPLE_MAX_EFFECTS;
+ fx_chain_buffer = vj_hmalloc( tmp1, "in fx chain buffers" );
+ if(fx_chain_buffer == NULL ) {
+ veejay_msg(VEEJAY_MSG_WARNING,"Unable to allocate sufficient memory to keep all FX chain buffers in RAM");
+ } else {
+ total_used += tmp1;
+ fx_chain_buflen = tmp1;
+ }
+ /* tmp1 = [ secundary source on entry X ] [ slow motion buffer A ] [ slow motion buffer B ]
+ */
+ }
+
veejay_msg(VEEJAY_MSG_INFO,
- "Using %.2f MB RAM in performer (memory %s paged to the swap area)",
+ "Using %.2f MB RAM in performer (memory %s paged to the swap area, %.2f MB pre-allocated for fx-chain)",
((float)total_used/1048576.0f),
- ( mlock_success ? "is not going to be" : "may be" )
+ ( mlock_success ? "is not going to be" : "may be" ),
+ ((float)tmp1/1048576.0f)
);
if( info->uc->scene_detection ) {
@@ -747,6 +772,11 @@ int vj_perform_init(veejay_t * info)
return 1;
}
+size_t vj_perform_fx_chain_size()
+{
+ return fx_chain_buflen;
+}
+
static void vj_perform_close_audio() {
if( lin_audio_buffer_ )
@@ -877,8 +907,6 @@ void vj_perform_free(veejay_t * info)
if(frame_buffer[c])
{
if(frame_buffer[c]->Y) free(frame_buffer[c]->Y);
- if(frame_buffer[c]->Cb) free(frame_buffer[c]->Cb);
- if(frame_buffer[c]->Cr) free(frame_buffer[c]->Cr);
free(frame_buffer[c]);
}
}
@@ -919,6 +947,12 @@ void vj_perform_free(veejay_t * info)
free(preview_buffer->Y);
free(preview_buffer);
+ if(fx_chain_buffer)
+ {
+ munlock(fx_chain_buffer, fx_chain_buflen);
+ free(fx_chain_buffer);
+ }
+
if(lzo_)
lzo_free(lzo_);
}
@@ -1334,16 +1368,14 @@ static void vj_perform_reverse_audio_frame(veejay_t * info, int len,
}
#endif
-static void vj_perform_use_cached_ycbcr_frame(veejay_t *info, int centry, int chain_entry, int width, int height)
+static void vj_perform_use_cached_ycbcr_frame(veejay_t *info, int centry, int chain_entry)
{
- int len1 = (width*height);
+ int len1 = info->effect_frame1->len;
if( centry == 0 )
{
int len2 = ( info->effect_frame1->ssm == 1 ? len1 :
info->effect_frame1->uv_len );
-
-
vj_perform_copy( primary_buffer[0], frame_buffer[chain_entry], len1, len2 );
frame_buffer[chain_entry]->ssm = info->effect_frame1->ssm;
}
@@ -1746,7 +1778,7 @@ static void vj_perform_apply_secundary_tag(veejay_t * info, int sample_id, int t
}
else
{
- vj_perform_use_cached_ycbcr_frame(info, centry, chain_entry, width,height);
+ vj_perform_use_cached_ycbcr_frame(info, centry, chain_entry);
error = 0;
}
if(!error)
@@ -1764,7 +1796,7 @@ static void vj_perform_apply_secundary_tag(veejay_t * info, int sample_id, int t
}
else
{
- vj_perform_use_cached_ycbcr_frame( info, centry, chain_entry, width,height );
+ vj_perform_use_cached_ycbcr_frame( info, centry, chain_entry);
cached_sample_frames[ 1 + chain_entry ] = sample_id;
error = 0;
}
@@ -1924,7 +1956,7 @@ static void vj_perform_apply_secundary(veejay_t * info, int sample_id, int type,
}
else
{
- vj_perform_use_cached_ycbcr_frame(info,centry, chain_entry, width, height);
+ vj_perform_use_cached_ycbcr_frame(info,centry, chain_entry);
error = 0;
}
if(!error )
@@ -1940,7 +1972,7 @@ static void vj_perform_apply_secundary(veejay_t * info, int sample_id, int type,
}
else
{
- vj_perform_use_cached_ycbcr_frame(info,centry, chain_entry,width,height);
+ vj_perform_use_cached_ycbcr_frame(info,centry, chain_entry);
cached_sample_frames[ 1 + chain_entry ] = sample_id;
error = 0;
}
diff --git a/veejay-current/veejay-server/veejay/vj-perform.h b/veejay-current/veejay-server/veejay/vj-perform.h
index 293b99b2..391f979a 100644
--- a/veejay-current/veejay-server/veejay/vj-perform.h
+++ b/veejay-current/veejay-server/veejay/vj-perform.h
@@ -73,7 +73,7 @@ int vj_perform_get_width( veejay_t *info );
int vj_perform_get_height( veejay_t *info );
void vj_perform_follow_fade(int status);
-
+size_t vj_perform_fx_chain_size();
void vj_perform_record_video_frame(veejay_t *info);
diff --git a/veejay-current/veejay-server/veejay/vj-task.c b/veejay-current/veejay-server/veejay/vj-task.c
index 0e083ab8..5f27516c 100644
--- a/veejay-current/veejay-server/veejay/vj-task.c
+++ b/veejay-current/veejay-server/veejay/vj-task.c
@@ -122,8 +122,8 @@ static void task_reset()
memset( &p_threads,0,sizeof(p_threads));
memset( &p_tasks,0,sizeof(p_tasks));
- memset( job_list,0,sizeof(pjob_t*) * MAX_WORKERS );
- memset( &vj_task_args,0,sizeof(vj_task_arg_t*) * MAX_WORKERS );
+// memset( job_list,0,sizeof(pjob_t*) * MAX_WORKERS );
+// memset( &vj_task_args,0,sizeof(vj_task_arg_t*) * MAX_WORKERS );
for( i = 0; i < MAX_WORKERS; i ++ ) {
memset( job_list[i],0, sizeof(pjob_t));
memset( vj_task_args[i],0, sizeof(vj_task_arg_t));