show env var when not set, fix bug in free of sample's editlist, check edit_list before calling cache reset, deal with changing pixel formats in combined editlist, add SSE2 , MMX2 flags to scaler initialization

This commit is contained in:
niels
2014-11-23 18:45:48 +01:00
parent 37bcfb50ba
commit a3a400b7c1
10 changed files with 236 additions and 79 deletions

View File

@@ -462,9 +462,11 @@ void vj_el_setup_cache( editlist *el )
void vj_el_clear_cache( editlist *el )
{
if( el != NULL ) {
if(el->cache)
reset_cache(el->cache);
}
}
void vj_el_deinit()
{
@@ -2200,6 +2202,7 @@ void vj_el_free(editlist *el)
}
if( el->scaler )
yuv_free_swscaler( el->scaler );
free(el);
el = NULL;

View File

@@ -885,7 +885,7 @@ int sample_del(int sample_id)
if(si->edit_list)
{
vj_el_free(si->edit_list);
//vj_el_free(si->edit_list);
si->edit_list = NULL;
}
if(si->encoder_base )
@@ -917,19 +917,51 @@ int sample_del(int sample_id)
return 0;
}
static void sample_free_el(void *port) {
int i;
char **keys = vevo_list_properties(port);
if(keys) {
for( i = 0; keys[i] != NULL; i ++ ) {
void *el = NULL;
if(vevo_property_get(port, keys[i], 0, &el ) == VEVO_NO_ERROR ) {
vj_el_free( (editlist*) el );
}
free(keys[i]);
}
free(keys);
}
}
void sample_del_all()
{
int end = sample_size();
int i;
editlist *el = NULL;
void *port = vpn(VEVO_ANONYMOUS_PORT);
for (i = 1; i < end; i++) {
if (sample_exists(i)) {
sample_chain_clear(i);
sample_info *si = sample_get(i);
if(si->edit_list) {
char key[32];
snprintf(key, "p%p", si->edit_list );
if( vevo_property_get( port, key, 0, NULL ) == VEVO_ERROR_NOSUCH_PROPERTY ) {
vevo_property_set( port, key, VEVO_ATOM_TYPE_VOIDPTR,1,&(si->edit_list));
}
}
sample_del(i);
}
}
sample_free_el( port );
vpf(port);
memset( avail_num, 0, sizeof(int) * SAMPLE_MAX_SAMPLES );
next_avail_num = 0;
this_sample_id = 0;

View File

@@ -623,6 +623,10 @@ static int v4l2_negotiate_pixel_format( v4l2info *v, int host_fmt, int wid, int
}
}
}
else
{
veejay_msg(VEEJAY_MSG_DEBUG,"env VEEJAY_V4L2_GREYSCALE_ONLY=[0|1] not set");
}
//@ does capture card support our native format
int supported = v4l2_tryout_pixel_format( v, native_pixel_format, wid, hei,dw,dh,candidate );
@@ -931,7 +935,7 @@ void *v4l2open ( const char *file, const int input_channel, int host_fmt, int wi
break;
}
} else {
veejay_msg(VEEJAY_MSG_DEBUG, "v4l2: Preferring mmap() capture, override with VEEJAY_V4L2_CAPTURE_METHOD=0");
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_V4L2_CAPTURE_METHOD=[0|1] not set , defaulting to mmap() capture");
cap_read = 1;
}
}
@@ -1921,6 +1925,10 @@ static void *v4l2_grabber_thread( void *v )
if(retry) {
max_retries = atoi( retry );
}
else {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_V4L2_MAX_RETRIES=[Num] not set (defaulting to %d)", max_retries );
}
if( max_retries < 0 || max_retries > 99999 ) {
max_retries = 15;
veejay_msg(VEEJAY_MSG_WARNING, "v4l2: VEEJAY_V4L2_MAX_RETRIES out of bounds, set to default (%d)",max_retries);

View File

@@ -464,6 +464,9 @@ static v4lprocessing *v4lvideo_get_processing( v4lvideo_t *v, int w, int h, int
(p->src_fmt==PIX_FMT_RGB24? "RGB" : "BGR" ));
}
}
else {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_SWAP_RGB=[0|1] not set");
}
p->src = yuv_rgb_template( NULL, p->w,p->h, p->src_fmt );
}
else {

View File

@@ -311,6 +311,9 @@ int vj_tag_init(int width, int height, int pix_fmt, int video_driver)
if( v4l2threading ) {
no_v4l2_threads_ = atoi(v4l2threading);
}
else {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_V4L2_NO_THREADING=[0|1] not set");
}
return 0;

View File

@@ -188,6 +188,9 @@ int vj_vloopback_start_pipe( void *vloop )
v->iov = atoi(dbg);
veejay_msg(VEEJAY_MSG_INFO,"vloop: debug level set to %d", v->iov );
}
else {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_LOOPBACK_DEBUG=[0|1] not set");
}
#ifdef HAVE_V4L
struct video_capability caps;

