diff --git a/veejay-current/veejay-server/libsample/sampleadm.c b/veejay-current/veejay-server/libsample/sampleadm.c index 67f51e7e..a76b176f 100644 --- a/veejay-current/veejay-server/libsample/sampleadm.c +++ b/veejay-current/veejay-server/libsample/sampleadm.c @@ -49,8 +49,6 @@ #include #include #include -#include -#include #include #include //#define KAZLIB_OPAQUE_DEBUG 1 @@ -959,11 +957,6 @@ int sample_del(int sample_id) if( si->dict ) vj_font_dictionary_destroy( sample_font_,si->dict ); #endif - if(si->viewport) { - viewport_destroy(si->viewport); - si->viewport = NULL; - } - if(si->edit_list) { /* check if another sample has same EDL */ sample_close_edl( sample_id, si->edit_list ); @@ -1567,57 +1560,6 @@ int sample_set_chain_source(int s1, int position, int input) return 1; } - -int sample_load_composite_config( void *compiz, int s1 ) -{ - sample_info *sample = sample_get(s1); - if(!sample) return -1; - - int val = 0; - void *temp = composite_load_config( compiz, sample->viewport_config , &val ); - if( temp == NULL || val == -1 ) { - return 0; - } - - sample->composite = val; - sample->viewport = temp; - return sample->composite; -} - -void *sample_get_composite_view(int s1) -{ - sample_info *sample = sample_get(s1); - if(!sample) return NULL; - return sample->viewport; -} -int sample_set_composite_view(int s1, void *vp) -{ - sample_info *sample = sample_get(s1); - if(!sample) return -1; - sample->viewport = vp; - return 1; -} - -int sample_set_composite(void *compiz, int s1, int composite) -{ - sample_info *sample = sample_get(s1); - if(!sample) return -1; - sample->composite = composite; - if(sample->viewport_config == NULL) { - sample->composite = 1; - return 1; - } - composite_add_to_config( compiz, sample->viewport_config, composite ); - - return 1; -} - -int sample_get_composite(int s1) -{ - sample_info *sample = sample_get(s1); - if(!sample) return 0; - return sample->composite; -} /**************************************************************************************************** * * sample_set_speed @@ -2888,9 +2830,6 @@ void ParseEffects(xmlDocPtr doc, xmlNodePtr cur, sample_info * skel, int start_a } void ParseCalibration( xmlDocPtr doc, xmlNodePtr cur, sample_info *skel , void *vp) { - void *tmp = viewport_load_xml( doc, cur, vp ); - if( tmp ) - skel->viewport_config = tmp; } void LoadCurrentPlaying( xmlDocPtr doc, xmlNodePtr cur , int *id, int *mode ) @@ -3716,22 +3655,6 @@ void WriteSubtitles( sample_info *next_sample, void *font, char *file ) vj_font_set_dict( font, d ); } -void sample_reload_config(void *compiz, int s1, int mode ) -{ - sample_info *sample = sample_get(s1); - if(sample) { - if(sample->viewport_config) { - free(sample->viewport_config); - sample->viewport_config = NULL; - } - if(!sample->viewport_config) { - veejay_msg(VEEJAY_MSG_DEBUG, "Calibrated sample %d",s1); - sample->viewport_config = composite_get_config(compiz,mode); - } - sample->composite = mode; - } -} - int sample_writeToFile(char *sampleFile, void *vp,void *seq, void *font, int id, int mode) { int i; @@ -3770,7 +3693,6 @@ int sample_writeToFile(char *sampleFile, void *vp,void *seq, void *font, int id, CreateSample(childnode, next_sample, font); - viewport_save_xml( childnode, next_sample->viewport_config ); } } diff --git a/veejay-current/veejay-server/libsample/sampleadm.h b/veejay-current/veejay-server/libsample/sampleadm.h index 1d382aa7..961da475 100644 --- a/veejay-current/veejay-server/libsample/sampleadm.h +++ b/veejay-current/veejay-server/libsample/sampleadm.h @@ -167,9 +167,6 @@ typedef struct sample_info_t { int soft_edl; void *dict; void *kf; - int composite; - void *viewport_config; - void *viewport; long resume_pos; int subrender; } sample_info; @@ -221,8 +218,6 @@ extern int sample_set_speed(int s1, int speed); extern void sample_loopcount(int s1); extern void sample_reset_loopcount(int s1); extern int sample_get_loopcount(int s1); -extern int sample_set_composite(void *compiz,int s1, int composite); -extern int sample_get_composite(int s1); extern int sample_set_framedup(int s1, int n); extern int sample_get_framedup(int s1); extern int sample_set_framedups(int s1, int n); @@ -340,7 +335,6 @@ extern int sample_usable_edl( int s1 ); extern int sample_cache_used( int s1 ); extern void sample_free(void *edl); -extern int sample_load_composite_config( void *compiz, int s1 ); extern int sample_stop_playing(int s1, int new_s1); extern int sample_start_playing(int s1, int no_cache); extern int sample_get_kf_tokens( int s1, int entry, int id, int *start,int *end, int *type); @@ -349,9 +343,6 @@ extern int sample_read_edl( sample_info *sample ); extern int sample_max_video_length(int s1); -extern int sample_set_composite_view(int s1, void *vp ); -extern void *sample_get_composite_view(int s1); - extern long sample_get_resume(int s1); extern int sample_set_resume(int s1, long pos ); diff --git a/veejay-current/veejay-server/libstream/v4l2utils.c b/veejay-current/veejay-server/libstream/v4l2utils.c index 570b8ff1..1140ff52 100644 --- a/veejay-current/veejay-server/libstream/v4l2utils.c +++ b/veejay-current/veejay-server/libstream/v4l2utils.c @@ -113,7 +113,6 @@ typedef struct int planes[4]; int out_planes[4]; int rw; - int composite; int is_jpeg; int sizeimage; VJFrame *frames[N_FRAMES]; @@ -1380,17 +1379,6 @@ void v4l2_set_input_channel( void *d, int num ) ioctl( v->fd, VIDIOC_S_INPUT, &num ); } -void v4l2_set_composite_status( void *d, int status) -{ - v4l2info *v = (v4l2info*) d; - v->composite = status; -} - -int v4l2_get_composite_status( void *d ) -{ - v4l2info *v = (v4l2info*) d; - return v->composite; -} // brightness void v4l2_set_brightness( void *d, int32_t value ) { v4l2_set_control( d, V4L2_CID_BRIGHTNESS, value ); diff --git a/veejay-current/veejay-server/libstream/v4lvideo.c b/veejay-current/veejay-server/libstream/v4lvideo.c index 085a1030..5461a35d 100644 --- a/veejay-current/veejay-server/libstream/v4lvideo.c +++ b/veejay-current/veejay-server/libstream/v4lvideo.c @@ -98,7 +98,6 @@ typedef struct { int max_height; int min_width; int min_height; - int composite; sws_template sws_templ; void *scaler; v4lprocessing *info; @@ -119,7 +118,6 @@ typedef struct { int norm; int channel; int frequency; - int composite; void *v4l; pthread_mutex_t mutex; pthread_t thread; @@ -1138,15 +1136,4 @@ int v4lvideo_change_channel( void *vvv, int channel ) return ret; } -void v4lvideo_set_composite_status( void *vv, int status ) -{ - v4lvideo_template_t *v = (v4lvideo_template_t*) vv; - v->composite = status; -} - -int v4lvideo_get_composite_status( void *vv) -{ - v4lvideo_template_t *v = (v4lvideo_template_t*) vv; - return v->composite; -} #endif diff --git a/veejay-current/veejay-server/libstream/v4lvideo.h b/veejay-current/veejay-server/libstream/v4lvideo.h index ed27c01c..26335a71 100644 --- a/veejay-current/veejay-server/libstream/v4lvideo.h +++ b/veejay-current/veejay-server/libstream/v4lvideo.h @@ -59,10 +59,5 @@ void v4lvideo_set_white(void *vv, int x ); int v4lvideo_change_channel( void *vv, int channel ); -// veejay specific -void v4lvideo_set_composite_status( void *vv, int status ); -int v4lvideo_get_composite_status( void *vv ); - - #endif diff --git a/veejay-current/veejay-server/libstream/vj-tag.c b/veejay-current/veejay-server/libstream/vj-tag.c index 3a895c1d..f89fbf7a 100644 --- a/veejay-current/veejay-server/libstream/vj-tag.c +++ b/veejay-current/veejay-server/libstream/vj-tag.c @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #define VIDEO_PALETTE_YUV420P 15 @@ -58,7 +57,6 @@ #ifdef HAVE_FREETYPE #include #endif -#include #include static veejay_t *_tag_info = NULL; @@ -423,7 +421,6 @@ int _vj_tag_new_unicap( vj_tag * tag, int stream_nr, int width, int height, int v4lvideo_templ_get_norm( selected_video_norm ), freq, width, height, palette ); - v4lvideo_set_composite_status( vj_tag_input->unicap[stream_nr] ,has_composite ); if( vj_tag_input->unicap[stream_nr] == NULL ) { veejay_msg(0, "Unable to open device %s", refname ); return 0; @@ -784,13 +781,6 @@ int vj_tag_set_stream_color(int t1, int r, int g, int b) return 1; } -int vj_tag_get_composite(int t1) -{ - vj_tag *tag = vj_tag_get(t1); - if(!tag) return 0; - return tag->composite; -} - int vj_tag_get_stream_color(int t1, int *r, int *g, int *b ) { vj_tag *tag = vj_tag_get(t1); @@ -806,22 +796,6 @@ int vj_tag_get_stream_color(int t1, int *r, int *g, int *b ) return 1; } -int vj_tag_composite(int t1) -{ - vj_tag *tag = vj_tag_get(t1); - if(!tag) return 0; - if(tag->source_type != VJ_TAG_TYPE_V4L ) - return 0; - if(tag->capture_type==1) { -#ifdef HAVE_V4L - return v4lvideo_get_composite_status( vj_tag_input->unicap[tag->index]); -#elif HAVE_V4L2 - return v4l2_get_composite_status( vj_tag_input->unicap[tag->index] ); -#endif - } - return 0; -} - // for network, filename /channel is passed as host/port num int vj_tag_new(int type, char *filename, int stream_nr, editlist * el, int pix_fmt, int channel , int extra , int has_composite) @@ -1317,8 +1291,6 @@ int vj_tag_del(int id) tag->socket_frame = NULL; } - if(tag->viewport) - viewport_destroy(tag->viewport); #ifdef ARCH_X86_64 uint64_t tid = (uint64_t) tag->id; #else @@ -1375,64 +1347,6 @@ int vj_tag_set_n_frames( int t1, int n ) return 1; } -int vj_tag_load_composite_config( void *compiz, int t1 ) -{ - vj_tag *tag = vj_tag_get(t1); - if(!tag) - return -1; - - int val = 0; - void *temp = composite_load_config( compiz, tag->viewport_config, &val ); - if(temp == NULL || val == -1 ) - return 0; - - tag->composite = val; - tag->viewport = temp; - return tag->composite; -} - -void vj_tag_reload_config( void *compiz, int t1, int mode ) -{ - vj_tag *tag = vj_tag_get(t1); - if(tag) { - if(tag->viewport_config) { - free(tag->viewport_config); - tag->viewport_config = NULL; - } - if(!tag->viewport_config) { - tag->viewport_config = composite_get_config( compiz, mode ); - } - tag->composite = mode; - } -} -void *vj_tag_get_composite_view( int t1 ) -{ - vj_tag *tag = vj_tag_get(t1); - if(!tag) return NULL; - return tag->viewport; -} -int vj_tag_set_composite_view( int t1, void *vp ) -{ - vj_tag *tag = vj_tag_get(t1); - if(!tag) return -1; - tag->viewport = vp; - return 1; -} - -int vj_tag_set_composite( void *compiz,int t1, int n ) -{ - vj_tag *tag = vj_tag_get(t1); - if(!tag) return -1; - tag->composite = n; - if( tag->viewport_config == NULL ) { - tag->composite = 1; - return 1; - } - composite_add_to_config( compiz, tag->viewport_config, n ); - - return 1; -} - int vj_tag_get_effect(int t1, int position) { vj_tag *tag = vj_tag_get(t1); @@ -3930,10 +3844,6 @@ static void tagParseEffects(xmlDocPtr doc, xmlNodePtr cur, int dst_stream) void tagParseCalibration( xmlDocPtr doc, xmlNodePtr cur, int dst_sample , void *vp) { - vj_tag *t = vj_tag_get( dst_sample ); - void *tmp = viewport_load_xml( doc, cur, vp ); - if( tmp ) - t->viewport_config = tmp; } /************************************************************************************************* @@ -3981,7 +3891,6 @@ void tagParseStreamFX(char *sampleFile, xmlDocPtr doc, xmlNodePtr cur, void *fon xmlNodePtr subs = NULL; xmlNodePtr cali = NULL; void *d = vj_font_get_dict( font ); - void *viewport_config = NULL; while (cur != NULL) { @@ -4053,7 +3962,6 @@ void tagParseStreamFX(char *sampleFile, xmlDocPtr doc, xmlNodePtr cur, void *fon tag->fader_direction = fader_dir; tag->opacity = opacity; tag->nframes = nframes; - tag->viewport_config = viewport_config; switch( source_type ) { @@ -4232,8 +4140,6 @@ void tagCreateStream(xmlNodePtr node, vj_tag *tag, void *font, void *vp) vj_font_xml_pack( node, font ); - viewport_save_xml( node, tag->viewport_config ); - xmlNodePtr childnode = xmlNewChild(node, NULL, (const xmlChar *) XMLTAG_EFFECTS, NULL); diff --git a/veejay-current/veejay-server/libvje/Makefile.am b/veejay-current/veejay-server/libvje/Makefile.am index 87cf744d..8b6035d4 100644 --- a/veejay-current/veejay-server/libvje/Makefile.am +++ b/veejay-current/veejay-server/libvje/Makefile.am @@ -44,7 +44,8 @@ EXTRA_DIST += effects/autoeq.h effects/crosspixel.h effects/mask.h effects/rawva effects/complexthreshold.h effects/lumamask.h effects/radialblur.h effects/waterrippletv.h \ effects/constantblend.h effects/magicmirror.h effects/radioactive.h effects/whiteframe.h \ effects/contourextract.h effects/magicoverlays.h effects/raster.h effects/widthmirror.h \ - effects/contrast.h effects/magicscratcher.h effects/rawman.h effects/zoom.h effects/iris.h effects/cali.h effects/median.h effects/average-blend.h + effects/contrast.h effects/magicscratcher.h effects/rawman.h effects/zoom.h effects/iris.h \ + effects/cali.h effects/median.h effects/average-blend.h effects/perspective.h EXTRA_DIST += specs/FreeFrame.h specs/frei0r.h @@ -61,7 +62,7 @@ libvje_la_SOURCES = vj-effect.c vj-effman.c effects/common.c \ ctmf/ctmf.c \ effects/diff.c effects/fibdownscale.c effects/killchroma.c \ effects/lumamagick.c effects/autoeq.c effects/colorhis.c \ - effects/mirrors.c effects/colormap.c effects/negatechannel.c effects/negation.c \ + effects/mirrors.c effects/colormap.c effects/negatechannel.c effects/negation.c \ effects/overclock.c effects/dissolve.c effects/opacity.c effects/iris.c effects/posterize.c \ effects/dither.c effects/dices.c effects/emboss.c effects/flip.c \ effects/revtv.c effects/softblur.c effects/zoom.c effects/split.c effects/widthmirror.c \ @@ -85,12 +86,12 @@ libvje_la_SOURCES = vj-effect.c vj-effman.c effects/common.c \ effects/complexthreshold.c effects/complexinvert.c effects/complexsync.c \ effects/isolate.c transitions/vbar.c transitions/3bar.c effects/enhancemask.c effects/noiseadd.c \ effects/contrast.c effects/motionblur.c effects/sinoids.c effects/average.c effects/slicer.c \ - effects/ripple.c effects/waterrippletv.c effects/water.c effects/noisepencil.c effects/bathroom.c effects/slice.c \ + effects/ripple.c effects/waterrippletv.c effects/water.c effects/noisepencil.c effects/bathroom.c effects/slice.c \ effects/crosspixel.c effects/diffmap.c effects/threshold.c effects/morphology.c effects/colmorphology.c \ effects/ghost.c effects/blob.c effects/radcor.c effects/boids.c effects/nervous.c \ effects/cartonize.c effects/tripplicity.c effects/neighbours.c effects/neighbours2.c\ effects/neighbours3.c effects/neighbours4.c effects/neighbours5.c effects/cutstop.c\ effects/contourextract.c effects/maskstop.c effects/photoplay.c effects/videoplay.c effects/rgbchannel.c \ - effects/videowall.c effects/flare.c effects/radioactive.c effects/baltantv.c effects/constantblend.c effects/picinpic.c effects/bgsubtract.c effects/cali.c effects/median.c effects/average-blend.c + effects/videowall.c effects/flare.c effects/radioactive.c effects/baltantv.c effects/constantblend.c effects/picinpic.c effects/bgsubtract.c effects/cali.c effects/median.c effects/average-blend.c effects/perspective.c diff --git a/veejay-current/veejay-server/libvje/effects/zoom.c b/veejay-current/veejay-server/libvje/effects/zoom.c index faad4f38..9b2141af 100644 --- a/veejay-current/veejay-server/libvje/effects/zoom.c +++ b/veejay-current/veejay-server/libvje/effects/zoom.c @@ -64,7 +64,7 @@ int zoom_malloc(int width, int height) { int i; for( i = 0; i < 3; i ++ ) { - zoom_private_[i] = (uint8_t*) vj_malloc( sizeof(uint8_t) * RUP8(width*height)); + zoom_private_[i] = (uint8_t*) vj_malloc( sizeof(uint8_t) * RUP8(width*height+width)); if(!zoom_private_[i]) return 0; } @@ -90,7 +90,7 @@ void zoom_apply( VJFrame *frame, int width, int height, int x, int y, int factor { if( zoom_vp_ ) viewport_destroy( zoom_vp_ ); - zoom_vp_ = viewport_fx_init( VP_QUADZOOM, width,height,x,y,factor, dir ); + zoom_vp_ = viewport_fx_zoom_init( VP_QUADZOOM, width,height,x,y,factor, dir ); if(!zoom_vp_ ) return; zoom_[0] = x; zoom_[1] = y; zoom_[2] = factor; zoom_[3] = dir; diff --git a/veejay-current/veejay-server/libvje/internal.h b/veejay-current/veejay-server/libvje/internal.h index d41705f3..66551aaa 100644 --- a/veejay-current/veejay-server/libvje/internal.h +++ b/veejay-current/veejay-server/libvje/internal.h @@ -216,11 +216,12 @@ enum { VJ_IMAGE_EFFECT_LENSCORRECTION = 189, VJ_IMAGE_EFFECT_CALI = 190, VJ_IMAGE_EFFECT_MEDIANFILTER = 191, + VJ_IMAGE_EFFECT_PERSPECTIVE = 192, VJ_IMAGE_EFFECT_DUMMY=100, }; #define VJ_IMAGE_EFFECT_MIN 100 -#define VJ_IMAGE_EFFECT_MAX 192 +#define VJ_IMAGE_EFFECT_MAX 193 #define VJ_VIDEO_EFFECT_MIN 200 #define VJ_VIDEO_EFFECT_MAX 248 @@ -482,6 +483,8 @@ extern void slice_apply(VJFrame *frame, int width, int height, int val, int rein extern void zoom_apply(VJFrame *frame, int w, int h , int xo, int yo, int f, int dir); +extern void perspective_apply( VJFrame *frame, int width, int height, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int reverse); + extern void deinterlace_apply(VJFrame *frame, int w, int h, int val); extern void simplematte_apply(VJFrame *frame, int w, int h, int threshold, int invert); diff --git a/veejay-current/veejay-server/libvje/vj-effect.c b/veejay-current/veejay-server/libvje/vj-effect.c index a3033bcb..7e685edb 100644 --- a/veejay-current/veejay-server/libvje/vj-effect.c +++ b/veejay-current/veejay-server/libvje/vj-effect.c @@ -168,6 +168,7 @@ #include "effects/cali.h" #include "effects/bgsubtract.h" #include "effects/average-blend.h" +#include "effects/perspective.h" #include #include @@ -258,6 +259,7 @@ static struct { waterrippletv_malloc, waterrippletv_free, VJ_IMAGE_EFFECT_RIPPLETV }, { bgsubtract_malloc, bgsubtract_free, VJ_IMAGE_EFFECT_BGSUBTRACT }, { slicer_malloc, slicer_free, VJ_VIDEO_EFFECT_SLICER }, +{ perspective_malloc, perspective_free, VJ_IMAGE_EFFECT_PERSPECTIVE }, { NULL , NULL ,0 }, }; @@ -658,6 +660,7 @@ void vj_effect_initialize(int width, int height, int full_range) vj_effects[i + 89 ]= radcor_init(width,height); vj_effects[i + 90 ]= cali_init(width,height); vj_effects[i + 91 ] = medianfilter_init(width,height); + vj_effects[i + 92 ] = perspective_init(width,height); max_width = width; max_height = height; diff --git a/veejay-current/veejay-server/libvje/vj-effman.c b/veejay-current/veejay-server/libvje/vj-effman.c index 0925edde..c7b5283d 100644 --- a/veejay-current/veejay-server/libvje/vj-effman.c +++ b/veejay-current/veejay-server/libvje/vj-effman.c @@ -409,6 +409,9 @@ void vj_effman_apply_image_effect( slice_apply(frames[0],frames[0]->width,frames[0]->height,arg[0], todo_info->tmp[1]); todo_info->tmp[1] = 0; break; + case VJ_IMAGE_EFFECT_PERSPECTIVE: + perspective_apply(frames[0],frames[0]->width,frames[0]->height,arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],arg[7],arg[8] ); + break; } } diff --git a/veejay-current/veejay-server/libvje/vje.h b/veejay-current/veejay-server/libvje/vje.h index 797cbaa5..3359c9d9 100644 --- a/veejay-current/veejay-server/libvje/vje.h +++ b/veejay-current/veejay-server/libvje/vje.h @@ -22,7 +22,7 @@ #define FX_LIMIT 1024 -#define MAX_EFFECTS 140 +#define MAX_EFFECTS 141 #define PARAM_WIDTH (1<<0x2) #define PARAM_HEIGHT (1<<0x3) #define PARAM_FADER (1<<0x1) diff --git a/veejay-current/veejay-server/veejay/liblavplayvj.c b/veejay-current/veejay-server/veejay/liblavplayvj.c index 5cc2cb32..a92c1f9a 100644 --- a/veejay-current/veejay-server/veejay/liblavplayvj.c +++ b/veejay-current/veejay-server/veejay/liblavplayvj.c @@ -412,8 +412,6 @@ int veejay_free(veejay_t * info) task_destroy(); - if( info->settings->composite2 ) - composite_destroy( info->composite2 ); if( info->composite ) composite_destroy( info->composite ); @@ -586,6 +584,7 @@ static int veejay_stop_playing_sample( veejay_t *info, int new_sample_id ) sample_chain_free( info->uc->sample_id ); sample_set_framedups(info->uc->sample_id,0); sample_set_resume(info->uc->sample_id, info->settings->current_frame_num ); + return 1; } static void veejay_stop_playing_stream( veejay_t *info, int new_stream_id ) @@ -631,15 +630,29 @@ static int veejay_start_playing_sample( veejay_t *info, int sample_id ) } #endif - if(info->composite ) +/* if(info->composite ) { - int has_cfg = sample_load_composite_config( info->composite , sample_id ); - if( has_cfg && info->settings->composite == 1 ) { - void *cur = sample_get_composite_view(sample_id); - if( cur ) composite_set_backing(info->composite,cur); + void *cur = sample_get_composite_view(sample_id); + if( cur == NULL ) { + composite_set_file_mode( info->composite, info->homedir, info->uc->playback_mode,sample_id); + if( sample_load_composite_config( info->composite, sample_id ) ) { + veejay_msg(VEEJAY_MSG_WARNING, "Sample %d has composite view %p", sample_id, sample_get_composite_view(sample_id) ); + } + } + else { + composite_set_backing( info->composite, cur ); + } + + switch(composite_has_back(info->composite)) { + case 2: + settings->composite = composite_restore_config(info->composite); + break; + default: + settings->composite = 0; + break; } } - +*/ info->uc->sample_id = sample_id; info->last_sample_id = sample_id; @@ -691,14 +704,29 @@ static int veejay_start_playing_stream(veejay_t *info, int stream_id ) info->last_tag_id = stream_id; info->uc->sample_id = stream_id; - if(info->composite ) +/* if(info->composite ) { - int has_cfg = vj_tag_load_composite_config( info->composite , stream_id ); - if( has_cfg && info->settings->composite == 1 ) { - void *cur = vj_tag_get_composite_view(stream_id); - if( cur ) composite_set_backing(info->composite,cur); + void *cur = vj_tag_get_composite_view(stream_id); + if(cur == NULL) { + composite_set_file_mode( info->composite, info->homedir, info->uc->playback_mode,stream_id); + if( vj_tag_load_composite_config( info->composite , stream_id ) ) { + veejay_msg(VEEJAY_MSG_WARNING, "Stream %d has composite view %p", stream_id,vj_tag_get_composite_view(stream_id) ); + } } - } + else { + composite_set_backing( info->composite, cur ); + } + + + switch(composite_has_back(info->composite)) { + case 2: + settings->composite = composite_restore_config(info->composite); + break; + default: + settings->composite = 0; + break; + } + }*/ veejay_msg(VEEJAY_MSG_INFO,"Playing stream %d (FX=%x) (Ff=%d)", stream_id, tmp, settings->max_frame_num ); @@ -776,8 +804,13 @@ void veejay_change_playback_mode( veejay_t *info, int new_pm, int sample_id ) video_playback_setup *settings = info->settings; settings->min_frame_num = 0; settings->max_frame_num = info->edit_list->total_frames; - veejay_msg(VEEJAY_MSG_INFO, "Playing plain video, frames %ld - %ld", (long)settings->min_frame_num, (long)settings->max_frame_num ); + /* if(info->composite) { + composite_set_file_mode( info->composite, info->homedir, new_pm, 0); + composite_restore_config( info->composite ); + } + */ + veejay_msg(VEEJAY_MSG_INFO, "Playing plain video, frames %ld - %ld", (long)settings->min_frame_num, (long)settings->max_frame_num ); } if(new_pm == VJ_PLAYBACK_MODE_TAG) { @@ -1838,19 +1871,22 @@ int veejay_init(veejay_t * info, int x, int y,char *arg, int def_tags, int gen_t if( info->settings->composite ) { + char path[1024]; + snprintf(path,sizeof(path),"%s/viewport.cfg", info->homedir); int comp_mode = info->settings->composite; + info->composite = composite_init( info->video_output_width, info->video_output_height, info->video_output_width, info->video_output_height, - info->homedir, + path, info->settings->sample_mode, yuv_which_scaler(), info->pixel_format, &comp_mode); + if(!info->composite) { return -1; } - - info->composite2 = info->composite; // save ptr, composite + composite_set_file_mode( info->composite, info->homedir, info->uc->playback_mode,info->uc->sample_id); info->settings->zoom = 0; info->settings->composite = ( comp_mode == 1 ? 1: 0); diff --git a/veejay-current/veejay-server/veejay/vj-composite.c b/veejay-current/veejay-server/veejay/vj-composite.c index 36c44a8b..d030c884 100644 --- a/veejay-current/veejay-server/veejay/vj-composite.c +++ b/veejay-current/veejay-server/veejay/vj-composite.c @@ -50,7 +50,6 @@ typedef struct uint8_t *proj_plane[4]; uint8_t *mirror_plane[4]; void *vp1; - void *back1; void *scaler; void *back_scaler; VJFrame *frame1; @@ -62,9 +61,6 @@ typedef struct int pf; int use_back; int Y_only; - int run; - int back_run; - int has_back; int proj_width; /* projection (output) */ int proj_height; int img_width; /* image (input) */ @@ -72,7 +68,7 @@ typedef struct int has_mirror_plane; int mirror_row_start; int mirror_row_end; - int ownback1; + char tmp_path[1024]; } composite_t; //@ round to multiple of 8 @@ -84,19 +80,24 @@ void *composite_get_vp( void *data ) return c->vp1; } +void composite_set_file_mode(void *data, const char *homedir, int mode, int id) +{ + composite_t *c = (composite_t*) data; + switch(mode) { + case 2: snprintf(c->tmp_path,sizeof(c->tmp_path),"%s/viewport.cfg", homedir ); break; + case 1: snprintf(c->tmp_path,sizeof(c->tmp_path),"%s/viewport-stream-%d", homedir,id );break; + default:snprintf(c->tmp_path,sizeof(c->tmp_path),"%s/viewport-sample-%d.cfg", homedir,id );break; + } + veejay_msg(VEEJAY_MSG_DEBUG, "Save/load from File [%s]",c->tmp_path ); +} + int composite_get_ui(void *data ) { composite_t *c = (composite_t*) data; return viewport_get_mode(c->vp1); } -int composite_has_back(void *data) -{ - composite_t *c = (composite_t*) data; - return c->has_back; -} - -void *composite_init( int pw, int ph, int iw, int ih, const char *homedir, int sample_mode, int zoom_type, int pf, int *vp1_e ) +void *composite_init( int pw, int ph, int iw, int ih, char *homedir, int sample_mode, int zoom_type, int pf, int *vp1_e ) { composite_t *c = (composite_t*) vj_calloc(sizeof(composite_t)); int vp1_frontback = 0; @@ -138,8 +139,6 @@ void *composite_init( int pw, int ph, int iw, int ih, const char *homedir, int s c->scaler = yuv_init_swscaler( c->frame1, c->frame2, &sws_templ, 0 ); c->back_scaler = yuv_init_swscaler( c->frame4, c->frame3, &sws_templ, 0 ); - c->back1 = NULL; - veejay_msg(VEEJAY_MSG_DEBUG, "\tSoftware scaler : %s", yuv_get_scaler_name(zoom_type) ); veejay_msg(VEEJAY_MSG_DEBUG, "\tVideo resolution : %dx%d", iw,ih ); veejay_msg(VEEJAY_MSG_DEBUG, "\tScreen resolution: %dx%d", pw,ph ); @@ -169,20 +168,11 @@ void *composite_clone( void *compiz ) composite_t *c = (composite_t*) compiz; if(!c) return NULL; void *v = viewport_clone(c->vp1,c->img_width,c->img_height); - viewport_reconfigure(v); - return v; -} +// viewport_reconfigure(v); + + veejay_msg(VEEJAY_MSG_WARNING, "Cloned new backing %p", v); -void composite_set_backing( void *compiz, void *vp ) -{ - composite_t *c = (composite_t*) compiz; - if(c->ownback1) { - c->ownback1 = 0; - if(c->back1) { - viewport_destroy( c->back1 ); - } - } - c->back1 = vp; + return v; } void composite_destroy( void *compiz ) @@ -192,7 +182,6 @@ void composite_destroy( void *compiz ) { if(c->proj_plane[0]) free(c->proj_plane[0]); if(c->vp1) viewport_destroy( c->vp1 ); - if(c->ownback1 && c->back1) { viewport_destroy(c->back1); c->back1 = NULL; c->ownback1 = 0; } if(c->scaler) yuv_free_swscaler( c->scaler ); if(c->back_scaler) yuv_free_swscaler(c->back_scaler); if(c->frame1) free(c->frame1); @@ -214,8 +203,6 @@ void composite_set_status(void *compiz, int mode) { composite_t *c = (composite_t*) compiz; viewport_set_initial_active( c->vp1, mode ); - - viewport_save_settings( c->vp1, 1 ); } void composite_set_ui(void *compiz, int status ) @@ -232,38 +219,10 @@ void composite_add_to_config( void *compiz, void *vc, int which_vp ) viewport_set_composite( vc, which_vp, c->Y_only ); } -void *composite_load_config( void *compiz, void *vc, int *result ) -{ - if( vc == NULL ) { - *result = -1; - return NULL; - } - - composite_t *c = (composite_t*) compiz; - int cm = viewport_get_color_mode_from_config(vc); - int m = viewport_get_composite_mode_from_config(vc); - - int res = viewport_reconfigure_from_config( c->vp1, vc ); - //@ push to back1 too! - if(res) { - if( c->back1 == NULL ) { - c->back1 = composite_clone(c ); - c->ownback1 = 1; - } - viewport_update_from(c->vp1, c->back1 ); - c->Y_only = cm; - *result = m; - return (void*)c->back1; - } - return NULL; -} - -int composite_event( void *compiz, uint8_t *in[4], int mouse_x, int mouse_y, int mouse_button, int w_x, int w_y ) +int composite_event( void *compiz, uint8_t *in[4], int mouse_x, int mouse_y, int mouse_button, int w_x, int w_y, char *homedir, int mode, int id ) { composite_t *c = (composite_t*) compiz; - if(viewport_external_mouse( c->vp1, c->proj_plane, mouse_x, mouse_y, mouse_button, 1,w_x,w_y )) { - if(c->back1) - viewport_update_from(c->vp1, c->back1 ); + if(viewport_external_mouse( c->vp1, c->proj_plane, mouse_x, mouse_y, mouse_button, 1,w_x,w_y, homedir, mode, id )) { return 1; } return 0; @@ -322,8 +281,6 @@ void composite_blit_yuyv( void *compiz, uint8_t *in[4], uint8_t *yuyv, int which composite_t *c = (composite_t*) compiz; int vp1_active = viewport_active(c->vp1); - c->has_back = 0; - if( which_vp == 2 && vp1_active ) { yuv422_to_yuyv(c->proj_plane,yuyv,c->proj_width,c->proj_height ); return; @@ -371,13 +328,10 @@ void composite_blit_ycbcr( void *compiz, { } - -void *composite_get_config(void *compiz, int which_vp ) +void *composite_get_config(void *compiz) { composite_t *c = (composite_t*) compiz; - void *config = viewport_get_configuration( c->vp1 ); - viewport_set_composite( config, which_vp, c->Y_only ); - return config; + return viewport_get_configuration( c->vp1, c->tmp_path ); } /* Top frame */ @@ -385,11 +339,6 @@ int composite_process(void *compiz, VJFrame *output, VJFrame *input, int which_v { composite_t *c = (composite_t*) compiz; - if(c->run == 0 ) { - viewport_reconfigure(c->vp1); - c->run=1; - } - int vp1_active = viewport_active(c->vp1); if( c->has_mirror_plane ) { diff --git a/veejay-current/veejay-server/veejay/vj-composite.h b/veejay-current/veejay-server/veejay/vj-composite.h index c5f3ebf5..54643201 100644 --- a/veejay-current/veejay-server/veejay/vj-composite.h +++ b/veejay-current/veejay-server/veejay/vj-composite.h @@ -1,7 +1,7 @@ /* * Linux VeeJay * - * Copyright(C)2002-2008 Niels Elburg + * Copyright(C)2002-2015 Niels Elburg * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -40,23 +40,22 @@ void composite_process_divert( void *compiz, uint8_t *in[4], VJFrame *out, void void composite_blit_yuyv( void *compiz,uint8_t *in[4], uint8_t *yuyv, int which_vp ); -int composite_event( void *compiz, uint8_t *in[4], int mouse_x, int mouse_y, int mouse_button, int w_x, int w_y ); +int composite_event( void *compiz, uint8_t *in[4], int mouse_x, int mouse_y, int mouse_button, int w_x, int w_y, char *homedir, int mode, int id ); + +void *composite_get_config(void *compiz); void composite_destroy( void *compiz ); -void *composite_init( int pw, int ph, int iw, int ih, const char *homedir, int sample_mode, int zoom_type, int pf, int *vp1_enabled ); - -void composite_set_backing( void *compiz, void *vp ); +void *composite_init( int pw, int ph, int iw, int ih, char *homedir, int sample_mode, int zoom_type, int pf, int *vp1_enabled ); void *composite_clone( void *compiz ); +void composite_set_file_mode(void *data, const char *homedir, int mode, int id); + void *composite_get_vp( void *data ); void composite_set_ui(void *compiz, int status ); int composite_get_ui(void *compiz ); -//@ load config after loading to activate viewport setup -//@ add to config before saving -void *composite_load_config( void *compiz, void *vc, int *result ); void composite_add_to_config( void *compiz, void *vc, int which_vp ); -int composite_get_status(void *compiz ); +int composite_get_status(void *compiz ); void composite_set_status(void *compiz, int mode); #endif diff --git a/veejay-current/veejay-server/veejay/vj-event.c b/veejay-current/veejay-server/veejay/vj-event.c index e6cbd3a5..1ec968e9 100644 --- a/veejay-current/veejay-server/veejay/vj-event.c +++ b/veejay-current/veejay-server/veejay/vj-event.c @@ -7095,8 +7095,8 @@ void vj_event_vp_proj_toggle(void *ptr, const char format[],va_list ap ) return; } - int mode = !composite_get_status(v->composite2); - composite_set_status( v->composite2, mode ); + int mode = !composite_get_status(v->composite); + composite_set_status( v->composite, mode ); veejay_msg(VEEJAY_MSG_INFO, "Projection transform is now %s on startup.",(mode==0? "inactive" : "active")); } @@ -7120,11 +7120,6 @@ void vj_event_vp_stack( void *ptr, const char format[], va_list ap ) if ( args[1] == 1 ) { int mode = v->settings->composite; if( mode == 0 ) { - if( SAMPLE_PLAYING(v) ) { - sample_set_composite( v->composite, v->uc->sample_id, 1 ); - } else if (STREAM_PLAYING(v) ) { - vj_tag_set_composite( v->composite, v->uc->sample_id, 1 ); - } v->settings->composite = 1; } else if ( mode == 1 ) { v->settings->composite = 0; @@ -7132,7 +7127,6 @@ void vj_event_vp_stack( void *ptr, const char format[], va_list ap ) v->settings->composite = 1; } } - } void vj_event_vp_set_points( void *ptr, const char format[], va_list ap ) @@ -7284,43 +7278,15 @@ void vj_event_viewport_frontback(void *ptr, const char format[], va_list ap) } if( v->settings->composite == 2 && composite_get_ui( v->composite ) ) { -// if(v->use_osd==3) -// v->use_osd = 0; -// v->settings->composite = 2; - if(STREAM_PLAYING(v)) { - void *cur = vj_tag_get_composite_view(v->uc->sample_id); - if(cur == NULL ) { - cur = (void*)composite_clone(v->composite); - vj_tag_set_composite_view(v->uc->sample_id,cur); - } - vj_tag_reload_config(v->composite,v->uc->sample_id,v->settings->composite ); - veejay_msg(VEEJAY_MSG_INFO, "Saved calibration to stream %d",v->uc->sample_id); - } else if (SAMPLE_PLAYING(v)) { - void *cur = sample_get_composite_view( v->uc->sample_id ); - if( cur == NULL ) { - cur = composite_clone(v->composite); - sample_set_composite_view(v->uc->sample_id, cur ); - } - sample_reload_config( v->composite,v->uc->sample_id, v->settings->composite); - veejay_msg(VEEJAY_MSG_INFO, "Saved calibration to sample %d",v->uc->sample_id ); - } else { - //FIXME plain mode restore - } - composite_set_ui(v->composite, 0 ); - v->settings->composite = 1; -//#ifdef HAVE_SDL -// if(v->video_out==0 || v->video_out == 2) -// vj_sdl_grab( v->sdl[0], 0 ); -//#endif + if(v->use_osd==3) + v->use_osd = 0; + composite_set_ui(v->composite, 0 ); + v->settings->composite = 0; } else { composite_set_ui( v->composite, 2 ); v->settings->composite = 2; v->use_osd=3; -//#ifdef HAVE_SDL -// if(v->video_out==0 || v->video_out == 2) -// vj_sdl_grab( v->sdl[0], 1 ); -//#endif veejay_msg(VEEJAY_MSG_INFO, "You can now calibrate your projection/camera, press CTRL-s again to save and exit."); } } @@ -7943,9 +7909,6 @@ void vj_event_print_tag_info(veejay_t *v, int id) id, vj_tag_size()-1, description, (vj_tag_get_active(id) == 1 ? "is active" : "is not active")); - if( vj_tag_get_composite( id ) ) - veejay_msg(VEEJAY_MSG_INFO, "This tag is transformed when used as secundary input."); - for (i = 0; i < SAMPLE_MAX_EFFECTS; i++) { y = vj_tag_get_effect_any(id, i); @@ -8096,9 +8059,6 @@ void vj_event_print_sample_info(veejay_t *v, int id) sampletitle,id,sample_size()-1,timecode,len, (long)v->settings->current_frame_num, curtime); - if( sample_get_composite( id ) ) - veejay_msg(VEEJAY_MSG_INFO, "This sample will be transformed when used as secundary input."); - if(sample_encoder_active(v->uc->sample_id)) { veejay_msg(VEEJAY_MSG_INFO, "REC %09d\t[timecode: %s | %8ld ]", @@ -9085,7 +9045,7 @@ void vj_event_send_shm_info( void *ptr, const char format[], va_list ap) int msg_len = strlen(msg); char *tmp = get_print_buf(1 + msg_len + 3); - sprintf( tmp, "%03zu%s",msg_len, msg ); + sprintf( tmp, "%03d%s",msg_len, msg ); SEND_MSG(v,tmp); free(msg); diff --git a/veejay-current/veejay-server/veejay/vj-lib.h b/veejay-current/veejay-server/veejay/vj-lib.h index e2eebc04..0b9989b1 100644 --- a/veejay-current/veejay-server/veejay/vj-lib.h +++ b/veejay-current/veejay-server/veejay/vj-lib.h @@ -169,7 +169,6 @@ typedef struct { char *vims_group_name; int zoom; int composite; - int composite2; sws_template sws_templ; vj_schedule_t action_scheduler; float output_fps; diff --git a/veejay-current/veejay-server/veejay/vj-misc.c b/veejay-current/veejay-server/veejay/vj-misc.c index 138ee67a..7d18ed13 100644 --- a/veejay-current/veejay-server/veejay/vj-misc.c +++ b/veejay-current/veejay-server/veejay/vj-misc.c @@ -41,6 +41,8 @@ #include #include #include +#include +#include #include @@ -644,3 +646,25 @@ int veejay_sprintf( char *s, size_t size, const char *format, ... ) } #endif +void xml2flt( xmlDocPtr doc, xmlNodePtr cur, float *dst , const xmlChar *name) { + if(!xmlStrcmp(cur->name, name ) ) { + xmlChar *xmlTemp = xmlNodeListGetString(doc, cur->xmlChildrenNode,1); + unsigned char *chTemp = UTF8toLAT1(xmlTemp); + if (chTemp) { + *dst = (float) atof( (char*)chTemp); + free(chTemp); + } + free(xmlTemp); + } +} +void xml2int( xmlDocPtr doc, xmlNodePtr cur, int *dst , const xmlChar *name) { + if(!xmlStrcmp(cur->name, name ) ) { + xmlChar *xmlTemp = xmlNodeListGetString(doc, cur->xmlChildrenNode,1); + unsigned char *chTemp = UTF8toLAT1(xmlTemp); + if (chTemp) { + *dst = (int) atoi( (char*)chTemp); + free(chTemp); + } + free(xmlTemp); + } +} diff --git a/veejay-current/veejay-server/veejay/vj-perform.c b/veejay-current/veejay-server/veejay/vj-perform.c index 1dc613cb..af025846 100644 --- a/veejay-current/veejay-server/veejay/vj-perform.c +++ b/veejay-current/veejay-server/veejay/vj-perform.c @@ -3111,22 +3111,6 @@ static char *vj_perform_osd_status( veejay_t *info ) tc.h, tc.m, tc.s, tc.f ); char *extra = NULL; - if( info->composite ) { - int status = -1; - if( info->uc->playback_mode == VJ_PLAYBACK_MODE_SAMPLE ) { - status = sample_get_composite( info->uc->sample_id ); - } else if (info->uc->playback_mode == VJ_PLAYBACK_MODE_TAG ) { - status = vj_tag_get_composite( info->uc->sample_id ); - } - if( status == 0 ) { - snprintf(tmp,sizeof(tmp), "Proj"); - extra = vj_strdup(tmp); - } - else if(status == 1 ) { - snprintf(tmp,sizeof(tmp), "Cam"); - extra = vj_strdup(tmp); - } - } switch(info->uc->playback_mode) { case VJ_PLAYBACK_MODE_SAMPLE: @@ -3251,27 +3235,7 @@ static void vj_perform_finish_render( veejay_t *info, video_playback_setup *sett //@ focus on projection screen if(composite_event( info->composite, pri, info->uc->mouse[0],info->uc->mouse[1],info->uc->mouse[2], - vj_perform_get_width(info), vj_perform_get_height(info)) ) { - //@ save config to playing sample/stream - if( info->uc->playback_mode == VJ_PLAYBACK_MODE_TAG ) { - void *cur = vj_tag_get_composite_view(info->uc->sample_id); - if(cur == NULL ) - { - cur = composite_clone(info->composite); - vj_tag_set_composite_view(info->uc->sample_id, cur ); - } - composite_set_backing(info->composite,cur); - vj_tag_reload_config( info->composite,info->uc->sample_id, 1); - - } else if ( info->uc->playback_mode == VJ_PLAYBACK_MODE_SAMPLE) { - void *cur = sample_get_composite_view(info->uc->sample_id); - if(cur==NULL) { - cur = composite_clone(info->composite); - sample_set_composite_view(info->uc->sample_id,cur); - } - composite_set_backing(info->composite,cur); - sample_reload_config( info->composite,info->uc->sample_id, 1 ); - } + vj_perform_get_width(info), vj_perform_get_height(info),info->homedir,info->uc->playback_mode,info->uc->sample_id ) ) { #ifdef HAVE_SDL if( info->video_out == 0 ) { //@ release focus diff --git a/veejay-current/veejay-server/veejay/vj-viewport-xml.h b/veejay-current/veejay-server/veejay/vj-viewport-cfg.h similarity index 83% rename from veejay-current/veejay-server/veejay/vj-viewport-xml.h rename to veejay-current/veejay-server/veejay/vj-viewport-cfg.h index edc6f011..42824d26 100644 --- a/veejay-current/veejay-server/veejay/vj-viewport-xml.h +++ b/veejay-current/veejay-server/veejay/vj-viewport-cfg.h @@ -45,10 +45,8 @@ typedef struct int initial_active; } viewport_config_t; -void viewport_save_xml(xmlNodePtr parent,void *vv); -void *viewport_load_xml(xmlDocPtr doc, xmlNodePtr cur, void *vv ); extern void composite_add_to_config( void *compiz, void *vc, int which_vp ); -extern void *composite_load_config( void *compiz, void *vc, int *result ); - -void *composite_get_config(void *compiz, int which_vp ); +extern void *composite_load_config( void *compiz, void *vc, void *backing, int *result ); +extern void *composite_get_config( void *compiz ); +extern void *composite_clone( void *compiz ); #endif diff --git a/veejay-current/veejay-server/veejay/vj-viewport.c b/veejay-current/veejay-server/veejay/vj-viewport.c index 3996b060..5e2dda6b 100644 --- a/veejay-current/veejay-server/veejay/vj-viewport.c +++ b/veejay-current/veejay-server/veejay/vj-viewport.c @@ -35,13 +35,12 @@ #include #include #include -#include -#include -#include #include #include #include #include +#include +#include #include #include #define X0 0 @@ -132,7 +131,6 @@ typedef struct char *help; uint8_t grid_val; int parameters[8]; - char *homedir; int32_t tx1,tx2,ty1,ty2; int32_t ttx1,ttx2,tty1,tty2; int mode; @@ -184,7 +182,7 @@ static matrix_t *viewport_matrix(void); static void viewport_find_transform( float *coord, matrix_t *M ); void viewport_line (uint8_t *plane,int x1, int y1, int x2, int y2, int w, int h, uint8_t col); static void draw_point( uint8_t *plane, int x, int y, int w, int h, int size, int col ); -static viewport_config_t *viewport_load_settings( const char *dir, int mode ); +static viewport_config_t *viewport_load_settings( char *dir ); static void viewport_prepare_process( viewport_t *v ); static void viewport_compute_grid( viewport_t *v ); @@ -1049,6 +1047,11 @@ void viewport_process_dynamic_map( void *data, uint8_t *in[3], uint8_t *out[3], float ttx,tty; int32_t x,y; int32_t itx,ity; + + outY[ w * h + 1 ] = 0; + outU[ w * h + 1 ] = 128; + outV[ w * h + 1 ] = 128; + /* #if defined (HAVE_ASM_MMX) || defined (HAVE_AMS_SSE ) @@ -1288,8 +1291,6 @@ void viewport_destroy( void *data ) if( v->T ) free( v->T ); if( v->map ) free( v->map ); if( v->help ) free( v->help ); - if( v->homedir) free(v->homedir); -// if( v->buf ) free(v->buf); if( v->ui ) { if( v->ui->scaler ) yuv_free_swscaler(v->ui->scaler); @@ -1441,8 +1442,16 @@ void viewport_set_initial_active( void *vv, int status ) v->initial_active = status; } -void *viewport_get_configuration(void *vv ) +void empireoftheclouds() { +} + +void *viewport_get_configuration(void *vv, char *filename ) +{ + viewport_config_t *vc = viewport_load_settings( filename ); + if(vc) { + return vc; + } viewport_t *v = (viewport_t*) vv; viewport_config_t *o = (viewport_config_t*) vj_calloc(sizeof(viewport_config_t)); //FIXME not always freed? @@ -1470,12 +1479,15 @@ void *viewport_get_configuration(void *vv ) return o; } -int viewport_reconfigure_from_config(void *vv, void *vc) +int viewport_reconfigure_from_config(void *vv, void *config, char *filename) { viewport_t *v = (viewport_t*) vv; - viewport_config_t *c = (viewport_config_t*) vc; - viewport_config_t *o = viewport_get_configuration(vv ); + viewport_config_t *c = (viewport_config_t*) config; + viewport_config_t *o = viewport_get_configuration(vv, filename); + veejay_msg(0,"Configuration saved %dx%d, have %dx%d", + c->saved_w, c->saved_h,v->saved_w,v->saved_h ); +/* if( c->saved_w != v->saved_w || c->saved_h != v->saved_h ) { float sx=1.0f; float sy=1.0f; @@ -1487,8 +1499,10 @@ int viewport_reconfigure_from_config(void *vv, void *vc) o->y0 = c->y0 * sy; o->w0 = c->w0 * sx; o->h0 = c->h0 * sy; - } + veejay_msg(VEEJAY_MSG_WARNING, "Correcting geometry for current setup"); + } +*/ // Clear map const int len = v->w * v->h; @@ -1538,7 +1552,7 @@ int viewport_reconfigure_from_config(void *vv, void *vc) v->user_ui = 0; viewport_process( v ); veejay_msg(VEEJAY_MSG_DEBUG, - "Reconfigured calibration for %dx%d to (1)=%fx%f\t(2)=%fx%f\t(3)=%fx%f\t(4)=%fx%f\t%dx%d+%dx%d", + "Reconfigured calibration for %dx%d to (1)=%fx%f\t(2)=%fx%f\t(3)=%fx%f\t(4)=%fx%f\t%fx%f+%fx%f", v->w,v->h,v->x1,v->y1,v->x2,v->y2,v->x3,v->y3,v->x4,v->y4,v->x0,v->y0,v->w0,v->h0); } @@ -1598,10 +1612,10 @@ void viewport_update_from(void *vv, void *bb) } -void *viewport_init(int x0, int y0, int w0, int h0, int w, int h, int iw, int ih,const char *homedir, int *enable, int *frontback, int mode ) +void *viewport_init(int x0, int y0, int w0, int h0, int w, int h, int iw, int ih,char *filename, int *enable, int *frontback, int mode ) { //@ try to load last saved settings - viewport_config_t *vc = viewport_load_settings( homedir,mode ); + viewport_config_t *vc = viewport_load_settings( filename ); if(vc) { float sx = (float) w / (float) vc->saved_w; float sy = (float) h / (float) vc->saved_h; @@ -1632,7 +1646,6 @@ void *viewport_init(int x0, int y0, int w0, int h0, int w, int h, int iw, int ih v->w = w; v->h = h; v->marker_size = 4; - v->homedir = strdup(homedir); v->disable = 0; int res; @@ -1683,7 +1696,6 @@ void *viewport_init(int x0, int y0, int w0, int h0, int w, int h, int iw, int ih if(! res ) { veejay_msg(VEEJAY_MSG_ERROR, "Invalid point locations"); - free(v->homedir); free(v->ui->buf[0]); free(v->ui); free(v); @@ -1693,12 +1705,20 @@ void *viewport_init(int x0, int y0, int w0, int h0, int w, int h, int iw, int ih // Allocate memory for map v->map = (int32_t*) vj_calloc(sizeof(int32_t) * RUP8(v->w * v->h + (v->w*2)) ); + if(!v->map) { + free(v->ui->buf[0]); + free(v->ui); + free(v); + free(vc); + veejay_msg(VEEJAY_MSG_ERROR, "Memory allocation error"); + return NULL; + } const int len = v->w * v->h; const int eln = len + ( v->w * 2 ); int k; - for( k = len ; k < eln ; k ++ ) - v->map[k] = len+1; + + veejay_memset( v->map, len+1, eln ); // calculate initial view viewport_process( v ); @@ -1741,7 +1761,6 @@ void *viewport_clone(void *vv, int new_w, int new_h ) q->ui->buf[0] = vj_calloc(sizeof(uint8_t) * RUP8(new_w * new_h) ); q->ui->scale = 1.0f; q->ui->scaler = viewport_init_swscaler(q->ui,new_w,new_h); - q->homedir = strdup(v->homedir); q->disable = 0; int res = viewport_configure( q, q->x1, q->y1, @@ -1760,7 +1779,6 @@ void *viewport_clone(void *vv, int new_w, int new_h ) if(! res ) { veejay_msg(VEEJAY_MSG_ERROR, "Invalid point locations"); - free(q->homedir); free(q->ui->buf[0]); free(q->ui); free(q); @@ -1768,7 +1786,7 @@ void *viewport_clone(void *vv, int new_w, int new_h ) } // Allocate memory for map - q->map = (int32_t*) vj_calloc(sizeof(int32_t) * RUP8(q->w * q->h + (q->w*2)) ); + q->map = (int32_t*) vj_malloc(sizeof(int32_t) * RUP8(q->w * q->h + (q->w*2)) ); const int len = q->w * q->h; const int eln = len + ( q->w * 2 ); @@ -1801,23 +1819,26 @@ char *viewport_get_help(void *data) return v->help; } -static viewport_config_t *viewport_load_settings( const char *dir, int mode ) + + +static viewport_config_t *viewport_load_settings( char *path ) { viewport_config_t *vc = vj_calloc(sizeof(viewport_config_t)); - char path[1024]; - sprintf(path, "%s/viewport.cfg", dir); FILE *fd = fopen( path, "r" ); if(!fd) { free(vc); + veejay_msg(VEEJAY_MSG_WARNING, "No such file %s", path); return NULL; } + fseek(fd,0,SEEK_END ); unsigned int len = ftell( fd ); if( len <= 0 ) { + veejay_msg(VEEJAY_MSG_WARNING, "File %s is empty",path); free(vc); return NULL; } @@ -1874,11 +1895,9 @@ static viewport_config_t *viewport_load_settings( const char *dir, int mode ) return vc; } -void viewport_save_settings( void *ptr, int frontback ) +void viewport_save_settings( void *ptr, int frontback, char *path ) { viewport_t *v = (viewport_t *) ptr; - char path[1024]; - sprintf(path, "%s/viewport.cfg", v->homedir ); FILE *fd = fopen( path, "wb" ); @@ -1915,7 +1934,7 @@ void viewport_save_settings( void *ptr, int frontback ) fclose( fd ); - veejay_msg(VEEJAY_MSG_DEBUG, "Saved viewport settings to %s", path); + veejay_msg(VEEJAY_MSG_INFO, "Saved viewport settings to %s. Press CTRL-p to enable/disable", path); } /* static int viewport_locate_marker( viewport_t *v, uint8_t *img, float fx, float fy , float *dx, float *dy ) @@ -2490,7 +2509,7 @@ int viewport_finetune_coord(void *data, int screen_width, int screen_height,int return 1; } -int viewport_external_mouse( void *data, uint8_t *img[3], int sx, int sy, int button, int frontback, int screen_width, int screen_height ) +int viewport_external_mouse( void *data, uint8_t *img[3], int sx, int sy, int button, int frontback, int screen_width, int screen_height, char *homedir, int mode, int id ) { viewport_t *v = (viewport_t*) data; if( sx == 0 && sy == 0 && button == 0 ) @@ -2591,7 +2610,20 @@ int viewport_external_mouse( void *data, uint8_t *img[3], int sx, int sy, int bu if( v->user_ui == 0 ) { - viewport_save_settings(v, frontback); + char filename[1024]; + switch(mode) { + case 1: + snprintf(filename,sizeof(filename), "%s/viewport-stream-%d.cfg", homedir,id ); + break; + case 0: + snprintf(filename,sizeof(filename), "%s/viewport-sample-%d.cfg", homedir,id ); + break; + default: + snprintf(filename,sizeof(filename),"%s/viewport.cfg", homedir); + break; + } + + viewport_save_settings(v, frontback, filename); } } @@ -3182,21 +3214,21 @@ void viewport_render_dynamic( void *vdata, uint8_t *in[3], uint8_t *out[3],int w } void *viewport_fx_init_map( int wid, int hei, int x1, int y1, - int x2, int y2, int x3, int y3, int x4, int y4) + int x2, int y2, int x3, int y3, int x4, int y4, int reverse) { viewport_t *v = (viewport_t*) vj_calloc(sizeof(viewport_t)); float fracx = (float) wid / 100.0f; float fracy = (float) hei / 100.0f; - v->x1 = x1 / fracx; - v->y1 = y1 / fracy; - v->x2 = x2 / fracx; - v->y2 = y2 / fracy; - v->x3 = x3 / fracx; - v->y3 = y3 / fracy; - v->x4 = x4 / fracx; - v->y4 = y4 / fracy; + v->x1 = x1; + v->y1 = y1; + v->x2 = x2; + v->y2 = y2; + v->x3 = x3; + v->y3 = y3; + v->x4 = x4; + v->y4 = y4; int res = viewport_configure (v, v->x1, v->y1, @@ -3206,7 +3238,7 @@ void *viewport_fx_init_map( int wid, int hei, int x1, int y1, 0,0, wid,hei, wid,hei, - 0, + reverse, 0xff, 32 ); @@ -3228,10 +3260,9 @@ int viewport_get_mode( void *vv ) { return v->user_ui; } -void *viewport_fx_init(int type, int wid, int hei, int x, int y, int zoom, int dir) +void *viewport_fx_zoom_init(int type, int wid, int hei, int x, int y, int zoom, int dir) { viewport_t *v = (viewport_t*) vj_calloc(sizeof(viewport_t)); - float fracx = (float) wid; float fracy = (float) hei; @@ -3285,141 +3316,4 @@ void *viewport_fx_init(int type, int wid, int hei, int x, int y, int zoom, int d } -static void flxml( xmlDocPtr doc, xmlNodePtr cur, float *dst , const xmlChar *name) { - if(!xmlStrcmp(cur->name, name ) ) { - xmlChar *xmlTemp = xmlNodeListGetString(doc, cur->xmlChildrenNode,1); - unsigned char *chTemp = UTF8toLAT1(xmlTemp); - if (chTemp) { - *dst = (float) atof( (char*)chTemp); - free(chTemp); - } - free(xmlTemp); - } -} -static void ixml( xmlDocPtr doc, xmlNodePtr cur, int *dst , const xmlChar *name) { - if(!xmlStrcmp(cur->name, name ) ) { - xmlChar *xmlTemp = xmlNodeListGetString(doc, cur->xmlChildrenNode,1); - unsigned char *chTemp = UTF8toLAT1(xmlTemp); - if (chTemp) { - *dst = (int) atoi( (char*)chTemp); - free(chTemp); - } - free(xmlTemp); - } -} -void *viewport_load_xml(xmlDocPtr doc, xmlNodePtr cur, void *vv ) -{ - viewport_t *vc = (viewport_t*) vv; - if(!vc || !cur) return NULL; - viewport_config_t *c = (viewport_config_t*) vj_calloc(sizeof(viewport_config_t)); - //effectIndex++; - while( cur != NULL ) { - flxml( doc,cur,&(c->x1),(const xmlChar*) "x1" ); - flxml( doc,cur,&(c->x2),(const xmlChar*)"x2" ); - flxml( doc,cur,&(c->y1),(const xmlChar*)"y1" ); - flxml( doc,cur,&(c->y2),(const xmlChar*)"y2" ); - flxml( doc,cur,&(c->x3),(const xmlChar*)"x3" ); - flxml( doc,cur,&(c->x4),(const xmlChar*)"x4" ); - flxml( doc,cur,&(c->y3),(const xmlChar*)"y3" ); - flxml( doc,cur,&(c->y4),(const xmlChar*)"y4" ); - ixml( doc,cur,&(c->x0),(const xmlChar*)"x0" ); - ixml( doc,cur,&(c->w0),(const xmlChar*)"w0" ); - ixml( doc,cur,&(c->y0),(const xmlChar*)"y0" ); - ixml( doc,cur,&(c->h0),(const xmlChar*)"h0" ); - ixml( doc,cur,&(c->saved_w),(const xmlChar*)"saved_w" ); - ixml( doc,cur,&(c->saved_h),(const xmlChar*)"saved_h" ); - ixml( doc,cur,&(c->reverse),(const xmlChar*)"reverse" ); - ixml( doc,cur,&(c->grid_color),(const xmlChar*)"grid_color" ); - ixml( doc,cur,&(c->grid_resolution),(const xmlChar*)"grid_resolution" ); - ixml( doc,cur,&(c->composite_mode),(const xmlChar*) "compositemode"); - ixml( doc,cur,&(c->colormode),(const xmlChar*) "colormode"); - ixml( doc,cur,&(c->marker_size),(const xmlChar*) "markersize"); - ixml( doc,cur,&(c->grid_mode),(const xmlChar*) "gridmode"); - cur = cur->next; - } - return (void*) c; -} - -void viewport_save_xml(xmlNodePtr parent,void *vv) -{ - viewport_config_t *vc = (viewport_config_t*) vv; - if(!vc) return; - - xmlNodePtr node = xmlNewChild(parent, NULL, - (const xmlChar*) "calibration", - NULL ); - - char buffer[100]; - - sprintf(buffer, "%f", vc->x1); - xmlNewChild(node, NULL, (const xmlChar *) "x1", - (const xmlChar *) buffer); - sprintf(buffer, "%f", vc->y1); - xmlNewChild(node, NULL, (const xmlChar *) "y1", - (const xmlChar *) buffer); - - sprintf(buffer, "%f", vc->x2); - xmlNewChild(node, NULL, (const xmlChar *) "x2", - (const xmlChar *) buffer); - sprintf(buffer, "%f", vc->y2); - xmlNewChild(node, NULL, (const xmlChar *) "y2", - (const xmlChar *) buffer); - - sprintf(buffer, "%f", vc->x3); - xmlNewChild(node, NULL, (const xmlChar *) "x3", - (const xmlChar *) buffer); - sprintf(buffer, "%f", vc->y3); - xmlNewChild(node, NULL, (const xmlChar *) "y3", - (const xmlChar *) buffer); - - sprintf(buffer, "%f", vc->x4); - xmlNewChild(node, NULL, (const xmlChar *) "x4", - (const xmlChar *) buffer); - sprintf(buffer, "%f", vc->y4); - xmlNewChild(node, NULL, (const xmlChar *) "y4", - (const xmlChar *) buffer); - - sprintf(buffer, "%d", vc->saved_w); - xmlNewChild(node, NULL, (const xmlChar *) "saved_w", - (const xmlChar *) buffer); - sprintf(buffer, "%d", vc->saved_h); - xmlNewChild(node, NULL, (const xmlChar *) "saved_h", - (const xmlChar *) buffer); - - sprintf(buffer, "%d", vc->reverse); - xmlNewChild(node, NULL, (const xmlChar *) "reverse", - (const xmlChar *) buffer); - sprintf(buffer, "%d", vc->grid_color); - xmlNewChild(node, NULL, (const xmlChar *) "grid_color", - (const xmlChar *) buffer); - - sprintf(buffer, "%d", vc->grid_resolution); - xmlNewChild(node, NULL, (const xmlChar *) "grid_resolution", - (const xmlChar *) buffer); - sprintf(buffer, "%d", vc->x0); - xmlNewChild(node, NULL, (const xmlChar *) "x0", - (const xmlChar *) buffer); - sprintf(buffer, "%d", vc->y0); - xmlNewChild(node, NULL, (const xmlChar *) "y0", - (const xmlChar *) buffer); - sprintf(buffer, "%d", vc->w0); - xmlNewChild(node, NULL, (const xmlChar *) "w0", - (const xmlChar *) buffer); - sprintf(buffer, "%d", vc->h0); - xmlNewChild(node, NULL, (const xmlChar *) "h0", - (const xmlChar *) buffer); - - sprintf(buffer, "%d", vc->colormode); - xmlNewChild(node, NULL, (const xmlChar *) "colormode", - (const xmlChar *) buffer); - sprintf(buffer, "%d", vc->composite_mode); - xmlNewChild(node, NULL, (const xmlChar *) "compositemode", - (const xmlChar *) buffer); - sprintf(buffer, "%d", vc->marker_size); - xmlNewChild(node, NULL, (const xmlChar *) "markersize", - (const xmlChar *) buffer); - sprintf(buffer, "%d", vc->grid_mode); - xmlNewChild(node, NULL, (const xmlChar *) "gridmode", - (const xmlChar *) buffer); -} diff --git a/veejay-current/veejay-server/veejay/vj-viewport.h b/veejay-current/veejay-server/veejay/vj-viewport.h index ff9d409d..5d214615 100644 --- a/veejay-current/veejay-server/veejay/vj-viewport.h +++ b/veejay-current/veejay-server/veejay/vj-viewport.h @@ -24,7 +24,8 @@ #define VP_QUADZOOM 1 void viewport_process_dynamic( void *data, uint8_t *in[3], uint8_t *out[3] ); void viewport_process_dynamic_map( void *data, uint8_t *in[3], uint8_t *out[3], uint32_t *map, int feather ); -void *viewport_fx_init( int type, int wid, int hei, int x, int y, int zoom, int dir ); +void *viewport_fx_init_map( int wid, int hei, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int reverse); +void *viewport_fx_zoom_init(int type, int wid, int hei, int x, int y, int zoom, int dir); void viewport_update_from(void *vv, void *bb); void *viewport_clone(void *iv, int new_w, int new_h ); void viewport_set_ui(void *vv, int value ); @@ -32,11 +33,11 @@ void viewport_set_ui(void *vv, int value ); int viewport_active( void *data ); int viewport_render_ssm(void *vdata ); void viewport_render( void *data, uint8_t *in[3], uint8_t *out[3], int width, int height,int uv_len ); -int viewport_external_mouse( void *data, uint8_t *in[3],int sx, int sy, int button, int frontback, int w, int h ); +int viewport_external_mouse( void *data, uint8_t *in[3],int sx, int sy, int button, int frontback, int w, int h, char *homedir, int mode, int id ); char *viewport_get_help(void *data); char *viewport_get_my_status(void *v); void viewport_clone_parameters( void *src , void *dst ); -void *viewport_init(int x0, int y0, int w0, int h0, int w, int h,int iw, int ih, const char *dir, int *enable, int *frontback, int mode); +void *viewport_init(int x0, int y0, int w0, int h0, int w, int h,int iw, int ih, char *dir, int *enable, int *frontback, int mode); int viewport_active( void *data ); void viewport_destroy( void *data ); void vewport_draw_interface_color( void *vdata, uint8_t *img[3] ); @@ -52,17 +53,17 @@ int viewport_event_set_projection(void *data, float x, float y, int num, int fb) void viewport_push_frame(void *data, int w, int h, uint8_t *Y, uint8_t *U, uint8_t *V ); void viewport_reconfigure(void *vv); int viewport_get_mode(void *vv); -int viewport_reconfigure_from_config(void *vv, void *vc); +int viewport_reconfigure_from_config(void *vv, void *vc, char *filename); void viewport_set_composite(void *vc, int mode, int colormode); int viewport_get_color_mode_from_config(void *vc); int viewport_get_composite_mode_from_config(void *vc); -void *viewport_get_configuration(void *vv ); +void *viewport_get_configuration(void *vv, char *filename ); int viewport_finetune_coord(void *data, int screen_width, int screen_height,int inc_x,int inc_y); void viewport_set_initial_active( void *vv, int status ); int viewport_get_initial_active( void *vv ); char *viewport_get_my_help(void *vv); int viewport_finetune_coord(void *data, int screen_width, int screen_height,int inc_x, int inc_y); -void viewport_save_settings( void *v, int frontback ); +void viewport_save_settings( void *v, int frontback, char *path ); void viewport_produce_full_img( void *vdata, uint8_t *img[3], uint8_t *out_img[3] ); #endif