diff --git a/veejay-current/veejay-client/src/callback.c b/veejay-current/veejay-client/src/callback.c index d64d2250..50359d12 100644 --- a/veejay-current/veejay-client/src/callback.c +++ b/veejay-current/veejay-client/src/callback.c @@ -2951,25 +2951,13 @@ gboolean on_entry_filename_focus_in_event( GtkWidget *w, gpointer user_data) void on_previewbw_toggled( GtkWidget *w , gpointer user_data) { single_vims( VIMS_PREVIEW_BW ); - vj_midi_learning_vims_simple(info->midi,NULL,VIMS_PREVIEW_BW); + + } void on_previewtoggle_toggled(GtkWidget *w, gpointer user_data) { - if(!info->preview_locked) - { - multitrack_toggle_preview( info->mt, -1, is_button_toggled("previewtoggle"), - glade_xml_get_widget(info->main_window, "imageA") ); - } - multitrack_set_quality( info->mt, info->quality ); - -/* multitrack_toggle_preview( info->mt, - -1, - 1, - glade_xml_get_widget(info->main_window,"imageA")); - */ //@ enable - -// setup_samplebank( NUM_SAMPLES_PER_COL, NUM_SAMPLES_PER_ROW ); + multitrack_toggle_preview( info->mt, -1, is_button_toggled("previewtoggle"),glade_xml_get_widget(info->main_window, "imageA") ); } void on_previewspeed_value_changed( GtkWidget *widget, gpointer user_data) @@ -4005,34 +3993,22 @@ void on_seqactive_toggled( GtkWidget *w, gpointer data ) multi_vims( VIMS_SEQUENCE_STATUS, "%d" , is_button_toggled("seqactive" ) ? 1 : 0 ); vj_midi_learning_vims_msg(info->midi,NULL, VIMS_SEQUENCE_STATUS, is_button_toggled("seqactive")); } -void on_bq_button_clicked( GtkWidget *w, gpointer data ) -{ - info->quality = 2; - multitrack_set_quality( info->mt, 2 ); - set_toggle_button( "previewtoggle", 1 ); -} -void on_hqbutton_clicked( GtkWidget *w, gpointer data ) +void on_hqbutton_clicked( GtkWidget *w, gpointer data ) // 1/1 { - info->quality = 1; - multitrack_set_quality( info->mt, 1 ); - set_toggle_button( "previewtoggle", 1 ); - -} -void on_lqbutton_clicked( GtkWidget *w, gpointer data ) -{ - info->quality = 0; multitrack_set_quality( info->mt, 0 ); - set_toggle_button( "previewtoggle", 1 ); - } -void on_uq_button_clicked( GtkWidget *w, gpointer data ) +void on_lqbutton_clicked( GtkWidget *w, gpointer data ) // 1/2 +{ + multitrack_set_quality( info->mt, 1 ); +} +void on_bq_button_clicked( GtkWidget *w, gpointer data ) // 1/4 +{ + multitrack_set_quality( info->mt, 2 ); +} +void on_uq_button_clicked( GtkWidget *w, gpointer data ) // 1/8 { - info->quality = 3; multitrack_set_quality( info->mt, 3 ); - if(!is_button_toggled( "previewtoggle" )) - set_toggle_button( "previewtoggle", 1 ); - } void on_record_vp_clicked( GtkWidget *w, gpointer data ) diff --git a/veejay-current/veejay-client/src/gveejay.c b/veejay-current/veejay-client/src/gveejay.c index b4edb386..5f7ff888 100644 --- a/veejay-current/veejay-client/src/gveejay.c +++ b/veejay-current/veejay-client/src/gveejay.c @@ -43,8 +43,6 @@ static int col = 0; static int row = 0; static int n_tracks = 4; static int launcher = 0; -static int pw = 176; -static int ph = 144; static int preview = 0; // off static int use_threads = 0; static char midi_file[1024]; @@ -244,7 +242,7 @@ int main(int argc, char *argv[]) { find_user_themes(gveejay_theme); - vj_gui_set_debug_level( verbosity , n_tracks,pw,ph); + vj_gui_set_debug_level( verbosity , n_tracks,0,0); set_skin( selected_skin ); default_bank_values( &col, &row ); diff --git a/veejay-current/veejay-client/src/multitrack.c b/veejay-current/veejay-client/src/multitrack.c index 38244da4..5cac497e 100644 --- a/veejay-current/veejay-client/src/multitrack.c +++ b/veejay-current/veejay-client/src/multitrack.c @@ -37,15 +37,14 @@ #define SEQ_BUTTON_CLOSE 0 #define SEQ_BUTTON_RULE 1 -#ifdef STRICT_CHECKING -#include -#endif #include #include #include #include #include #define __MAX_TRACKS 64 +#define RUP8(num)(num/8*8) + typedef struct { GtkWidget *event_box; @@ -106,15 +105,10 @@ static sequence_view_t *new_sequence_view( void *vp, int num ); static void update_pos( void *data, gint total, gint current ); static gboolean seqv_mouse_press_event ( GtkWidget *w, GdkEventButton *event, gpointer user_data); - extern GdkPixbuf *vj_gdk_pixbuf_scale_simple( GdkPixbuf *src, int dw, int dh, GdkInterpType inter_type ); extern void gtk_widget_set_size_request__( GtkWidget *w, gint iw, gint h, const char *f, int line ); -#ifndef STRICT_CHECKING #define gtk_widget_set_size_request_(a,b,c) gtk_widget_set_size_request(a,b,c) -#else -#define gtk_widget_set_size_request_(a,b,c) gtk_widget_set_size_request__(a,b,c,__FUNCTION__,__LINE__) -#endif int mt_get_max_tracks() { @@ -134,18 +128,12 @@ static void gtk_widget_set_sensitive__( GtkWidget *w, gboolean state, const char #ifdef STRICT_CHECKING if( !GTK_IS_WIDGET(w) ) veejay_msg(0, "Invalid widget '%s', %d", f, l ); - assert( GTK_IS_WIDGET(w) ); #endif gtk_widget_set_sensitive(w, state ); } -#ifdef STRICT_CHECKING -#define gtk_image_set_from_pixbuf_(w,p) gtk_image_set_from_pixbuf__( w,p, __FUNCTION__,__LINE__ ); -#define gtk_widget_set_sensitive_( w,p ) gtk_widget_set_sensitive__( w,p,__FUNCTION__,__LINE__ ) -#else #define gtk_image_set_from_pixbuf_(w,p) gtk_image_set_from_pixbuf(w,p) #define gtk_widget_set_sensitive_( w,p ) gtk_widget_set_sensitive(w,p) -#endif static void status_print(multitracker_t *mt, const char format[], ... ) { char buf[1024]; @@ -168,6 +156,56 @@ static GdkPixbuf *load_logo_image(int dw, int dh ) return gdk_pixbuf_new_from_file( path,NULL ); } +void multitrack_get_preview_dimensions( int w , int h, int *dst_w, int *dst_h ) +{ + int tmp_w = w; + int tmp_h = h; + + float ratio = (float)tmp_w / (float) tmp_h; + + if( tmp_h > MAX_PREVIEW_HEIGHT ) { + tmp_h = MAX_PREVIEW_HEIGHT; + tmp_w = (int) ( (float) tmp_h * ratio ); + } + if( tmp_w > MAX_PREVIEW_WIDTH ) { + tmp_w = MAX_PREVIEW_WIDTH; + tmp_h = tmp_w / ratio; + } + + *dst_w = RUP8(tmp_w); + *dst_h = RUP8(tmp_h); +} + +static void calculate_img_dimension(int w, int h, int *dst_w, int *dst_h, float *result, int max_w, int max_h, int quality) +{ + int tmp_w = w; + int tmp_h = h; + + float ratio = (float)tmp_w / (float) tmp_h; + *result = ratio; + + if( quality != 1 ) { + int qdown = quality; + while( (qdown > 0) ) { + tmp_h = tmp_h / 2; + tmp_w = tmp_w / 2; + qdown--; + } + } + + if( tmp_h > max_h ) { + tmp_h = max_h; + tmp_w = (int) ( (float) tmp_h * ratio ); + } else if( tmp_w > max_w ) { + tmp_w = max_w; + tmp_h = tmp_w / ratio; + } + + *dst_w = RUP8(tmp_w); + *dst_h = RUP8(tmp_h); +} + + int multitrack_get_sequence_view_id( void *data ) { sequence_view_t *s = (sequence_view_t*) data; @@ -395,9 +433,6 @@ static void add_buttons2( sequence_view_t *p, sequence_view_t *seqv , GtkWidget static void playmode_sensitivity( sequence_view_t *p, gint pm ) { int i; -#ifdef STRICT_CHECKING - assert( p != NULL ); -#endif if( pm == MODE_STREAM || MODE_PLAIN || MODE_SAMPLE ) { if(p->num > 0) @@ -491,13 +526,15 @@ int update_multitrack_widgets( void *data, int *array, int track ) static void sequence_preview_size(multitracker_t *mt, int track_num) { - float ratio = mt->width / (float)mt->height; - int w = 80; - int h = ( (int)( (float)w/ratio ))/16*16; + float ratio = 0.0f; + int tmp_w = 0; + int tmp_h = 0; - if(!gvr_track_configure( mt->preview, track_num,w,h ) ) + calculate_img_dimension(mt->width,mt->height, &tmp_w, &tmp_h, &ratio, 80, 60,1); + + if(!gvr_track_configure( mt->preview, track_num,tmp_w,tmp_h ) ) { - veejay_msg(0, "Unable to configure preview %d x %d",w , h ); + veejay_msg(0, "Unable to configure preview %d x %d",tmp_w,tmp_h ); } } @@ -794,11 +831,6 @@ void *multitrack_new( int num_tracks) { multitracker_t *mt = NULL; -#ifdef STRICT_CHECKING - assert( max_w > 0 ); - assert( max_h > 0 ); - assert( num_tracks > 0 ); -#endif MAX_TRACKS = num_tracks; @@ -808,7 +840,7 @@ void *multitrack_new( mt->main_window = win; mt->main_box = box; mt->status_bar = msg; - mt->logo = load_logo_image(vj_get_preview_box_w(), vj_get_preview_box_h()); + mt->logo = load_logo_image(0,0); mt->preview_toggle = preview_toggle; mt->scroll = gtk_scrolled_window_new(NULL,NULL); // gtk_widget_set_size_request(mt->scroll,50+max_w*2, max_h); @@ -952,74 +984,30 @@ int multitrack_locked( void *data) return mt->view[mt->master_track]->status_lock; } -#define RUP8(num)(num/8*8) - void multitrack_configure( void *data, float fps, int video_width, int video_height, int *box_w, int *box_h ) { multitracker_t *mt = (multitracker_t*) data; mt->fps = fps; - mt->width = video_width; - mt->height = video_height; - float r = (float)mt->width / (float) mt->height; - mt->aspect_ratio = r; - if( mt->height > 300 ) { - mt->height = DEFAULT_PREVIEW_HEIGHT; - mt->width = (int) ( (float) mt->height * r ); - } - if( mt->width > 360 ) { - mt->width = DEFAULT_PREVIEW_WIDTH; - mt->height = mt->width / r; - } - - mt->width = RUP8(mt->width); - mt->height = RUP8(mt->height); + calculate_img_dimension(video_width,video_height,&(mt->width),&(mt->height),&(mt->aspect_ratio),vj_get_preview_box_w(),vj_get_preview_box_h(),1); *box_w = mt->width; *box_h = mt->height; - veejay_msg(VEEJAY_MSG_DEBUG, "Multitrack %d x %d, %2.2f, ratio %f", mt->width,mt->height,mt->fps,r); + veejay_msg(VEEJAY_MSG_DEBUG, "Multitrack %d x %d, %2.2f, ratio %f", mt->width,mt->height,mt->fps,mt->aspect_ratio); } void multitrack_set_quality( void *data , int quality ) { multitracker_t *mt = (multitracker_t*) data; - + float ratio = 0.0f; int w = 0; int h = 0; - switch( quality ) - { - case 1: - w = mt->width; - h = (float) w / mt->aspect_ratio; - break; - case 0: - w = mt->width >> 1; - h = (float)w / mt->aspect_ratio; - break; - case 2: - w = mt->width >> 2; - h = (float)w/ mt->aspect_ratio; - break; - case 3: - w = mt->width >> 3; - h = (float)w / mt->aspect_ratio; - break; - } - if( w > 16 && h > 16 ) - { - w = RUP8(w); - h = RUP8(h); - } - else - { - w = RUP8(mt->width); - h = RUP8(mt->height); - } + calculate_img_dimension(mt->width,mt->height,&w,&h,&ratio,vj_get_preview_box_w(),vj_get_preview_box_h(),quality); veejay_msg(VEEJAY_MSG_DEBUG, - "Preview image dimensions set to %d x %d",w,h); + "Preview image dimensions changed to %d x %d",w,h); if(!gvr_track_configure( mt->preview, mt->master_track,w,h ) ) { @@ -1043,6 +1031,8 @@ void multitrack_toggle_preview( void *data, int track_id, int status, GtkWidget { gvr_track_toggle_preview( mt->preview, mt->master_track, status ); veejay_msg(2, "VeejayGrabber: master preview %s", (status ? "enabled" : "disabled") ); + if( status == 0 ) + multitrack_set_logo( data, img ); } } @@ -1078,10 +1068,11 @@ void multitrack_bind_track( void *data, int id, int bind_this ) void multitrack_update_sequence_image( void *data , int track, GdkPixbuf *img ) { multitracker_t *mt = (multitracker_t*) data; + float ratio = 0.0f; + int w = 0; + int h = 0; - float ratio = mt->width / (float) mt->height; - int w = 160; - int h = ((int) (float )w / ratio )/16 *16; + calculate_img_dimension(mt->width,mt->height, &w, &h, &ratio, 160, 120,1); GdkPixbuf *scaled = vj_gdk_pixbuf_scale_simple( img, w, h, GDK_INTERP_BILINEAR ); gtk_image_set_from_pixbuf( GTK_IMAGE(mt->view[track]->area), scaled); diff --git a/veejay-current/veejay-client/src/multitrack.h b/veejay-current/veejay-client/src/multitrack.h index 0875406a..ed0577c8 100644 --- a/veejay-current/veejay-client/src/multitrack.h +++ b/veejay-current/veejay-client/src/multitrack.h @@ -1,9 +1,6 @@ #ifndef MTRACK_H #define MTRACK_H -#define DEFAULT_PREVIEW_WIDTH (int)(352.0f*0.85f) -#define DEFAULT_PREVIEW_HEIGHT (int)(288.0f*0.85f) - void *multitrack_new( void (*f)(int,char*,int), int (*g)(GdkPixbuf *, GdkPixbuf *, GtkImage *), @@ -36,22 +33,22 @@ void multitrack_sync_simple_cmd2( void *data, int vims, int arg ); void *multitrack_sync( void * mt ); -void multitrack_configure( void *data, float fps, int video_width, int video_height, int *bw, int *bh ); +void multitrack_configure( void *data, float fps, int video_width, int video_height, int *bw, int *bh ); -void multitrack_update_sequence_image( void *data , int track, GdkPixbuf *img ); +void multitrack_update_sequence_image( void *data , int track, GdkPixbuf *img ); -int update_multitrack_widgets( void *data, int *array, int track ); +int update_multitrack_widgets( void *data, int *array, int track ); -int multitrack_locked( void *data); +int multitrack_locked( void *data); -void multitrack_toggle_preview( void *data, int track_id, int status, GtkWidget *img ); +void multitrack_toggle_preview( void *data, int track_id, int status, GtkWidget *img ); -void multitrack_set_quality( void *data , int quality ); +void multitrack_set_quality( void *data , int quality ); -void multitrack_sync_start(void *data); +void multitrack_sync_start(void *data); -void multitrack_sync_simple_cmd( void *data, int vims, int arg ); +void multitrack_sync_simple_cmd( void *data, int vims, int arg ); void multitrack_resize( void *m , int w, int h ); diff --git a/veejay-current/veejay-client/src/sequence.c b/veejay-current/veejay-client/src/sequence.c index c395dac9..94c55230 100644 --- a/veejay-current/veejay-client/src/sequence.c +++ b/veejay-current/veejay-client/src/sequence.c @@ -35,9 +35,9 @@ #include #include #include -#ifdef STRICT_CHECKING -#include -#endif + +#define RUP8(num)(((num)+8)&~8) + extern void reloaded_schedule_restart(); typedef struct { @@ -66,8 +66,6 @@ typedef struct int preview; int width; int height; - int prevwidth; - int prevheight; int prevmode; int need_track_list; unsigned char *queue[16]; @@ -107,8 +105,6 @@ static float get_ratio(int w, int h) return ( (float) w / (float) h); } - - void *gvr_preview_init(int max_tracks, int use_threads) { veejay_preview_t *vp = (veejay_preview_t*) vj_calloc(sizeof( veejay_preview_t )); @@ -131,8 +127,7 @@ static void gvr_close_connection( veejay_track_t *v ) { if(v) { - veejay_msg(VEEJAY_MSG_WARNING, "Stopping VeejayGrabber to %s:%d", - v->hostname,v->port_num ); + veejay_msg(VEEJAY_MSG_WARNING, "Stopping VeejayGrabber to %s:%d",v->hostname,v->port_num ); vj_client_close(v->fd); vj_client_free(v->fd); if(v->hostname) free(v->hostname); @@ -349,101 +344,15 @@ static int veejay_process_status( veejay_preview_t *vp, veejay_track_t *v ) veejay_memset( v->status_tokens,0, sizeof(sizeof(int) * 32)); status_to_arr( v->status_buffer, v->status_tokens ); -/* - - - gint n = vj_client_read( v->fd, V_STATUS, status_len, 5 ); - - if( n <= 0 && v->is_master ) - reloaded_schedule_restart(); - -#ifdef STRICT_CHECKING - assert( status_len[0] == 'V' ); -#endif - - if( status_len[0] == 'V' ) - { - gint bytes = 0; - sscanf( status_len + 1, "%03d", &bytes ); - if( bytes > 0 ) - { - veejay_memset( v->status_buffer,0, sizeof(v->status_buffer)); - n = vj_client_read( v->fd, V_STATUS, v->status_buffer, bytes ); - veejay_msg(0, " --> [%s]", v->status_buffer ); - if( n <= 0 ) - { - if( n == -1 && v->is_master ) - reloaded_schedule_restart(); - veejay_msg(0, "Status message corrupted."); - return 0; - } - int k = -1; - while( (k = vj_client_poll( v->fd, V_STATUS )) ) // is there a more recent message? - { - veejay_msg(0,"More in buffer!"); - veejay_memset( status_len, 0, sizeof( status_len ) ); - n = vj_client_read(v->fd, V_STATUS, status_len, 5 ); - veejay_msg(0, "FLUSH %d [%s]",n,status_len ); - if( n == -1 && v->is_master ) - reloaded_schedule_restart(); - sscanf( status_len+1, "%03d", &bytes ); - if(bytes > 0 ) - { - n = vj_client_read( v->fd, V_STATUS, v->status_buffer, bytes ); - veejay_msg(0, "FLUSH --> [%s]", v->status_buffer ); - if( n <= 0 ) { - if( n == -1 && v->is_master ) - reloaded_schedule_restart(); - - break; - } - } - } - if( k == -1 && v->is_master ) - - reloaded_schedule_restart(); - veejay_memset( v->status_tokens,0, sizeof(sizeof(int) * 32)); - status_to_arr( v->status_buffer, v->status_tokens ); - return 1; - } -#ifdef STRICT_CHECKING - else { - assert(0); - } -#endif - } - else - { - veejay_msg(0, "FATAL! cannot parse status message."); - assert(0); - int err = 0; - - while( ( n = vj_client_poll( v->fd, V_STATUS ))) - { - char trashcan[100]; - int k = vj_client_read( v->fd, V_STATUS, trashcan,sizeof(trashcan)); -#ifdef STRICT_CHECKING - veejay_msg(VEEJAY_MSG_DEBUG, "Flushing %d bytes '%s'",k,trashcan); -#endif - if( k <= 0 && v->is_master) - err = -1; - } - - if( n <= 0 && v->is_master ) - err = -1; - - if( err == -1) - reloaded_schedule_restart(); - }*/ return 1; } extern int is_button_toggled(const char *name); -#define RUP8(num)(((num)+8)&~8) static int veejay_get_image_data(veejay_preview_t *vp, veejay_track_t *v ) { if(!v->have_frame && (v->width <= 0 || v->height <= 0) ) return 1; + gint res = sendvims( v, VIMS_RGB24_IMAGE, "%d %d", v->width,v->height ); if( res <= 0 ) { @@ -460,55 +369,34 @@ static int veejay_get_image_data(veejay_preview_t *vp, veejay_track_t *v ) return res; } - int expected_len = (v->width * v->height) + (v->width*v->height/2); + int expected_len = (v->width * v->height); + int srcfmt = PIX_FMT_YUVJ420P; //default + if(v->grey_scale) { + srcfmt = PIX_FMT_GRAY8; + } + else { + expected_len += (v->width*v->height/4); + expected_len += (v->width*v->height/4); + } - if( bw != (v->width * v->height) && bw != expected_len ) + if( bw != expected_len ) { -//@ try to fallback to a different resolution veejay_msg(VEEJAY_MSG_WARNING, "Corrupted image. Should be %dx%d but have %d bytes %s", v->width,v->height,abs(bw - expected_len),( (bw-expected_len<0)? "too few" : "too many") ); v->have_frame = 0; -#ifdef STRICT_CHECKING - assert(0); -#endif return 0; } uint8_t *in = v->data_buffer; uint8_t *out = v->tmp_buffer; -#ifdef STRICT_CHECKING - if( v->grey_scale ) - assert( bw == (v->width * v->height)); - else - assert( bw == ( (v->width*v->height) + (v->width*v->height)/2 ) ); -#endif + v->bw = 0; - - VJFrame *src1 = NULL; - if( v->grey_scale == 0 ) - src1 = yuv_yuv_template( in, in + (v->width * v->height), - in + (v->width * v->height) + (v->width*v->height)/4 , - v->width,v->height, PIX_FMT_YUV420P ); - else - src1 = yuv_yuv_template( in, in, in, v->width,v->height, PIX_FMT_GRAY8 ); - - if( (v->prevwidth != v->width) || (v->prevheight != v->height) || (v->prevmode != v->grey_scale ) ) { - v->prevwidth = v->width; - v->prevheight = v->height; - v->prevmode = v->grey_scale; - veejay_memset( in, 0, v->width*v->height); - if(!v->grey_scale) { - veejay_memset( in + (v->width*v->height), 128, ((v->width*v->height)/4)); - veejay_memset( in + (v->width*v->height) + ((v->width*v->height)/4),128,((v->width*v->height)/4)); - } - } - - VJFrame *dst1 = NULL; + VJFrame *src1 = yuv_yuv_template( in, in + (v->width * v->height), in + (v->width * v->height) + (v->width*v->height)/4,v->width,v->height, srcfmt ); + VJFrame *dst1 = yuv_rgb_template( out, v->width,v->height, PIX_FMT_BGR24 ); - dst1 = yuv_rgb_template( out, v->width,v->height, PIX_FMT_BGR24 ); - yuv_convert_any_ac( src1, dst1, src1->format, dst1->format ); + v->have_frame = 1; free(src1); @@ -547,6 +435,7 @@ static int gvr_preview_process_image( veejay_preview_t *vp, veejay_track_t *v ) int n = veejay_get_image_data( vp, v ); if(n == 0 ) { + veejay_msg(0, "No image data %d x %d" , v->width,v->height); //@ settle fail_connection ++; if( fail_connection > 2 ) { @@ -677,9 +566,9 @@ int gvr_track_connect( void *preview, const char *hostname, int port_num, int * vt->preview = is_button_toggled( "previewtoggle" ); vt->status_buffer = (uint8_t*) vj_calloc(sizeof(uint8_t) * 256); - vt->data_buffer = (uint8_t*) vj_calloc(sizeof(uint8_t) * 512 * 512 * 3 ); - vt->tmp_buffer = (uint8_t*) vj_calloc(sizeof(uint8_t) * 512 * 512 * 3 ); - + vt->data_buffer = (uint8_t*) vj_calloc(sizeof(uint8_t) * RUP8(MAX_PREVIEW_WIDTH * MAX_PREVIEW_HEIGHT * 3) ); + vt->tmp_buffer = (uint8_t*) vj_calloc(sizeof(uint8_t) * RUP8( MAX_PREVIEW_WIDTH * MAX_PREVIEW_HEIGHT * 4) ); + *new_track = track_num; vp->tracks[ track_num ] = vt; @@ -839,12 +728,6 @@ int gvr_track_configure( void *preview, int track_num, int w, int h ) vp->tracks[ track_num ]->height = h; } - veejay_msg(VEEJAY_MSG_INFO, "VeejayGrabber to %s:%d started on Track %d in %dx%d", - vp->tracks[ track_num ]->hostname, - vp->tracks[ track_num ]->port_num, - track_num, - w,h); - vp->track_sync->widths[track_num] = w; vp->track_sync->heights[track_num] = h; @@ -886,18 +769,12 @@ static GdkPixbuf **gvr_grab_images(void *preview) for( i = 0; i < vp->n_tracks; i ++ ) { - if( vp->tracks[i] && vp->tracks[i]->active && vp->track_sync->widths[i] > 0) + if( vp->tracks[i] && vp->tracks[i]->active && vp->track_sync->widths[i] > 0 && vp->tracks[i]->preview) { -#ifdef STRICT_CHECKING - assert( vp->track_sync->widths[i] > 0 ); - assert( vp->track_sync->heights[i] > 0 ); -#endif veejay_track_t *v = vp->tracks[i]; -//@FIXME HERE list[i] =gdk_pixbuf_new_from_data(vp->tracks[i]->tmp_buffer,GDK_COLORSPACE_RGB,FALSE, 8,vp->tracks[i]->width,vp->tracks[i]->height, vp->tracks[i]->width*3,NULL,NULL ); - } } @@ -1103,8 +980,8 @@ static int gvr_veejay( veejay_preview_t *vp , veejay_track_t *v, int track_num { v->preview = is_button_toggled( "previewtoggle"); v->active = 1; - vj_msg(VEEJAY_MSG_WARNING, "VeejayGrabber: connected with %s:%d on Track %d %d x %d", - v->hostname, v->port_num, track_num, v->width,v->height); + vj_msg(VEEJAY_MSG_WARNING, "VeejayGrabber: %s:%d track %d@%dx%d preview: %s", + v->hostname, v->port_num, track_num, v->width,v->height, (v->preview ? "yes" : "no")); } } diff --git a/veejay-current/veejay-client/src/utils.c b/veejay-current/veejay-client/src/utils.c index ed2fcf7a..dd0917aa 100644 --- a/veejay-current/veejay-client/src/utils.c +++ b/veejay-current/veejay-client/src/utils.c @@ -58,14 +58,14 @@ int status_to_arr( char *status, int *array ) char *format_time(int pos, double fps) { - static char temp[256]; + char temp[256]; MPEG_timecode_t tc; y4m_ratio_t r = mpeg_conform_framerate(fps); mpeg_timecode(&tc, pos, mpeg_framerate_code(r), fps ); - sprintf(temp, "%d:%2.2d:%2.2d:%2.2d",tc.h, tc.m, tc.s, tc.f ); + snprintf(temp,sizeof(temp),"%d:%2.2d:%2.2d:%2.2d",tc.h, tc.m, tc.s, tc.f ); return strdup(temp); } diff --git a/veejay-current/veejay-client/src/utils.h b/veejay-current/veejay-client/src/utils.h index 3caa2745..6b353af2 100644 --- a/veejay-current/veejay-client/src/utils.h +++ b/veejay-current/veejay-client/src/utils.h @@ -21,5 +21,13 @@ #define GVRUTILS int status_to_arr( char *status, int *array ); char *format_time( int pos , double fps); + + +#define DEFAULT_PREVIEW_WIDTH 520 +#define DEFAULT_PREVIEW_HEIGHT 300 + +#define MAX_PREVIEW_WIDTH 520 +#define MAX_PREVIEW_HEIGHT 300 + #endif diff --git a/veejay-current/veejay-client/src/vj-api.c b/veejay-current/veejay-client/src/vj-api.c index 0d333579..58f57530 100644 --- a/veejay-current/veejay-client/src/vj-api.c +++ b/veejay-current/veejay-client/src/vj-api.c @@ -298,7 +298,6 @@ static int NUM_BANKS = 50; static int NUM_SAMPLES_PER_PAGE = 12; static int NUM_SAMPLES_PER_COL = 6; static int NUM_SAMPLES_PER_ROW = 2; - static int use_key_snoop = 0; #define MOD_OFFSET 200 @@ -470,8 +469,6 @@ typedef struct void *mt; watchdog_t watch; int vims_line; - int quality; - int preview_locked; void *midi; struct timeval time_last; uint8_t *cali_buffer; @@ -545,8 +542,6 @@ static GtkListStore *cali_sourcestore = NULL; static GtkTreeModel *cali_sourcemodel = NULL; static int num_tracks_ = 2; -static int default_preview_width_ = 176; -static int default_preview_height_ = 144; /* global pointer to the editlist-tree */ static GtkWidget *editlist_tree = NULL; static GtkListStore *editlist_store = NULL; @@ -714,8 +709,8 @@ static struct { NULL }, }; -static int preview_box_w_ = DEFAULT_PREVIEW_WIDTH; -static int preview_box_h_ = DEFAULT_PREVIEW_HEIGHT; +static int preview_box_w_ = MAX_PREVIEW_WIDTH; +static int preview_box_h_ = MAX_PREVIEW_HEIGHT; static void *bankport_ = NULL; @@ -5688,9 +5683,6 @@ void get_gd(char *buf, char *suf, const char *filename) GdkPixbuf *vj_gdk_pixbuf_scale_simple( GdkPixbuf *src, int dw, int dh, GdkInterpType inter_type ) { -#ifdef STRICT_CHECKING - assert( GDK_IS_PIXBUF(src)); -#endif return gdk_pixbuf_scale_simple( src,dw,dh,inter_type ); /* GdkPixbuf *res = gdk_pixbuf_new( GDK_COLORSPACE_RGB, FALSE, 8, dw, dh ); @@ -5846,13 +5838,13 @@ int veejay_update_multitrack( void *data ) assert( s->heights[i] > 0 ); assert( GDK_IS_PIXBUF( s->img_list[i] ) ); #endif - if( gdk_pixbuf_get_height(s->img_list[i]) >= 255 || - gdk_pixbuf_get_width(s->img_list[i]) >= 320 ) - gtk_image_set_from_pixbuf_( GTK_IMAGE( maintrack ), s->img_list[i] ); + if( gdk_pixbuf_get_height(s->img_list[i]) == preview_box_w_ && + gdk_pixbuf_get_width(s->img_list[i]) == preview_box_h_ ) + gtk_image_set_from_pixbuf_( GTK_IMAGE( maintrack ), s->img_list[i] ); else { - GdkPixbuf *result = vj_gdk_pixbuf_scale_simple( s->img_list[i],DEFAULT_PREVIEW_WIDTH,DEFAULT_PREVIEW_HEIGHT, GDK_INTERP_NEAREST ); - gtk_image_set_from_pixbuf_( GTK_IMAGE( maintrack ), result ); - gdk_pixbuf_unref(result); + GdkPixbuf *result = vj_gdk_pixbuf_scale_simple( s->img_list[i],preview_box_w_,preview_box_h_, GDK_INTERP_NEAREST ); + gtk_image_set_from_pixbuf_( GTK_IMAGE( maintrack ), result ); + gdk_pixbuf_unref(result); } @@ -6535,9 +6527,8 @@ void vj_gui_set_debug_level(int level, int preview_p, int pw, int ph ) vims_verbosity = level; num_tracks_ = preview_p; - default_preview_width_ = pw; - default_preview_height_ = ph; } + int vj_gui_get_preview_priority(void) { return 1; @@ -7018,8 +7009,8 @@ void vj_gui_init(char *glade_file, int launcher, char *hostname, int port_num, set_toggle_button( "button_252", vims_verbosity ); - int pw = default_preview_width_; - int ph = default_preview_height_; + int pw = MAX_PREVIEW_WIDTH; + int ph = MAX_PREVIEW_HEIGHT; GtkWidget *img_wid = glade_xml_get_widget_( info->main_window, "imageA"); @@ -7111,21 +7102,18 @@ void vj_gui_init(char *glade_file, int launcher, char *hostname, int port_num, void vj_gui_preview(void) { - gint w = info->el.width; - gint h = info->el.height; + gint w = 0; + gint h = 0; + gint tmp_w = info->el.width; + gint tmp_h = info->el.height; + multitrack_get_preview_dimensions( tmp_w,tmp_h, &w, &h ); + update_spin_value( "priout_width", w ); update_spin_value( "priout_height", h ); - if( w > DEFAULT_PREVIEW_WIDTH ) - w = DEFAULT_PREVIEW_WIDTH; - if( h > DEFAULT_PREVIEW_HEIGHT ) - h = DEFAULT_PREVIEW_HEIGHT; - - update_spin_range( "preview_width", 16, w, - (info->run_state == RUN_STATE_REMOTE ? (default_preview_width_==0 ? w/4: default_preview_width_) : w ) ); - update_spin_range( "preview_height", 16, h, - (info->run_state == RUN_STATE_REMOTE ? (default_preview_height_ == 0 ? h/4 : default_preview_height_) : h ) ); + update_spin_range( "preview_width", 16, w, w); + update_spin_range( "preview_height", 16, h, h ); update_spin_incr( "preview_width", 16, 0 ); update_spin_incr( "preview_height", 16, 0 ); @@ -7379,11 +7367,11 @@ gboolean is_alive( int *do_sync ) #endif } multrack_audoadd( info->mt, remote, port ); + multitrack_set_quality( info->mt, 1 ); + *do_sync = 1; if( user_preview ) { - // info->preview_locked = 1; set_toggle_button( "previewtoggle", 1 ); - // info->preview_locked = 0; } veejay_stop_connecting(gui); } diff --git a/veejay-current/veejay-server/libel/pixbuf.c b/veejay-current/veejay-server/libel/pixbuf.c index 09b1853c..36ddab60 100644 --- a/veejay-current/veejay-server/libel/pixbuf.c +++ b/veejay-current/veejay-server/libel/pixbuf.c @@ -404,34 +404,34 @@ void vj_picture_free() void vj_fast_picture_save_to_mem( VJFrame *frame, int out_w, int out_h, int pixfmt ) { VJFrame *src1 = yuv_yuv_template( frame->data[0],frame->data[1],frame->data[2], - frame->width,frame->height, pixfmt ); + frame->width,frame->height, frame->format ); - uint8_t *dest[3]; + uint8_t *dest[4]; dest[0] = vj_perform_get_preview_buffer(); dest[1] = dest[0] + (out_w * out_h); dest[2] = dest[1] + (out_w * out_h)/4; //@ destination is yuv 4:2:0 + dest[3] = NULL; + int dst_fmt = PIX_FMT_YUV420P; + switch( frame->format ) { + case PIX_FMT_YUVJ420P: + case PIX_FMT_YUVJ422P: + case PIX_FMT_YUVJ444P: + dst_fmt = PIX_FMT_YUVJ420P; + } - int dst_fmt = (pixfmt == PIX_FMT_YUVJ420P || pixfmt == PIX_FMT_YUVJ422P ? PIX_FMT_YUVJ420P : PIX_FMT_YUV420P ); VJFrame *dst1 = yuv_yuv_template( dest[0], dest[1], dest[2], out_w, out_h, dst_fmt ); - pic_changed_ = pic_has_changed( out_w,out_h, pixfmt ); + pic_changed_ = pic_has_changed( out_w,out_h, dst_fmt ); if(pic_changed_ || pic_scaler_ == NULL ) { if(pic_scaler_) yuv_free_swscaler( pic_scaler_ ); pic_scaler_ = yuv_init_swscaler( src1,dst1, pic_template_, yuv_sws_get_cpu_flags()); - update_pic_data( out_w, out_h, pixfmt ); + update_pic_data( out_w, out_h, dst_fmt ); } - if( pic_scaler_ == NULL ) { - veejay_memset( dest[0], 0, frame->len); - veejay_memset( dest[1], 128, frame->uv_len); - veejay_memset( dest[2], 128, frame->uv_len); - } - else { - yuv_convert_and_scale( pic_scaler_, src1,dst1); - } + yuv_convert_and_scale( pic_scaler_, src1,dst1); free(src1); free(dst1); @@ -440,31 +440,28 @@ void vj_fast_picture_save_to_mem( VJFrame *frame, int out_w, int out_h, int pixf void vj_fastbw_picture_save_to_mem( VJFrame *frame, int out_w, int out_h, int pixfmt ) { VJFrame *src1 = yuv_yuv_template( frame->data[0],frame->data[1],frame->data[2], - frame->width,frame->height, pixfmt ); + frame->width,frame->height, frame->format ); - uint8_t *planes[3]; + uint8_t *planes[4]; planes[0] = vj_perform_get_preview_buffer(); planes[1] = planes[0] + (out_w * out_h ); - planes[2] = planes[1] + (out_w * out_h ); + planes[2] = planes[1] + (out_w * out_h/4 ); + planes[3] = NULL; - VJFrame *dst1 = yuv_yuv_template( planes[0], planes[1], planes[2], - out_w , out_h, PIX_FMT_GRAY8 ); - pic_changed_ = pic_has_changed( out_w,out_h, pixfmt ); + VJFrame *dst1 = yuv_yuv_template( planes[0], planes[1], planes[2], out_w , out_h, PIX_FMT_GRAY8 ); + pic_changed_ = pic_has_changed( out_w,out_h, PIX_FMT_GRAY8 ); if(pic_changed_ ) { if(pic_scaler_) yuv_free_swscaler( pic_scaler_ ); pic_scaler_ = yuv_init_swscaler( src1,dst1, pic_template_, yuv_sws_get_cpu_flags()); - update_pic_data( out_w, out_h, pixfmt ); + update_pic_data( out_w, out_h, PIX_FMT_GRAY8 ); } - if( frame->width == out_w && frame->height == out_h ) - yuv_convert_any_ac( src1,dst1,src1->format, dst1->format ); - else - yuv_convert_and_scale( pic_scaler_, src1, dst1); + yuv_convert_and_scale( pic_scaler_, src1, dst1); free(src1); free(dst1); diff --git a/veejay-current/veejay-server/veejay/vj-event.c b/veejay-current/veejay-server/veejay/vj-event.c index e98a736e..07a042d9 100644 --- a/veejay-current/veejay-server/veejay/vj-event.c +++ b/veejay-current/veejay-server/veejay/vj-event.c @@ -8511,29 +8511,29 @@ void vj_event_get_scaled_image ( void *ptr, const char format[], va_list ap ) P_A(args,str,format,ap); int w=0,h=0; + int max_w = vj_perform_preview_max_width(); + int max_h = vj_perform_preview_max_height(); + w = args[0]; h = args[1]; - if( w <= 0 || h <= 0 || w >= 4096 || h >= 4096 ) + if( w <= 0 || h <= 0 || w >= max_w || h >= max_h ) { - veejay_msg(0, "Invalid image dimension %dx%d requested",w,h ); + veejay_msg(0, "Invalid image dimension %dx%d requested (max is %dx%d)",w,h,max_w,max_h ); SEND_MSG(v, "0000000" ); return; } - int pixel_format = get_ffmpeg_pixfmt(v->pixel_format); int preview_size = 0; + int dstlen = 0; VJFrame frame; veejay_memcpy(&frame, v->effect_frame1, sizeof(VJFrame)); vj_perform_get_primary_frame( v, frame.data ); if( v->settings->composite ) { - pixel_format = composite_get_top( v->composite, frame.data, + frame.format = composite_get_top( v->composite, frame.data, frame.data, v->settings->composite ); - - frame.width = v->video_output_width; - frame.height = v->video_output_height; - switch(pixel_format) { + switch(frame.format) { case PIX_FMT_YUV444P: case PIX_FMT_YUVJ444P: frame.uv_width = frame.width; @@ -8567,23 +8567,26 @@ void vj_event_get_scaled_image ( void *ptr, const char format[], va_list ap ) } } //@ fast*_picture delivers always 4:2:0 data to reduce bandwidth - if( use_bw_preview_ ) + if( use_bw_preview_ ) { vj_fastbw_picture_save_to_mem( &frame, w, h, - pixel_format ); - else + frame.format ); + + dstlen = w * h; + } + else { vj_fast_picture_save_to_mem( &frame, w, h, - pixel_format ); - - int dstlen = (use_bw_preview_ ? ( w * h ) : ( ( w * h )/4 ) * 2 + (w * h) ); + frame.format ); + dstlen = (w * h) + ((w*h)/4) + ((w*h)/4); + } char header[8]; - sprintf( header, "%06d%1d", dstlen, use_bw_preview_ ); + snprintf( header,sizeof(header), "%06d%1d", dstlen, use_bw_preview_ ); SEND_DATA(v, header, 7 ); SEND_DATA(v, vj_perform_get_preview_buffer(), dstlen ); } diff --git a/veejay-current/veejay-server/veejay/vj-perform.c b/veejay-current/veejay-server/veejay/vj-perform.c index c22c7717..62a985a3 100644 --- a/veejay-current/veejay-server/veejay/vj-perform.c +++ b/veejay-current/veejay-server/veejay/vj-perform.c @@ -99,6 +99,10 @@ static ycbcr_frame **video_output_buffer = NULL; /* scaled video output */ static int video_output_buffer_convert = 0; static ycbcr_frame **frame_buffer; /* chain */ static ycbcr_frame **primary_buffer; /* normal */ +static ycbcr_frame *preview_buffer = NULL; +static int preview_max_w; +static int preview_max_h; + #define CACHE_TOP 0 #define CACHE 1 #define CACHE_SIZE (SAMPLE_MAX_EFFECTS+CACHE) @@ -667,6 +671,11 @@ int vj_perform_init(veejay_t * info) total_used += buf_len; } + preview_buffer = (ycbcr_frame*) vj_calloc(sizeof(ycbcr_frame)); + preview_max_w = w * 2; + preview_max_h = h * 2; + + preview_buffer->Y = (uint8_t*) vj_calloc( RUP8(preview_max_w * preview_max_h * 3) ); video_output_buffer_convert = 0; video_output_buffer = @@ -903,10 +912,21 @@ void vj_perform_free(veejay_t * info) free(video_output_buffer); free(helper_frame); + free(preview_buffer->Y); + free(preview_buffer); + if(lzo_) lzo_free(lzo_); } +int vj_perform_preview_max_width() { + return preview_max_w; +} + +int vj_perform_preview_max_height() { + return preview_max_h; +} + int vj_perform_audio_start(veejay_t * info) { editlist *el = info->edit_list; @@ -967,9 +987,10 @@ void vj_perform_get_space_buffer( uint8_t *d[4] ) d[1] = primary_buffer[5]->Cb; d[2] = primary_buffer[5]->Cr; } + uint8_t *vj_perform_get_preview_buffer() { - return primary_buffer[6]->Y; + return preview_buffer->Y; } void vj_perform_get_output_frame( uint8_t **frame ) diff --git a/veejay-current/veejay-server/veejay/vj-perform.h b/veejay-current/veejay-server/veejay/vj-perform.h index 7b11f179..293b99b2 100644 --- a/veejay-current/veejay-server/veejay/vj-perform.h +++ b/veejay-current/veejay-server/veejay/vj-perform.h @@ -5,6 +5,8 @@ /* multithreaded code, what starts in queue belongs to playback_thread */ uint8_t *vj_perform_get_preview_buffer(); +int vj_perform_preview_max_width(); +int vj_perform_preview_max_height(); void vj_perform_init_output_frame( veejay_t *info, uint8_t **frame, int dst_w, int dst_h );