View File

@@ -365,6 +365,9 @@ vj_server *vj_server_alloc(int port_offset, char *mcast_group_name, int type)
veejay_msg(VEEJAY_MSG_INFO, "Changed receive buffer size to %d bytes (%2.2fKb)",
vjs->recv_bufsize, (float) vjs->recv_bufsize / 1024.0f );
}
else {
veejay_msg(VEEJAY_MSG_DEBUG,"env VEEJAY_SERVER_RECEIVE_BUFFER_SIZE=[num bytes] not set");
}
#ifdef STRICT_CHECKING
char *netlog = getenv("VEEJAY_LOG_NET_IO" );
@@ -381,6 +384,8 @@ vj_server *vj_server_alloc(int port_offset, char *mcast_group_name, int type)
fprintf( vjs->logfd, "Server setup: port %d, name %s type %d\n", port_offset,mcast_group_name,type);
fprintf( vjs->logfd, "receive buffer size: %d bytes\n", vjs->recv_bufsize);
}
} else {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_LOG_NET_IO=logfile not set");
}
#endif

View File

@@ -64,6 +64,9 @@ typedef struct
SwsFilter *src_filter;
SwsFilter *dst_filter;
int cpu_flags;
int format;
int width;
int height;
} vj_sws;
static int sws_context_flags_ = 0;
@@ -577,6 +580,7 @@ void *yuv_fx_context_create( VJFrame *src, VJFrame *dst, int src_fmt, int dst_fm
void yuv_fx_context_process( void *ctx, VJFrame *src, VJFrame *dst )
{
//FIXME
sws_scale( (struct SwsContext*) ctx, src->data, src->stride,0,src->height,dst->data,dst->stride );
}
@@ -601,42 +605,12 @@ void yuv_convert_any3( void *scaler, VJFrame *src, int src_stride[3], VJFrame *d
assert( dst->data[0] != NULL );
#endif
vj_sws *s = (vj_sws*) scaler;
s->sws = sws_getCachedContext(
s->sws,
src->width,
src->height,
src_fmt,
dst->width,
dst->height,
dst_fmt,
s->cpu_flags,
NULL,
NULL,
NULL
);
if(!s->sws)
{
veejay_msg(0,"sws_getContext failed.");
if(s)free(s);
return;
}
/*
struct SwsContext *ctx = sws_getContext(
src->width,
src->height,
src_fmt,
dst->width,
dst->height,
dst_fmt,
sws_context_flags_,
NULL,NULL,NULL );
*/
if(s->sws) {
int dst_stride[3] = { ru4(dst->width),ru4(dst->uv_width),ru4(dst->uv_width) };
sws_scale( s->sws, src->data, src_stride, 0, src->height, dst->data, dst_stride);
//sws_freeContext( ctx );
}
}
@@ -1039,31 +1013,32 @@ int luminance_mean(uint8_t * frame[], int w, int h)
void* yuv_init_swscaler(VJFrame *src, VJFrame *dst, sws_template *tmpl, int cpu_flagss)
{
vj_sws *s = (vj_sws*) vj_malloc(sizeof(vj_sws));
vj_sws *s = (vj_sws*) vj_calloc(sizeof(vj_sws));
if(!s)
return NULL;
int sws_type = 0;
veejay_memset( s, 0, sizeof(vj_sws) );
int cpu_flags = 0;
#ifdef STRICT_CHECKING
cpu_flags = cpu_flags | SWS_PRINT_INFO;
#endif
#ifdef HAVE_ASM_MMX
cpu_flags = cpu_flags | SWS_CPU_CAPS_MMX;
#endif
//#ifdef HAVE_ASM_3DNOW
// cpu_flags = cpu_flags | SWS_CPU_CAPS_3DNOW;
//#endif
//#ifdef HAVE_ASM_MMX2
// cpu_flags = cpu_flags | SWS_CPU_CAPS_MMX2;
//#endif
//#ifdef HAVE_ALTIVEC
// cpu_flags = cpu_flags | SWS_CPU_CAPS_ALTIVEC;
//#endif
#ifdef HAVE_ASM_MMX2
cpu_flags = cpu_flags | SWS_CPU_CAPS_MMX2;
#endif
#ifdef HAVE_ASM_3DNOW
cpu_flags = cpu_flags | SWS_CPU_CAPS_3DNOW;
#endif
#ifdef HAVE_ASM_SSE2
cpu_flags = cpu_flags | SWS_CPU_CAPS_SSE2;
#endif
#ifdef HAVE_ALTIVEC
cpu_flags = cpu_flags | SWS_CPU_CAPS_ALTIVEC;
#endif
switch(tmpl->flags)
{
case 1:
@@ -1123,21 +1098,19 @@ void* yuv_init_swscaler(VJFrame *src, VJFrame *dst, sws_template *tmpl, int cpu_
if(s)free(s);
return NULL;
}
else
{
veejay_msg(VEEJAY_MSG_DEBUG, "sws context: %dx%d in %d -> %dx%d in %d",
src->width,src->height,src->format, dst->width,dst->height,dst->format );
}
return ((void*)s);
}
void* yuv_init_cached_swscaler(void *cache,VJFrame *src, VJFrame *dst, sws_template *tmpl, int cpu_flags)
static void *yuv_init_sws_cached_context(vj_sws *s, VJFrame *src, VJFrame *dst, sws_template *tmpl, int cpu_flagss)
{
vj_sws *s = (vj_sws*) vj_malloc(sizeof(vj_sws));
if(!s)
return NULL;
vj_sws *in = (vj_sws*) cache;
int sws_type = 0;
veejay_memset( s, 0, sizeof(vj_sws) );
int cpu_flags = 0;
#ifdef STRICT_CHECKING
cpu_flags = cpu_flags | SWS_PRINT_INFO;
@@ -1146,24 +1119,115 @@ void* yuv_init_cached_swscaler(void *cache,VJFrame *src, VJFrame *dst, sws_templ
#ifdef HAVE_ASM_MMX
cpu_flags = cpu_flags | SWS_CPU_CAPS_MMX;
#endif
#ifdef HAVE_ASM_MMX2
cpu_flags = cpu_flags | SWS_CPU_CAPS_MMX2;
#endif
#ifdef HAVE_ASM_3DNOW
cpu_flags = cpu_flags | SWS_CPU_CAPS_3DNOW;
#endif
#ifdef HAVE_ASM_SSE2
cpu_flags = cpu_flags | SWS_CPU_CAPS_SSE2;
#endif
#ifdef HAVE_ALTIVEC
cpu_flags = cpu_flags | SWS_CPU_CAPS_ALTIVEC;
#endif
switch(tmpl->flags)
{
case 1:
cpu_flags = cpu_flags|SWS_FAST_BILINEAR;
s->sws = NULL;
if( cache != NULL && in->sws ) {
s->sws = in->sws;
in->sws = NULL;
yuv_free_swscaler( in ); //@ clean up old ctx now
in = NULL;
break;
case 2:
cpu_flags = cpu_flags|SWS_BILINEAR;
break;
case 4:
cpu_flags = cpu_flags|SWS_BICUBIC;
break;
case 3:
cpu_flags = cpu_flags |SWS_POINT;
break;
case 5:
cpu_flags = cpu_flags|SWS_X;
break;
case 6:
cpu_flags = cpu_flags | SWS_AREA;
break;
case 7:
cpu_flags = cpu_flags | SWS_BICUBLIN;
break;
case 8:
cpu_flags = cpu_flags | SWS_GAUSS;
break;
case 9:
cpu_flags = cpu_flags | SWS_SINC;
break;
case 10:
cpu_flags = cpu_flags |SWS_LANCZOS;
break;
case 11:
cpu_flags = cpu_flags | SWS_SPLINE;
break;
}
if( full_chroma_interpolation_ )
cpu_flags = cpu_flags | SWS_FULL_CHR_H_INT;
s->cpu_flags = cpu_flags;
if( !sws_isSupportedInput( src->format ) ) {
veejay_msg(VEEJAY_MSG_DEBUG, "No support for input format");
}
if( !sws_isSupportedOutput( dst->format ) ) {
veejay_msg(VEEJAY_MSG_DEBUG, "No support for output format");
}
return s;
if( s->sws != NULL ) {
if( s->width != src->width || s->format != src->format || s->height != src->height ) {
sws_freeContext( s->sws );
s->sws = NULL;
}
}
if( s->sws == NULL ) {
s->sws = sws_getContext(
src->width,
src->height,
src->format,
dst->width,
dst->height,
dst->format,
cpu_flags,
s->src_filter,
s->dst_filter,
NULL
);
s->width = src->width;
s->height = src->height;
s->format = src->format;
veejay_msg(VEEJAY_MSG_DEBUG, "sws new context: %dx%d in %d -> %dx%d in %d",
src->width,src->height,src->format, dst->width,dst->height,dst->format );
}
if( s->sws == NULL )
{
veejay_msg(VEEJAY_MSG_ERROR,"Failed to get scaler context for %dx%d in %d -> %dx%d in %d",
src->width,src->height,src->format, dst->width,dst->height,dst->format );
return NULL;
}
return (void*) s;
}
void* yuv_init_cached_swscaler(void *cache,VJFrame *src, VJFrame *dst, sws_template *tmpl, int cpu_flags)
{
vj_sws *ctx = (vj_sws*) cache;
if( ctx == NULL )
{
ctx = (vj_sws*) vj_calloc(sizeof(vj_sws));
return yuv_init_sws_cached_context(ctx,src, dst, tmpl, cpu_flags);
}
return yuv_init_sws_cached_context( ctx, src, dst, tmpl, cpu_flags);
}
@@ -1230,8 +1294,12 @@ void yuv_free_swscaler(void *sws)
{
vj_sws *s = (vj_sws*) sws;
if(s->sws)
{
sws_freeContext( s->sws );
s->sws = NULL;
}
if(s) free(s);
sws = NULL;
}
}

View File

@@ -2390,6 +2390,9 @@ int veejay_init(veejay_t * info, int x, int y,char *arg, int def_tags, int gen_t
char *chanid = getenv("VEEJAY_DEFAULT_CHANNEL");
if(chanid != NULL )
default_chan = atoi(chanid);
else
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_DEFAULT_CHANNEL=channel not set (defaulting to 1)");
snprintf(vidfile,sizeof(vidfile),"/dev/video%d", (def_tags-1));
int nid = veejay_create_tag( info, VJ_TAG_TYPE_V4L, vidfile, info->nstreams, default_chan, (def_tags-1) );
if( nid> 0)
@@ -3167,23 +3170,38 @@ veejay_t *veejay_malloc()
if( interpolate_chroma ) {
sscanf( interpolate_chroma, "%d", &status );
}
else {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_INTERPOLATE_CHROMA=[0|1] not set");
}
char *auto_ccir_jpeg = getenv("VEEJAY_AUTO_SCALE_PIXELS");
if( auto_ccir_jpeg ) {
sscanf( auto_ccir_jpeg, "%d", &acj );
}
else {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_AUTO_SCALE_PIXELS=[0|1] not set");
}
char *key_repeat_interval = getenv("VEEJAY_SDL_KEY_REPEAT_INTERVAL");
char *key_repeat_delay = getenv("VEEJAY_SDL_KEY_REPEAT_DELAY");
if(key_repeat_interval) {
sscanf( key_repeat_interval, "%d", &(info->settings->repeat_interval));
}
else {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_SDL_KEY_REPEAT_INTERVAL=[Num] not set");
}
if( key_repeat_delay) {
sscanf( key_repeat_delay, "%d", &(info->settings->repeat_delay));
}
else {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_SDL_KEY_REPEAT_DELAY=[Num] not set");
}
char *best_performance = getenv( "VEEJAY_PERFORMANCE");
int default_zoomer = 1;
if(!best_performance) {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_PERFORMANCE=[fastest|quality] not set");
}
char *max_cache = getenv( "VEEJAY_PLAYBACK_CACHE");
if( max_cache ) {
@@ -3195,6 +3213,8 @@ veejay_t *veejay_malloc()
}
if( mb == 0 )
info->no_caching = 0;
} else {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_PLAYBACK_CACHE=[megabytes] not set");
}
char *sdlfs = getenv("VEEJAY_FULLSCREEN");
@@ -3205,6 +3225,8 @@ veejay_t *veejay_malloc()
(val== 1 ? "fullscreen" : "windowed" ) );
info->settings->full_screen = val;
}
} else {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_FULLSCREEN=[0|1] not set");
}
info->pause_render = 1;// old behaviour was always to pause everything on speed=0
@@ -3218,6 +3240,8 @@ veejay_t *veejay_malloc()
"stop rendering on pause" ) );
info->pause_render = val;
}
} else {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_PAUSE_EVERYTHING=[0|1] (continues rendering is ON)");
}
if( best_performance) {
@@ -3887,7 +3911,6 @@ static int veejay_open_video_files(veejay_t *info, char **files, int num_files,
if(num_files<=0 || files == NULL)
{
veejay_msg(VEEJAY_MSG_WARNING, "Fallback to dummy - no video files given at commandline");
info->dummy->active = 1;
}
@@ -3920,6 +3943,9 @@ static int veejay_open_video_files(veejay_t *info, char **files, int num_files,
dh = dh / 2;
}
}
else {
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_RUN_MODE not set to CLASSIC");
}
if( !info->dummy->width )
info->dummy->width = dw;
@@ -3953,6 +3979,7 @@ static int veejay_open_video_files(veejay_t *info, char **files, int num_files,
veejay_msg(VEEJAY_MSG_DEBUG, "Dummy Audio: %f KHz, %d channels, %d bps, %d bit audio",
(float)el->audio_rate/1000.0,el->audio_chans,el->audio_bps,el->audio_bits);
}
veejay_msg(VEEJAY_MSG_DEBUG,"Dummy Video: %dx%d, chroma %x, framerate %2.2f, norm %s",
info->dummy->width,info->dummy->height, info->dummy->chroma,info->dummy->fps,
(info->dummy->norm == 'n' ? "NTSC" :"PAL"));

View File

@@ -212,6 +212,10 @@ int vj_sdl_init(int ncpu, vj_sdl * vjsdl, int scaled_width, int scaled_height, c
{
hw_on = atoi(hw_env);
}
else {
veejay_msg(VEEJAY_MSG_DEBUG, "env SDL_VIDEO_HWACCEL=[0|1] not set");
}
int extra_flags = (ncpu > 1 ? SDL_ASYNCBLIT : 0 );
int extra_fs_flags = 0;
int manual_positioning = 0;
@@ -224,6 +228,7 @@ int vj_sdl_init(int ncpu, vj_sdl * vjsdl, int scaled_width, int scaled_height, c
manual_positioning = 1;
} else {
extra_fs_flags = SDL_FULLSCREEN;
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_SCREEN_GEOMETRY and VEEJAY_SCREEN_SIZE not set");
}
if (SDL_Init(SDL_INIT_VIDEO) < 0)