From 40e7c5ba8d40b7bee4e0da5d583bbbfd034b81ec Mon Sep 17 00:00:00 2001 From: Niels Elburg Date: Tue, 6 Feb 2007 20:23:28 +0000 Subject: [PATCH] Keyboard speed control in playback direction, FX chain active in pause mode, fixed playback of audio, fixed audio up-and downsampling (like speeding up analogue tape), fixed recording of audio (if video sample has audio), fixed slot motion playback, increased AVI file limit to 32 gb, fixed preview rendering, cleanup of audio playback and recording, gveejayreloaded: sample bank pictures dont mix up anymore, button 'slow motion multiplier' added to sample panel, disable 'veejay framerate' when playing audio git-svn-id: svn://code.dyne.org/veejay/trunk@766 eb8d1916-c9e9-0310-b8de-cf0c9472ead5 --- veejay-current/configure.ac | 4 +- veejay-current/gveejay-reloaded/callback.c | 14 +- veejay-current/gveejay-reloaded/vj-api.c | 14 +- veejay-current/libel/avilib.c | 31 +- veejay-current/libel/avilib.h | 2 +- veejay-current/libel/lav_io.c | 197 ++++---- veejay-current/libel/lav_io.h | 2 +- veejay-current/libel/vj-avcodec.c | 3 +- veejay-current/libel/vj-el.c | 22 +- veejay-current/libel/vj-el.h | 1 - veejay-current/libsample/sampleadm.c | 11 +- veejay-current/libsamplerec/samplerecord.c | 9 +- veejay-current/share/gveejay.reloaded.glade | 8 +- veejay-current/veejay/liblavplayvj.c | 123 ++--- veejay-current/veejay/vims.h | 2 +- veejay-current/veejay/vj-bjack.h | 1 + veejay-current/veejay/vj-event.c | 56 ++- veejay-current/veejay/vj-event.h | 1 + veejay-current/veejay/vj-eventman.c | 13 +- veejay-current/veejay/vj-misc.h | 4 +- veejay-current/veejay/vj-perform.c | 485 ++++++++++---------- veejay-current/veejay/vj-perform.h | 2 +- veejay-current/veejay/vj-pjack.c | 19 +- 23 files changed, 507 insertions(+), 517 deletions(-) diff --git a/veejay-current/configure.ac b/veejay-current/configure.ac index 2e0fcc8d..2f4c2bf1 100644 --- a/veejay-current/configure.ac +++ b/veejay-current/configure.ac @@ -1,12 +1,12 @@ dnl Process this file with autoconf to produce a configure script. dnl AC_INIT -AC_INIT([veejay],[0.9.18],[veejay-users@lists.sourceforge.net]) +AC_INIT([veejay],[0.9.19],[veejay-users@lists.sourceforge.net]) AC_PREREQ(2.57) AC_CONFIG_SRCDIR([veejay/veejay.c]) VEEJAY_MAJOR_VERSION=0 VEEJAY_MINOR_VERSION=9 -VEEJAY_MICRO_VERSION=18 +VEEJAY_MICRO_VERSION=19 VEEJAY_VERSION=$VEEJAY_MAJOR_VERSION.$VEEJAY_MINOR_VERSION.$VEEJAY_MICRO_VERSION VEEJAY_CODENAME="Veejay Classic - build $VEEJAY_MINOR_VERSION $VEEJAY_MICRO_VERSION" AC_CONFIG_HEADERS([config.h]) diff --git a/veejay-current/gveejay-reloaded/callback.c b/veejay-current/gveejay-reloaded/callback.c index 0f3ba905..c068ac99 100644 --- a/veejay-current/gveejay-reloaded/callback.c +++ b/veejay-current/gveejay-reloaded/callback.c @@ -862,9 +862,6 @@ void on_stream_recordstart_clicked(GtkWidget *widget, gpointer user_data) GtkComboBox *combo = GTK_COMBO_BOX( GTK_WIDGET(glade_xml_get_widget(info->main_window,"combo_streamcodec"))); gchar *format = (gchar*)gtk_combo_box_get_active_text(combo) ; - if(nframes <= 0) - return; - if(format != NULL) { multi_vims( VIMS_RECORD_DATAFORMAT,"%s", @@ -907,9 +904,6 @@ void on_button_sample_recordstart_clicked(GtkWidget *widget, gpointer user_data) gchar *format = (gchar*) gtk_combo_box_get_active_text(combo); gint nframes = info->uc.sample_rec_duration; - if(nframes <= 0) - return; - gsize br=0; gsize bw=0; gchar *utftext = (gchar*) get_text( "entry_samplename"); gchar *text = (utftext != NULL ? g_locale_from_utf8( utftext, -1, &br, &bw,NULL) : NULL); @@ -956,7 +950,7 @@ void on_button_sample_recordstop_clicked(GtkWidget *widget, gpointer user_data) static int sample_calctime() { - gint n_frames = get_nums( "spin_sampleduration"); +/* gint n_frames = get_nums( "spin_sampleduration"); if( is_button_toggled( "sample_mulloop" ) ) { if(n_frames > 0) @@ -965,7 +959,11 @@ static int sample_calctime() if( info->status_tokens[SAMPLE_LOOP] == 2 ) n_frames *= 2; } - } + }*/ + + int n_frames = info->status_tokens[SAMPLE_END] - info->status_tokens[SAMPLE_START]; + if( info->status_tokens[SAMPLE_LOOP] == 2 ) + n_frames *= 2; return n_frames; } diff --git a/veejay-current/gveejay-reloaded/vj-api.c b/veejay-current/gveejay-reloaded/vj-api.c index 902e3ab2..afdfc80d 100644 --- a/veejay-current/gveejay-reloaded/vj-api.c +++ b/veejay-current/gveejay-reloaded/vj-api.c @@ -2985,6 +2985,8 @@ static void update_current_slot(int *history, int pm, int last_pm) update_spin_range( "spin_text_start", 0, n_frames ,0); update_spin_range( "spin_text_end", 0, n_frames,n_frames ); + info->uc.sample_rec_duration = n_frames; + info->uc.reload_hint[HINT_KF] = 1; } } @@ -5235,6 +5237,16 @@ static void load_editlist_info() update_label_i( "label_el_arate", (int)rate, 0); update_label_i( "label_el_achans", values[7], 0); update_label_i( "label_el_abits", values[5], 0); + + if( rate == 0 ) + { + enable_widget( "vjframerate" ); + } + else + { + disable_widget( "vjframerate"); + } + /* if( rate == 0 ) { @@ -5397,7 +5409,7 @@ static gboolean update_sample_record_timeout(gpointer data) gdouble cf = info->status_tokens[STREAM_RECORDED]; gdouble fraction = cf / tf; - + if(!info->status_tokens[STREAM_RECORDING] ) { gtk_progress_bar_set_fraction( GTK_PROGRESS_BAR(w), 0.0); diff --git a/veejay-current/libel/avilib.c b/veejay-current/libel/avilib.c index f643db95..dc410543 100644 --- a/veejay-current/libel/avilib.c +++ b/veejay-current/libel/avilib.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "avilib.h" #define INFO_LIST @@ -455,16 +456,18 @@ static int avi_add_odml_index_entry(avi_t *AVI, unsigned char *tag, long flags, if (AVI->video_superindex && (off_t)(AVI->pos+towrite) > (off_t)((off_t)NEW_RIFF_THRES*AVI->video_superindex->nEntriesInUse)) { - fprintf(stderr, "Adding a new RIFF chunk: %d\n", AVI->video_superindex->nEntriesInUse); +// fprintf(stderr, "Adding a new RIFF chunk: %d\n", AVI->video_superindex->nEntriesInUse); + veejay_msg( 2, "Adding a new RIFF chunk: %d", AVI->video_superindex->nEntriesInUse ); // rotate ALL indices AVI->video_superindex->nEntriesInUse++; cur_std_idx = AVI->video_superindex->nEntriesInUse-1; if (AVI->video_superindex->nEntriesInUse > NR_IXNN_CHUNKS) { - fprintf (stderr, "Internal error in avilib - redefine NR_IXNN_CHUNKS\n"); - fprintf (stderr, "[avilib dump] cur_std_idx=%d NR_IXNN_CHUNKS=%d" - "POS=%lld towrite=%lld\n", + veejay_msg(0, "Internal error in avilib - redefine NR_IXNN_CHUNKS (needed=%d, current=%d)", + AVI->video_superindex->nEntriesInUse, NR_IXNN_CHUNKS); + veejay_msg(0, "[avilib dump] cur_std_idx=%d NR_IXNN_CHUNKS=%d" + "POS=%lld towrite=%lld", cur_std_idx,NR_IXNN_CHUNKS, AVI->pos, towrite); return -1; } @@ -576,8 +579,6 @@ static int avi_add_index_entry(avi_t *AVI, unsigned char *tag, long flags, unsig /* Add index entry */ - // fprintf(stderr, "INDEX %s %ld %lu %lu\n", tag, flags, pos, len); - veejay_memcpy(AVI->idx[AVI->n_idx],tag,4); long2str(AVI->idx[AVI->n_idx]+ 4,flags); long2str(AVI->idx[AVI->n_idx]+ 8, pos); @@ -694,19 +695,19 @@ void AVI_set_video(avi_t *AVI, int width, int height, double fps, char *compress avi_update_header(AVI); } -void AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format) +int AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format) { /* may only be called if file is open for writing */ - if(AVI->mode==AVI_MODE_READ) return; + if(AVI->mode==AVI_MODE_READ) return -1; //inc audio tracks AVI->aptr=AVI->anum; ++AVI->anum; if(AVI->anum > AVI_MAX_TRACKS) { - fprintf(stderr, "error - only %d audio tracks supported\n", AVI_MAX_TRACKS); - exit(1); + veejay_msg(0, "error - only %d audio tracks supported\n", AVI_MAX_TRACKS); + return -1; } AVI->track[AVI->aptr].a_chans = channels; @@ -715,7 +716,7 @@ void AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format) AVI->track[AVI->aptr].a_fmt = format; // AVI->track[AVI->aptr].mp3rate = mp3rate; - avi_update_header(AVI); + return avi_update_header(AVI); } #define OUT4CC(s) \ @@ -962,8 +963,9 @@ int avi_update_header(avi_t *AVI) if(njunk<=0) { - fprintf(stderr,"AVI_close_output_file: # of header bytes too small\n"); - exit(1); + veejay_msg(0, "%s: # of header bytes too small",__FUNCTION__); + veejay_msg(0, "Somebody has played with HEADERBYTES of this AVI without knowing what (s)he did"); + return -1; } OUT4CC ("JUNK"); @@ -3358,7 +3360,8 @@ long AVI_read_audio(avi_t *AVI, char *audbuf, long bytes) lseek(AVI->fdes, pos, SEEK_SET); if ( (ret = avi_read(AVI->fdes,audbuf+nr,todo)) != todo) { - fprintf(stderr, "XXX pos = %lld, ret = %lld, todo = %ld\n", pos, ret, todo); +// fprintf(stderr, "XXX pos = %lld, ret = %lld, todo = %ld\n", pos, ret, todo); + veejay_msg(0, "No audio data at position %ld!"); AVI_errno = AVI_ERR_READ; return -1; } diff --git a/veejay-current/libel/avilib.h b/veejay-current/libel/avilib.h index 6cac81b6..0a562e48 100644 --- a/veejay-current/libel/avilib.h +++ b/veejay-current/libel/avilib.h @@ -324,7 +324,7 @@ typedef struct avi_t* AVI_open_output_file(char * filename); void AVI_set_video(avi_t *AVI, int width, int height, double fps, char *compressor); -void AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format); +int AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format); int AVI_write_frame(avi_t *AVI, char *data, long bytes); int AVI_dup_frame(avi_t *AVI); int AVI_write_audio(avi_t *AVI, char *data, long bytes); diff --git a/veejay-current/libel/lav_io.c b/veejay-current/libel/lav_io.c index cabb7e81..f3ddae75 100644 --- a/veejay-current/libel/lav_io.c +++ b/veejay-current/libel/lav_io.c @@ -327,6 +327,10 @@ lav_file_t *lav_open_output_file(char *filename, char format, lav_fd->bps = (asize*achans+7)/8; lav_fd->is_MJPG = 1; lav_fd->MJPG_chroma = _lav_io_default_chroma; + + char fourcc[16]; + + int is_avi = 1; switch(format) { @@ -334,96 +338,66 @@ lav_file_t *lav_open_output_file(char *filename, char format, case 'A': /* Open AVI output file */ veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI MJPEG"); - lav_fd->avi_fd = AVI_open_output_file(filename); + sprintf(fourcc, "MJPG" ); + break; + case 'L': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI LZO"); + sprintf(fourcc, "MLZO" ); + break; + case 'Y': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI IYUV"); + sprintf(fourcc, "IYUV" ); + break; + case 'P': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI YV16"); + sprintf(fourcc, "YV16"); + break; + case 'D': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI DIV3"); + sprintf(fourcc, "DIV3"); + break; + case 'M': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI MP4V"); + sprintf(fourcc,"MP4V"); + break; + case 'b': + case 'd': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI DVSD"); + sprintf(fourcc, "DVSD"); + break; + + case 'q': + case 'Q': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in Quicktime MJPA/JPEG"); + is_avi = 0; + break; + } + + if( is_avi ) + { + lav_fd->avi_fd = AVI_open_output_file(filename); if(!lav_fd->avi_fd) { free(lav_fd); return NULL; } - AVI_set_video(lav_fd->avi_fd, width, height, fps, "MJPG"); + AVI_set_video(lav_fd->avi_fd, width, height, fps, fourcc ); if (asize) - AVI_set_audio(lav_fd->avi_fd, achans, arate, asize, WAVE_FORMAT_PCM); + { + if(AVI_set_audio(lav_fd->avi_fd, achans, arate, asize, WAVE_FORMAT_PCM)==-1) + { + veejay_msg(0, "Too many channels or invalid AVI file"); + lav_close( lav_fd ); + return NULL; + } + } return lav_fd; - case 'L': - veejay_msg(VEEJAY_MSG_DEBUG,"\tWriting output file in AVI LZO"); - lav_fd->avi_fd=AVI_open_output_file(filename); - if(!lav_fd->avi_fd) - { - free(lav_fd); - return NULL; - } - AVI_set_video(lav_fd->avi_fd, width,height,fps, "mlzo"); - if(asize) - AVI_set_audio(lav_fd->avi_fd, achans,arate,asize,WAVE_FORMAT_PCM); - return lav_fd; - case 'Y': - veejay_msg(VEEJAY_MSG_DEBUG,"\tWriting output file in AVI IYUV"); - lav_fd->avi_fd = AVI_open_output_file(filename); - if(!lav_fd->avi_fd) - { - free(lav_fd); - return NULL; - } - AVI_set_video(lav_fd->avi_fd, width,height,fps, "iyuv"); - if(asize) - AVI_set_audio(lav_fd->avi_fd, achans,arate,asize,WAVE_FORMAT_PCM); - return lav_fd; - case 'P': - veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI yv16"); - lav_fd->avi_fd = AVI_open_output_file(filename); - if(!lav_fd->avi_fd) - { - free(lav_fd); - return NULL; - } - AVI_set_video(lav_fd->avi_fd, width,height,fps, "yv16"); - if(asize) - AVI_set_audio(lav_fd->avi_fd, achans,arate,asize,WAVE_FORMAT_PCM); - return lav_fd; - case 'D': - veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI div3"); - lav_fd->avi_fd = AVI_open_output_file(filename); - if(!lav_fd->avi_fd) - { - free(lav_fd); - return NULL; - } - AVI_set_video(lav_fd->avi_fd,width,height,fps, "div3"); - if(asize) - AVI_set_audio(lav_fd->avi_fd,achans,arate,asize,WAVE_FORMAT_PCM); - return lav_fd; - case 'M': - veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI mp4v"); - lav_fd->avi_fd = AVI_open_output_file(filename); - if(!lav_fd->avi_fd) - { - free(lav_fd); - return NULL; - } - AVI_set_video(lav_fd->avi_fd,width,height,fps, "mp4v"); - if(asize) - AVI_set_audio(lav_fd->avi_fd,achans,arate,asize,WAVE_FORMAT_PCM); - return lav_fd; - case 'b': - case 'd': - veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI dvsd"); - lav_fd->avi_fd = AVI_open_output_file(filename); - if(!lav_fd->avi_fd) - { - free(lav_fd); - return NULL; - } - AVI_set_video(lav_fd->avi_fd,width,height,fps, "dvsd"); - if(asize) AVI_set_audio(lav_fd->avi_fd,achans,arate,asize,WAVE_FORMAT_PCM); - return lav_fd; - case 'q': - case 'Q': + } else { #ifdef HAVE_LIBQUICKTIME /* open quicktime output file */ /* since the documentation says that the file should be empty, we try to remove it first */ - veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in Quicktime MJPA/JPEG"); remove(filename); lav_fd->qt_fd = quicktime_open(filename, 0, 1); @@ -434,10 +408,10 @@ lav_file_t *lav_open_output_file(char *filename, char format, return NULL; } if(format=='q') - quicktime_set_video(lav_fd->qt_fd, 1, width, height, fps, + quicktime_set_video(lav_fd->qt_fd, 1, width, height, fps, (interlaced ? QUICKTIME_MJPA : QUICKTIME_JPEG)); else - quicktime_set_video(lav_fd->qt_fd,1, width,height,fps, + quicktime_set_video(lav_fd->qt_fd,1, width,height,fps, QUICKTIME_DV ); if (asize) quicktime_set_audio(lav_fd->qt_fd, achans, arate, asize, QUICKTIME_TWOS); @@ -450,10 +424,9 @@ lav_file_t *lav_open_output_file(char *filename, char format, veejay_msg(VEEJAY_MSG_DEBUG, "(C) %s by %s, %s, has keyframes = %d", copyright,name,info,has_kf ); - return lav_fd; #else - veejay_msg(0,"Quicktime not included in build process. Abort"); + veejay_msg(0,"Quicktime not compiled in, cannot use Quicktime."); internal_error = ERROR_FORMAT; return NULL; #endif @@ -1125,23 +1098,22 @@ int lav_set_audio_position(lav_file_t *lav_file, long clip) return (AVI_set_audio_position(lav_file->avi_fd,clip*lav_file->bps)); } -long lav_read_audio(lav_file_t *lav_file, uint8_t *audbuf, long samps) +int lav_read_audio(lav_file_t *lav_file, uint8_t *audbuf, long samps) { - - if(!lav_file->has_audio) - { - internal_error = ERROR_NOAUDIO; - return -1; - } + if(!lav_file->has_audio) + { + internal_error = ERROR_NOAUDIO; + return -1; + } #ifdef SUPPORT_READ_DV2 if(video_format == 'b') return rawdv_read_audio_frame( lav_file->dv_fd, audbuf ); #endif #ifdef USE_GDK_PIXBUF - if(video_format == 'x') - return 0; + if(video_format == 'x') + return 0; #endif - video_format = lav_file->format; internal_error = 0; /* for error messages */ + video_format = lav_file->format; internal_error = 0; /* for error messages */ #ifdef HAVE_LIBQUICKTIME if( video_format == 'q') { @@ -1167,29 +1139,30 @@ long lav_read_audio(lav_file_t *lav_file, uint8_t *audbuf, long samps) qt_audio[(channels*i) + j] = qt_audion[j][i]; } - if (lav_detect_endian()) - { - i= 0; - while (i < (2*res) ) - { - b0 = 0; - b1 = 0; - b0 = (qt_audio[i] & 0x00FF); - b1 = (qt_audio[i] & 0xFF00) >> 8; - qt_audio[i] = (b0 <<8) + b1; - i = i +1; - } - } + if (lav_detect_endian()) + { + i= 0; + while (i < (2*res) ) + { + b0 = 0; + b1 = 0; + b0 = (qt_audio[i] & 0x00FF); + b1 = (qt_audio[i] & 0xFF00) >> 8; + qt_audio[i] = (b0 <<8) + b1; + i = i +1; + } + } out: - for (j = 0; j < channels; j++) - free(qt_audion[j]); - free(qt_audion); - return(res); - - + for (j = 0; j < channels; j++) + free(qt_audion[j]); + free(qt_audion); + return(res); } #endif - return (AVI_read_audio(lav_file->avi_fd,audbuf,samps*lav_file->bps)/lav_file->bps); + + int res = AVI_read_audio( lav_file->avi_fd, audbuf, + (samps * lav_file->bps) ); + return res; } int lav_filetype(lav_file_t *lav_file) diff --git a/veejay-current/libel/lav_io.h b/veejay-current/libel/lav_io.h index f2b846f0..61bb1d9d 100644 --- a/veejay-current/libel/lav_io.h +++ b/veejay-current/libel/lav_io.h @@ -102,7 +102,7 @@ int lav_seek_start(lav_file_t *lav_file); int lav_set_video_position(lav_file_t *lav_file, long frame); int lav_read_frame(lav_file_t *lav_file, uint8_t *vidbuf); int lav_set_audio_position(lav_file_t *lav_file, long clip); -long lav_read_audio(lav_file_t *lav_file, uint8_t *audbuf, long samps); +int lav_read_audio(lav_file_t *lav_file, uint8_t *audbuf, long samps); int lav_filetype(lav_file_t *lav_file); lav_file_t *lav_open_input_file(char *filename, int mmap_size); int lav_get_field_size(uint8_t * jpegdata, long jpeglen); diff --git a/veejay-current/libel/vj-avcodec.c b/veejay-current/libel/vj-avcodec.c index a8e32cfe..80e1a284 100644 --- a/veejay-current/libel/vj-avcodec.c +++ b/veejay-current/libel/vj-avcodec.c @@ -211,10 +211,9 @@ void vj_avcodec_close_encoder( vj_encoder *av ) free(av->data[1]); if(av->data[2]) free(av->data[2]); - free(av); - if(av->lzo) lzo_free(av->lzo); + free(av); } av = NULL; } diff --git a/veejay-current/libel/vj-el.c b/veejay-current/libel/vj-el.c index 06f5916b..eace203f 100644 --- a/veejay-current/libel/vj-el.c +++ b/veejay-current/libel/vj-el.c @@ -726,7 +726,7 @@ int open_video_file(char *filename, editlist * el, int preserve_pathname, int de el->has_audio = (el->audio_chans == 0 ? 0: 1); el->audio_bits = lav_audio_bits(el->lav_fd[n]); - el->play_rate = el->audio_rate = lav_audio_rate(el->lav_fd[n]); + el->audio_rate = lav_audio_rate(el->lav_fd[n]); el->audio_bps = (el->audio_bits * el->audio_chans + 7) / 8; } else @@ -964,8 +964,8 @@ int vj_el_get_video_frame(editlist *el, long nframe, uint8_t *dst[3]) if (nframe < 0) nframe = 0; - if (nframe > el->video_frames) - nframe = el->video_frames; + if (nframe >= el->video_frames) + nframe = el->video_frames-1; n = el->frame_list[nframe]; @@ -1314,14 +1314,14 @@ int vj_el_get_audio_frame(editlist *el, uint32_t nframe, uint8_t *dst) return 1; } - if (!el->has_audio) - return 0; + if (!el->has_audio) + return 0; - if (nframe < 0) + if (nframe < 0) nframe = 0; - if (nframe > el->video_frames) - nframe = el->video_frames; + if (nframe >= el->video_frames) + nframe = el->video_frames-1; n = el->frame_list[nframe]; @@ -1413,8 +1413,8 @@ int vj_el_get_audio_frame_at(editlist *el, uint32_t nframe, uint8_t *dst, int nu if (nframe < 0) nframe = 0; - if (nframe > el->video_frames) - nframe = el->video_frames - num; + if (nframe >= el->video_frames) + nframe = el->video_frames - 1; n = el->frame_list[nframe]; @@ -1451,7 +1451,6 @@ editlist *vj_el_dummy(int flags, int deinterlace, int chroma, char norm, int wid el->audio_bits = 0; el->audio_bps = 0; el->audio_chans = 0; - el->play_rate = 0; el->num_video_files = 0; el->video_width = width; el->video_height = height; @@ -2061,7 +2060,6 @@ editlist *vj_el_soft_clone(editlist *el) clone->audio_chans = el->audio_chans; clone->audio_bits = el->audio_bits; clone->audio_bps = el->audio_bps; - clone->play_rate = el->play_rate; clone->video_frames = el->video_frames; clone->num_video_files = el->num_video_files; clone->max_frame_size = el->max_frame_size; diff --git a/veejay-current/libel/vj-el.h b/veejay-current/libel/vj-el.h index 156d5463..67f16fda 100644 --- a/veejay-current/libel/vj-el.h +++ b/veejay-current/libel/vj-el.h @@ -51,7 +51,6 @@ typedef struct int audio_chans; int audio_bits; int audio_bps; - int play_rate; long video_frames; diff --git a/veejay-current/libsample/sampleadm.c b/veejay-current/libsample/sampleadm.c index 0fb830fe..47949b54 100644 --- a/veejay-current/libsample/sampleadm.c +++ b/veejay-current/libsample/sampleadm.c @@ -481,6 +481,8 @@ int sample_get_longest(int sample_id) int speed = abs(si->speed); int duration = len / speed; //how many frames are played of this sample +veejay_msg(0, "sample %d: %d - %d", sample_id, si->first_frame,si->last_frame ); + if( si->looptype == 2) duration *= 2; // pingpong loop duration for(c=0; c < SAMPLE_MAX_EFFECTS; c++) @@ -503,6 +505,9 @@ int sample_get_longest(int sample_id) veejay_msg(VEEJAY_MSG_WARNING, "Length of sample in video frames: %ld",duration); return duration; } +#ifdef STRICT_CHECKING + assert(0); +#endif return 0; } @@ -2045,8 +2050,12 @@ int sample_chain_sprint_status( int s1,int cache,int sa,int ca, int pfps, int fr sample_info *sample; sample = sample_get(s1); if (!sample) + { +#ifdef STRICT_CHECKING + veejay_msg(0, "Fatal : sample %d is invalid, cannot produce a valid status line", s1 ); +#endif return -1; - + } sprintf(str, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", pfps, diff --git a/veejay-current/libsamplerec/samplerecord.c b/veejay-current/libsamplerec/samplerecord.c index 1d529382..b8964898 100644 --- a/veejay-current/libsamplerec/samplerecord.c +++ b/veejay-current/libsamplerec/samplerecord.c @@ -202,7 +202,7 @@ static int sample_start_encoder(sample_info *si, editlist *el, int format, long si->encoder_file = (void*)lav_open_output_file(si->encoder_destination,cformat, el->video_width,el->video_height,el->video_inter, - el->video_fps,0,0,0); + el->video_fps,el->audio_bits, el->audio_chans, el->audio_rate ); if(!si->encoder_file) { @@ -337,15 +337,14 @@ int sample_record_frame(int s1, uint8_t *buffer[3], uint8_t *abuff, int audio_si si->rec_total_bytes += buf_len; -/* if(audio_size > 0) + if(audio_size > 0) { if(lav_write_audio( (lav_file_t*) si->encoder_file, (uint8_t*)abuff, audio_size)) { veejay_msg(VEEJAY_MSG_ERROR, "Error writing output audio [%s] (%d)",lav_strerror(),audio_size); } - // estimate samples , dont care - si->rec_total_bytes += ( audio_size * 4 ); - }*/ + si->rec_total_bytes += audio_size; + } /* write OK */ si->encoder_succes_frames ++; si->encoder_num_frames ++; diff --git a/veejay-current/share/gveejay.reloaded.glade b/veejay-current/share/gveejay.reloaded.glade index 2b7c0021..95542d9e 100644 --- a/veejay-current/share/gveejay.reloaded.glade +++ b/veejay-current/share/gveejay.reloaded.glade @@ -1146,7 +1146,8 @@ - Duplication factor + True + Slow motion multiplier False False GTK_JUSTIFY_LEFT @@ -1170,6 +1171,7 @@ + True True 1 0 @@ -1177,7 +1179,7 @@ GTK_UPDATE_ALWAYS False False - 1 0 100 1 10 10 + 1 1 12 1 10 10 @@ -10839,7 +10841,7 @@ MLZO - + True 0 0.5 diff --git a/veejay-current/veejay/liblavplayvj.c b/veejay-current/veejay/liblavplayvj.c index 9ec67423..42f7195b 100644 --- a/veejay-current/veejay/liblavplayvj.c +++ b/veejay-current/veejay/liblavplayvj.c @@ -93,7 +93,9 @@ #include #include - +#ifdef STRICT_CHECKING +#include +#endif #ifdef USE_GL #include #endif @@ -275,6 +277,7 @@ void veejay_change_state_save(veejay_t * info, int new_state) int veejay_set_framedup(veejay_t *info, int n) { video_playback_setup *settings = (video_playback_setup*) settings; + switch(info->uc->playback_mode) { case VJ_PLAYBACK_MODE_PLAIN: info->sfd = n; break; case VJ_PLAYBACK_MODE_SAMPLE: info->sfd = n; sample_set_framedup(info->uc->sample_id,n);break; @@ -540,7 +543,7 @@ void veejay_set_framerate( veejay_t *info , float fps ) settings->spvf = 1.0 / fps; settings->msec_per_frame = 1000 / settings->spvf; if (info->current_edit_list->has_audio && (info->audio==AUDIO_PLAY || info->audio==AUDIO_RENDER)) - settings->spas = 1.0 / (double) info->current_edit_list->play_rate; + settings->spas = 1.0 / (double) info->current_edit_list->audio_rate; else settings->spas = 0; @@ -583,7 +586,7 @@ int veejay_init_editlist(veejay_t * info) if (el->has_audio && (info->audio==AUDIO_PLAY || info->audio==AUDIO_RENDER)) { - settings->spas = 1.0 / (double) el->play_rate; + settings->spas = 1.0 / (double) el->audio_rate; } else { @@ -1151,7 +1154,12 @@ void veejay_pipe_write_status(veejay_t * info, int link_id) if( sample_chain_sprint_status (info->uc->sample_id,cache_used,info->seq->active,info->seq->current,info->real_fps,settings->current_frame_num, pm, total_slots,info->status_what ) != 0) { - veejay_msg(VEEJAY_MSG_ERROR, "Invalid status!"); + veejay_msg(VEEJAY_MSG_ERROR, "Fatal error, tried to collect properties of invalid sample"); +#ifdef STRICT_CHECKING + assert(0); +#else + veejay_change_state( info, LAVPLAY_STATE_STOP ); +#endif } break; case VJ_PLAYBACK_MODE_PLAIN: @@ -1903,12 +1911,16 @@ int veejay_init(veejay_t * info, int x, int y,char *arg, int def_tags, int full_ //plugins_allocate(); - if(info->current_edit_list->has_audio) { - if (vj_perform_init_audio(info) == 0) + if(info->current_edit_list->has_audio) + { + if (vj_perform_init_audio(info)) veejay_msg(VEEJAY_MSG_INFO, "Initialized Audio Task"); else + { veejay_msg(VEEJAY_MSG_ERROR, "Unable to initialize Audio Task"); + info->audio = NO_AUDIO; + } } veejay_msg(VEEJAY_MSG_INFO, @@ -2188,7 +2200,6 @@ static void veejay_playback_cycle(veejay_t * info) double tdiff1, tdiff2; int n; int first_free, frame, skipv, skipa, skipi, nvcorr; - long frame_number[2]; /* Must be at least as big as the number of buffers used */ struct mjpeg_params bp; long ts, te; vj_perform_queue_audio_frame(info,0); @@ -2243,21 +2254,16 @@ static void veejay_playback_cycle(veejay_t * info) - frame_number[0] = settings->current_frame_num; veejay_mjpeg_queue_buf(info, 0, 1); stats.nqueue = 1; - // settings->br.count; + while (settings->state != LAVPLAY_STATE_STOP) { - /* Sync to get a free buffer. We want to have all free buffers, - * which have been played so far. Normally there should be a function - * in the kernel API to get the number of all free buffers. - * I don't want to change this API at the moment, therefore - * we look on the clock to see if there are more buffers ready - */ first_free = stats.nsync; + int current_speed = settings->current_playback_speed; + do { if (settings->state == LAVPLAY_STATE_STOP) { goto FINISH; @@ -2268,26 +2274,17 @@ static void veejay_playback_cycle(veejay_t * info) } frame = bs.frame; - /* Since we queue the frames in order, we have to get them back in order */ - if (frame != stats.nsync % 1) { - veejay_msg(VEEJAY_MSG_ERROR, - "**INTERNAL ERROR: Bad frame order on sync: frame = %d, nsync = %d, br.count = %ld sould be %ld", - frame, stats.nsync, 1, (stats.nsync % 1)); - veejay_change_state_save(info, LAVPLAY_STATE_STOP); - goto FINISH; - } - + stats.nsync++; - /* Lock on clock */ gettimeofday(&time_now, 0); stats.tdiff = time_now.tv_sec - bs.timestamp.tv_sec + (time_now.tv_usec - bs.timestamp.tv_usec)*1.e-6; - } while (stats.tdiff > settings->spvf && (stats.nsync - first_free) < (1 - 1)); + } + while (stats.tdiff > settings->spvf && (stats.nsync - first_free) < (1 - 1)); #ifdef HAVE_JACK - if ( el->has_audio && info->audio==AUDIO_PLAY ) { - //audio_get_output_status(&audio_tmstmp, &(stats.num_asamps), - // &(stats.num_aerr)); + if ( el->has_audio && info->audio==AUDIO_PLAY ) + { struct timeval audio_tmstmp; long int sec=0; long int usec=0; @@ -2295,13 +2292,10 @@ static void veejay_playback_cycle(veejay_t * info) audio_tmstmp.tv_sec = sec; audio_tmstmp.tv_usec = usec; if (audio_tmstmp.tv_sec) - { - tdiff1 = settings->spvf * (stats.nsync - nvcorr) - - settings->spas * num_audio_bytes_written; - tdiff2 = (bs.timestamp.tv_sec - audio_tmstmp.tv_sec) + - (bs.timestamp.tv_usec - audio_tmstmp.tv_usec) * 1.e-6; - } - + { + tdiff1 = settings->spvf * (stats.nsync - nvcorr) - settings->spas * num_audio_bytes_written; + tdiff2 = (bs.timestamp.tv_sec - audio_tmstmp.tv_sec) + (bs.timestamp.tv_usec - audio_tmstmp.tv_usec) * 1.e-6; + } } #endif stats.tdiff = tdiff1 - tdiff2; @@ -2316,7 +2310,7 @@ static void veejay_playback_cycle(veejay_t * info) if (stats.tdiff > settings->spvf) { /* Video is ahead audio */ skipa = 1; - if (info->sync_ins_frames) + if (info->sync_ins_frames && current_speed != 0) skipi = 1; nvcorr++; stats.num_corrs_a++; @@ -2326,73 +2320,40 @@ static void veejay_playback_cycle(veejay_t * info) if (stats.tdiff < -settings->spvf) { /* Video is behind audio */ skipv = 1; - if (!info->sync_skip_frames) + if (!info->sync_skip_frames && current_speed != 0) skipi = 1; - //veejay_msg(VEEJAY_MSG_INFO, "video behind audio, skip video frame = %s tdiff = %4.2f , spvf = %4.2f", - // (skipi==0?"NO":"YES"), stats.tdiff, settings->spvf); - nvcorr--; + nvcorr--; stats.num_corrs_b++; stats.tdiff += settings->spvf; stats.stats_changed = 1; } } - /* Read one frame, break if EOF is reached */ #ifdef HAVE_SDL ts= SDL_GetTicks(); #endif - // actually measure duration of render in ms */ frame = n % 1; - frame_number[frame] = settings->current_frame_num; - settings->buffer_entry[frame] = settings->current_frame_num; -// el->frame_list[settings->current_frame_num]; + // settings->buffer_entry[frame] = 1; //settings->current_frame_num; + settings->buffer_entry[frame] ++; + if (!skipa) - vj_perform_queue_audio_frame(info,frame); + vj_perform_queue_audio_frame(info,frame); if (!skipv) vj_perform_queue_video_frame(info,frame,skipi); - vj_perform_queue_frame(info,skipi,frame); +// vj_perform_queue_frame(info,skipi,frame); + + vj_perform_queue_frame( info, frame, skipi ); + #ifdef HAVE_SDL te = SDL_GetTicks(); -#endif -// if(info->real_fps == -1) -// { -/* float elapsed = (float)(te-ts)/1000.0; - float spvf = info->settings->spvf; - int level = VEEJAY_MSG_INFO; - if(elapsed > (spvf*0.8) && elapsed < spvf) - { - level = VEEJAY_MSG_WARNING; - } - else - { - if( elapsed > spvf) - level = VEEJAY_MSG_ERROR; - } - veejay_msg( level, - "Seconds per video frame: %2.2f, seconds elapsed: %2.4f ", - (float)info->settings->spvf, - elapsed ); - */ - // } -#ifdef HAVE_SDL info->real_fps = (int)( te - ts ); #else info->real_fps = 0; #endif - // int sta_poll = vj_server_poll(info->vjs[1]); - // if(sta_poll>0) vj_server_new_connection( info->vjs[1]); - // int i; - // for( i = 0; i < info->vjs[1]->nr_of_links; i ++ ) - // veejay_pipe_write_status( info, i ); -// int i; -// for( i = 0; i < VJ_MAX_CONNECTIONS; i ++ ) -// if( vj_server_link_used( info->vjs[1], i )) -// { veejay_msg(VEEJAY_MSG_DEBUG, "sent sta"); veejay_pipe_write_status( info, i );} - if(skipv ) continue; if (!veejay_mjpeg_queue_buf(info, frame, 1)) { veejay_msg(VEEJAY_MSG_ERROR ,"Error queuing a frame"); @@ -3377,7 +3338,7 @@ static int veejay_open_video_files(veejay_t *info, char **files, int num_files, { editlist *el = info->current_edit_list; el->has_audio = 1; - el->play_rate = el->audio_rate = info->dummy->arate; + el->audio_rate = info->dummy->arate; el->audio_chans = 2; el->audio_bits = 16; el->audio_bps = 4; diff --git a/veejay-current/veejay/vims.h b/veejay-current/veejay/vims.h index 44e7b6fb..f3ef08f5 100644 --- a/veejay-current/veejay/vims.h +++ b/veejay-current/veejay/vims.h @@ -90,7 +90,7 @@ enum { VIMS_VIDEO_SET_SLOW = 21, VIMS_VIDEO_MCAST_START = 22, VIMS_VIDEO_MCAST_STOP = 23, - + VIMS_VIDEO_SET_SPEEDK = 24, /* editlist commands */ VIMS_EDITLIST_PASTE_AT = 50, diff --git a/veejay-current/veejay/vj-bjack.h b/veejay-current/veejay/vj-bjack.h index e87cd420..317c6ceb 100644 --- a/veejay-current/veejay/vj-bjack.h +++ b/veejay-current/veejay/vj-bjack.h @@ -26,6 +26,7 @@ int vj_jack_reset(); int vj_jack_play(void *data, int len); int vj_jack_pause(); int vj_jack_resume(); +int vj_jack_rate(); int vj_jack_get_space(); long vj_jack_get_status(long int *sec, long int *usec); int vj_jack_set_volume(int v); diff --git a/veejay-current/veejay/vj-event.c b/veejay-current/veejay/vj-event.c index 8af51386..25a3c306 100644 --- a/veejay-current/veejay/vj-event.c +++ b/veejay-current/veejay/vj-event.c @@ -168,15 +168,15 @@ static struct { /* hardcoded keyboard layout (the default keys) */ { VIMS_VIDEO_PREV_SECOND, SDLK_KP2, VIMS_MOD_NONE, NULL }, { VIMS_VIDEO_GOTO_START, SDLK_KP1, VIMS_MOD_NONE, NULL }, { VIMS_VIDEO_GOTO_END, SDLK_KP3, VIMS_MOD_NONE, NULL }, - { VIMS_VIDEO_SET_SPEED, SDLK_a, VIMS_MOD_NONE, "1" }, - { VIMS_VIDEO_SET_SPEED, SDLK_s, VIMS_MOD_NONE, "2" }, - { VIMS_VIDEO_SET_SPEED, SDLK_d, VIMS_MOD_NONE, "3" }, - { VIMS_VIDEO_SET_SPEED, SDLK_f, VIMS_MOD_NONE, "4" }, - { VIMS_VIDEO_SET_SPEED, SDLK_g, VIMS_MOD_NONE, "5" }, - { VIMS_VIDEO_SET_SPEED, SDLK_h, VIMS_MOD_NONE, "6" }, - { VIMS_VIDEO_SET_SPEED, SDLK_j, VIMS_MOD_NONE, "7" }, - { VIMS_VIDEO_SET_SPEED, SDLK_k, VIMS_MOD_NONE, "8" }, - { VIMS_VIDEO_SET_SPEED, SDLK_l, VIMS_MOD_NONE, "9" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_a, VIMS_MOD_NONE, "1" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_s, VIMS_MOD_NONE, "2" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_d, VIMS_MOD_NONE, "3" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_f, VIMS_MOD_NONE, "4" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_g, VIMS_MOD_NONE, "5" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_h, VIMS_MOD_NONE, "6" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_j, VIMS_MOD_NONE, "7" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_k, VIMS_MOD_NONE, "8" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_l, VIMS_MOD_NONE, "9" }, { VIMS_VIDEO_SET_SLOW, SDLK_a, VIMS_MOD_ALT, "1" }, { VIMS_VIDEO_SET_SLOW, SDLK_s, VIMS_MOD_ALT, "2" }, { VIMS_VIDEO_SET_SLOW, SDLK_d, VIMS_MOD_ALT, "3" }, @@ -1229,7 +1229,7 @@ void vj_event_update_remote(void *ptr) // for( i = 0; i < VJ_MAX_CONNECTIONS; i ++ ) // if( vj_server_link_used( v->vjs[1], i )) // veejay_pipe_write_status( v, i ); -// + if( v->settings->use_vims_mcast ) { int res = vj_server_update(v->vjs[2],0 ); @@ -1282,6 +1282,7 @@ void vj_event_update_remote(void *ptr) } } } + for( i = 0; i < VJ_MAX_CONNECTIONS; i ++ ) if( vj_server_link_used( v->vjs[1], i )) veejay_pipe_write_status( v, i ); @@ -3057,6 +3058,32 @@ void vj_event_play_speed(void *ptr, const char format[], va_list ap) } } +void vj_event_play_speed_kb(void *ptr, const char format[], va_list ap) +{ + int args[2]; + veejay_t *v = (veejay_t*) ptr; + if(!STREAM_PLAYING(v)) + { + char *s = NULL; + P_A(args,s,format,ap); + + int speed = abs(args[0]); + if( v->settings->current_playback_speed < 0 ) + veejay_set_speed( v, -1 * speed ); + else + veejay_set_speed(v, speed ); + speed = v->settings->current_playback_speed; + veejay_msg(VEEJAY_MSG_INFO, "Video is playing at speed %d now (%s)", + speed, speed == 0 ? "paused" : speed < 0 ? "reverse" : "forward" ); + } + else + { + p_invalid_mode(); + } +} + + + void vj_event_play_slow(void *ptr, const char format[],va_list ap) { int args[1]; @@ -3706,7 +3733,6 @@ void vj_event_sample_rec_start( void *ptr, const char format[], va_list ap) { veejay_t *v = (veejay_t *)ptr; int args[2]; - int changed = 0; int result = 0; char *str = NULL; char prefix[150]; @@ -3742,7 +3768,6 @@ void vj_event_sample_rec_start( void *ptr, const char format[], va_list ap) if (n < 0 ) n = n * -1; } args[0] = sample_get_longest(v->uc->sample_id); - changed = 1; } int format_ = _recorder_format; @@ -3762,16 +3787,15 @@ void vj_event_sample_rec_start( void *ptr, const char format[], va_list ap) { video_playback_setup *s = v->settings; s->sample_record_id = v->uc->sample_id; - if(args[1]) - s->sample_record_switch = 1; + s->sample_record_switch = args[1]; result = 1; if(v->use_osd) { veejay_msg(VEEJAY_MSG_INFO,"Turned off OSD, recording now"); v->use_osd = 0; } - veejay_msg(VEEJAY_MSG_INFO, "Sample recording started , record %d frames and %s", - args[0], (args[1] == 1 ? "play new sample" : "dont play new sample" )); + veejay_msg(VEEJAY_MSG_INFO, "Sample recording started , record %d frames from sample %d and %s", + args[0],s->sample_record_id, (args[1] == 1 ? "play new sample" : "dont play new sample" )); } else { diff --git a/veejay-current/veejay/vj-event.h b/veejay-current/veejay/vj-event.h index 68a5c02e..214f0d5b 100644 --- a/veejay-current/veejay/vj-event.h +++ b/veejay-current/veejay/vj-event.h @@ -102,6 +102,7 @@ void vj_event_output_raw_stop ( void *ptr, const char format[], va_list ap ); void vj_event_play_forward ( void *ptr, const char format[], va_list ap ); void vj_event_play_reverse ( void *ptr, const char format[], va_list ap ); void vj_event_play_speed ( void *ptr, const char format[], va_list ap ); +void vj_event_play_speed_kb ( void *ptr, const char format[], va_list ap ); void vj_event_play_slow ( void *ptr, const char format[], va_list ap ); void vj_event_play_stop ( void *ptr, const char format[], va_list ap ); void vj_event_prev_second ( void *ptr, const char format[], va_list ap ); diff --git a/veejay-current/veejay/vj-eventman.c b/veejay-current/veejay/vj-eventman.c index 51508007..37fa213d 100644 --- a/veejay-current/veejay/vj-eventman.c +++ b/veejay-current/veejay/vj-eventman.c @@ -453,7 +453,18 @@ void vj_init_vevo_events(void) 0, VIMS_ALLOW_ANY, NULL ); - + + index_map_[VIMS_VIDEO_SET_SPEEDK] = _new_event( + "%d", + VIMS_VIDEO_SET_SPEED, + "Change trickplay speed depending on play direction", + vj_event_play_speed_kb, + 1, + VIMS_ALLOW_ANY, + "Frame step", + 1, + NULL ); + index_map_[VIMS_VIDEO_SET_SPEED] = _new_event( "%d", VIMS_VIDEO_SET_SPEED, diff --git a/veejay-current/veejay/vj-misc.h b/veejay-current/veejay/vj-misc.h index 0952b296..b5f72b21 100644 --- a/veejay-current/veejay/vj-misc.h +++ b/veejay-current/veejay/vj-misc.h @@ -21,8 +21,8 @@ #include #include "vj-lib.h" -#define VEEJAY_FILE_LIMIT (1048576 * 1900) - +//#define VEEJAY_FILE_LIMIT (1048576 * 1900) +#define VEEJAY_FILE_LIMIT (1048576 * 32000) int available_diskspace(void); int vj_perform_screenshot2(veejay_t * info, uint8_t ** src); diff --git a/veejay-current/veejay/vj-perform.c b/veejay-current/veejay/vj-perform.c index 77adb370..00eb140a 100644 --- a/veejay-current/veejay/vj-perform.c +++ b/veejay-current/veejay/vj-perform.c @@ -58,6 +58,10 @@ #include #include #include +#ifdef STRICT_CHECKING +#include +#endif + #define PERFORM_AUDIO_SIZE 16384 static int simple_frame_duplicator; @@ -97,21 +101,21 @@ static int cached_sample_frames[CACHE_SIZE]; static int frame_info[64][SAMPLE_MAX_EFFECTS]; /* array holding frame lengths */ static uint8_t *audio_buffer[SAMPLE_MAX_EFFECTS]; /* the audio buffer */ static uint8_t *top_audio_buffer; -static uint8_t *tmp_audio_buffer; -static uint8_t *x_audio_buffer; +static uint8_t *resample_audio_buffer; +static uint8_t *audio_render_buffer; +static uint8_t *down_sample_buffer; static uint8_t *temp_buffer[3]; static uint8_t *socket_buffer; static ycbcr_frame *record_buffer; // needed for recording invisible streams -static short *priv_audio[2]; static VJFrame *helper_frame; -//#ifdef HAVE_FREETYPE -//static VJFrame *font_frame; -//#endif static int vj_perform_record_buffer_init(); static void vj_perform_record_buffer_free(); - -static ReSampleContext *resample_context[MAX_SPEED]; -static ReSampleContext *resample_jack; +#ifdef HAVE_JACK +static int jack_rate_ = 0; +static ReSampleContext *resample_context[(MAX_SPEED+1)]; +static ReSampleContext *downsample_context[(MAX_SPEED+1)]; +static ReSampleContext *resample_jack = NULL; +#endif #define MLIMIT(var, low, high) \ if((var) < (low)) { var = (low); } \ @@ -119,7 +123,7 @@ if((var) > (high)) { var = (high); } //forward -static inline void vj_perform_pre_chain(veejay_t *info, VJFrame *frame); +static void vj_perform_pre_chain(veejay_t *info, VJFrame *frame); static void vj_perform_post_chain_sample(veejay_t *info, VJFrame *frame); static void vj_perform_post_chain_tag(veejay_t *info, VJFrame *frame); static void seq_play_sample( veejay_t *info, int n); @@ -234,7 +238,10 @@ static int vj_perform_increase_plain_frame(veejay_t * info, long num) { video_playback_setup *settings = info->settings; //settings->current_frame_num += num; - simple_frame_duplicator+=2; + //simple_frame_duplicator+=2; + + simple_frame_duplicator++; + if (simple_frame_duplicator >= info->sfd) { settings->current_frame_num += num; simple_frame_duplicator = 0; @@ -355,10 +362,13 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num) settings->current_playback_speed = speed; simple_frame_duplicator++; - if (simple_frame_duplicator >= info->sfd) { + + if (simple_frame_duplicator >= info->sfd) + { settings->current_frame_num += num; - simple_frame_duplicator = 0; - } + simple_frame_duplicator = 0; + } + if (speed >= 0) { /* forward play */ if(looptype==3) @@ -380,10 +390,6 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num) } break; case 1: - // if(sample_get_loop_dec(info->uc->sample_id)) { - // sample_apply_loop_dec( info->uc->sample_id, info->edit_list->video_fps); - // start = sample_get_startFrame(info->uc->sample_id); - // } if(! info->seq->active ) veejay_set_frame(info, start); else @@ -392,7 +398,6 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num) if( n >= 0 ) { seq_play_sample( info, n ); - // veejay_set_sample( info, info->seq->samples[ info->seq->current ] ); } else veejay_set_frame(info,start); @@ -425,9 +430,7 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num) veejay_set_speed(info, (-1 * speed)); } break; - case 1: - //sample_apply_loop_dec( info->uc->sample_id, info->edit_list->video_fps); if(!info->seq->active) veejay_set_frame(info, end); else @@ -436,7 +439,6 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num) if( n >= 0 ) { seq_play_sample(info, n ); - // veejay_set_sample( info, info->seq->samples[ info->seq->current ] ); } else veejay_set_frame(info,end); @@ -718,98 +720,99 @@ int vj_perform_init(veejay_t * info, int use_vp) static void vj_perform_close_audio() { int i; - for(i=0; i < SAMPLE_MAX_EFFECTS; i++) - { - if(audio_buffer[i]) free(audio_buffer[i]); - } - if(tmp_audio_buffer) free(tmp_audio_buffer); + for(i=0; i < SAMPLE_MAX_EFFECTS; i++) + if(audio_buffer[i]) free(audio_buffer[i]); + if(top_audio_buffer) free(top_audio_buffer); - if(x_audio_buffer) free(x_audio_buffer); - if(priv_audio[0]) free(priv_audio[0]); - if(priv_audio[1]) free(priv_audio[1]); - if(resample_context) + if(resample_audio_buffer) free(resample_audio_buffer); + if(audio_render_buffer) free( audio_render_buffer ); + if(down_sample_buffer) free( down_sample_buffer ); +#ifdef HAVE_JACK + for(i=0; i <= MAX_SPEED; i ++) { - int i; - for(i=1; i <= MAX_SPEED; i ++) - { - if(resample_context[(i-1)]) - audio_resample_close( resample_context[(i-1)] ); - } + if(resample_context[i]) + audio_resample_close( resample_context[i] ); + if(downsample_context[i]) + audio_resample_close( downsample_context[i]); } +#endif + if(resample_jack) audio_resample_close(resample_jack); - /* temporary buffer */ - //if(bad_audio) free(bad_audio); + veejay_msg(VEEJAY_MSG_INFO, "Stopped Audio playback task"); } int vj_perform_init_audio(veejay_t * info) { // video_playback_setup *settings = info->settings; - int i; #ifndef HAVE_JACK - return 1; -#endif - if(info->audio==AUDIO_PLAY) - { - //vj_jack_start(); - } + return 0; +#else + int i; + if(!info->audio ) + { + veejay_msg(0,"No audio found"); + return 0; + } /* top audio frame */ top_audio_buffer = - (uint8_t *) vj_malloc(sizeof(uint8_t) * 2 * PERFORM_AUDIO_SIZE); + (uint8_t *) vj_calloc(sizeof(uint8_t) * 2 * PERFORM_AUDIO_SIZE); if(!top_audio_buffer) return 0; - x_audio_buffer = (uint8_t*) vj_malloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE); - if(!x_audio_buffer) return 0; - veejay_memset( x_audio_buffer,0,PERFORM_AUDIO_SIZE); - veejay_memset( top_audio_buffer, 0 ,2 * PERFORM_AUDIO_SIZE ); + down_sample_buffer = (uint8_t*) vj_calloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE * MAX_SPEED *4 ); + if(!down_sample_buffer) + return 0; + audio_render_buffer = (uint8_t*) vj_calloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE * MAX_SPEED * 4 ); + if(!audio_render_buffer) + return 0; + + resample_audio_buffer = (uint8_t*) vj_calloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE * 2); + if(!resample_audio_buffer) + return 0; + /* chained audio */ for (i = 0; i < SAMPLE_MAX_EFFECTS; i++) { audio_buffer[i] = - (uint8_t *) vj_malloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE); - veejay_memset(audio_buffer[i], 0, PERFORM_AUDIO_SIZE); + (uint8_t *) vj_calloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE); + if(!audio_buffer[i]) + return 0; } - /* temporary buffer */ -// bad_audio = -// (uint8_t *) vj_malloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE * -// (2 * SAMPLE_MAX_EFFECTS )); -// memset(bad_audio, 0, PERFORM_AUDIO_SIZE * (2 * SAMPLE_MAX_EFFECTS)); - tmp_audio_buffer = - (uint8_t *) vj_malloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE * 10); - if(!tmp_audio_buffer) return 0; - veejay_memset(tmp_audio_buffer, 0, PERFORM_AUDIO_SIZE * 10); - - for(i=0; i < 2; i ++) + + for( i = 0; i <= MAX_SPEED; i ++ ) { - priv_audio[i] = (short*) vj_malloc(sizeof(short) * PERFORM_AUDIO_SIZE * 10 ); - if(!priv_audio[i]) return 0; - veejay_memset( priv_audio[i], 0, PERFORM_AUDIO_SIZE * 10 ); - } + int out_rate = (info->edit_list->audio_rate * (i+2)); + int down_rate = (info->edit_list->audio_rate / (i+2)); - if(!info->audio) return 0; -#ifdef HAVE_JACK - for(i=2; i <= MAX_SPEED; i++) - { - int out_rate = info->edit_list->audio_rate * i; - resample_context[(i-1)] = audio_resample_init( + resample_context[i] = audio_resample_init( info->edit_list->audio_chans, info->edit_list->audio_chans, info->edit_list->audio_rate, out_rate); - // (i * (info->edit_list->audio_rate/2))); - - if(!resample_context[(i-1)]) + if(!resample_context[i]) { - resample_context[(i-1)] = NULL; - veejay_msg(VEEJAY_MSG_WARNING, "Cannot initialize resampler"); + veejay_msg(VEEJAY_MSG_ERROR, "Cannot initialize audio upsampler for speed %d", i); + return 0; } - veejay_msg(VEEJAY_MSG_DEBUG, "Speed %d resamples audio to %d Hz ", i, out_rate ); + downsample_context[i] = audio_resample_init( + info->edit_list->audio_chans, + info->edit_list->audio_chans, + info->edit_list->audio_rate, + down_rate ); + if(!downsample_context[i]) + { + veejay_msg(VEEJAY_MSG_WARNING< "Cannot initialize audio downsampler for dup %d",i); + return 0; + } + + veejay_msg(VEEJAY_MSG_DEBUG, "Resampler %d: Speed %d resamples audio to %d Hz, Slow %d to %d Hz ", i,i+2,out_rate, + i+2, down_rate ); } + return 1; #endif - return 0; } void vj_perform_free(veejay_t * info) @@ -904,18 +907,18 @@ int vj_perform_audio_start(veejay_t * info) } if ( res == 2 ) { - // setup resampler context - veejay_msg(VEEJAY_MSG_WARNING, "Jack plays at %d Hz, resampling audio from %d -> %d",el->play_rate,el->audio_rate,el->play_rate); - resample_jack = audio_resample_init( el->audio_chans,el->audio_chans, el->play_rate, el->audio_rate); + jack_rate_ = vj_jack_rate(); + veejay_msg(VEEJAY_MSG_WARNING, "Jack plays at %d Hz, resampling audio from %d -> %d",jack_rate_,el->audio_rate,jack_rate_); + resample_jack = audio_resample_init( el->audio_chans,el->audio_chans, jack_rate_, el->audio_rate); if(!resample_jack) { resample_jack = NULL; veejay_msg(VEEJAY_MSG_WARNING, "Cannot initialize resampler for %d -> %d audio rate conversion ", - el->audio_rate,el->play_rate); + el->audio_rate,jack_rate_); } + return 0; - } return 1; #else @@ -1326,13 +1329,6 @@ static void vj_perform_reverse_audio_frame(veejay_t * info, int len, veejay_memcpy(buf+i ,buf+(x-i-bps),bps); veejay_memcpy(buf+(x-i-bps), sample,bps); } -/* - for (i = 0; i < (len * bps); i += bps) { - veejay_memcpy(sample, buf + i, bps); - veejay_memcpy(tmp_audio_buffer + (len * bps) - bps - i, sample, bps); - } - veejay_memcpy(buf, tmp_audio_buffer, (len * bps)); - */ } @@ -1717,86 +1713,99 @@ int vj_perform_new_audio_frame(veejay_t * info, char *dst_buf, int nframe, */ #define ARRAY_LEN(x) ((int)(sizeof(x)/sizeof((x)[0]))) -int vj_perform_fill_audio_buffers(veejay_t * info, uint8_t *audio_buf) +int vj_perform_fill_audio_buffers(veejay_t * info, uint8_t *audio_buf, uint8_t *temporary_buffer) { - video_playback_setup *settings = info->settings; - int len = 0; - //int i; - int top_sample = info->uc->sample_id; - int top_speed = sample_get_speed(top_sample); - //int vol_a = sample_get_audio_volume(top_sample); - /* take top frame */ + video_playback_setup *settings = info->settings; + int len = 0; + int speed = sample_get_speed(info->uc->sample_id); + int bps = info->edit_list->audio_bps; + int pred_len = (info->edit_list->audio_rate / info->edit_list->video_fps ); - - if (top_speed > 1 || top_speed < -1) + if( simple_frame_duplicator <= 0 ) { - //len = info->edit_list->audio_rate / info->edit_list->video_fps; - //mymemset_generic(audio_buf, 0, (len * info->edit_list->audio_bps)); - uint8_t *tmp_buf; - int alen = 0; - int n_frames = (top_speed < 0 ? -1 * top_speed : top_speed); - int i; - int n_samples = 0; - int blen = 0; - int bps = info->edit_list->audio_bps; - double fl,cl; - int pred_len = 0; - tmp_buf = (uint8_t*) vj_malloc(sizeof(uint8_t) * n_frames * PERFORM_AUDIO_SIZE); - if(!tmp_buf) return 0; - - if(n_frames >= MAX_SPEED) n_frames = MAX_SPEED-1; - - for ( i = 0; i <= n_frames; i ++ ) + if (speed > 1 || speed < -1) { - alen = vj_el_get_audio_frame(info->edit_list,settings->current_frame_num + i, tmp_buf + blen); - if( alen < 0 ) return 0; - n_samples += alen; - blen += (alen * bps); - } + int a_len = 0; + int n_frames = abs(speed); +// uint8_t *tmp = audio_render_buffer + (2 * PERFORM_AUDIO_SIZE * MAX_SPEED); +// uint8_t *tmp = audio_render_buffer; + uint8_t *tmp = temporary_buffer; + uint8_t *sambuf = tmp; + long i,start,end; + int total_len = 0; + int n_samples = 0; + if( n_frames >= MAX_SPEED ) + n_frames = MAX_SPEED - 1; - fl = floor( n_samples - n_frames ); - cl = ceil( n_samples + n_frames ); - if( n_samples > 0 ) - { - pred_len = info->edit_list->audio_rate / info->edit_list->video_fps; - len = audio_resample( resample_context[n_frames], audio_buf, tmp_buf, n_samples ); - if( len < pred_len ) + if( speed < 0 ) { - veejay_memset(audio_buf + (len * bps), 0 , (pred_len-len)*bps); + start = settings->current_frame_num - n_frames; + end = settings->current_frame_num; } + else + { + start = settings->current_frame_num; + end = settings->current_frame_num + n_frames; + } + + for ( i = start; i < end; i ++ ) + { + a_len = vj_el_get_audio_frame(info->edit_list,i, tmp); + if( a_len <= 0 ) + { + n_samples += pred_len; + veejay_memset( tmp, 0, pred_len * bps ); + tmp += (pred_len*bps); + total_len += (pred_len*bps); + } + else + { + n_samples += a_len; + total_len += (a_len * bps); + tmp += (a_len* bps ); + } + } +#ifdef STRICT_CHECKING + assert( resample_context[ n_frames ] != NULL ); +#endif + if( speed < 0 ) + vj_perform_reverse_audio_frame(info, n_samples, sambuf ); + + len = audio_resample( resample_context[n_frames-2], audio_buf, sambuf, n_samples ); + + } else if( speed == 0 ) { + len = pred_len; + veejay_memset( audio_buf, 0, pred_len * bps ); + } else { + len = vj_el_get_audio_frame( info->edit_list, settings->current_frame_num, audio_buf ); + if( speed < 0 ) + vj_perform_reverse_audio_frame(info,len,audio_buf); } - if(tmp_buf) free(tmp_buf); - } - else + if( len < pred_len ) + veejay_memset( audio_buf + (len * bps ) , 0, (pred_len- len) * bps ); + } + + if( simple_frame_duplicator <= info->sfd && info->sfd > 1) { - if (top_speed == 0) + if( simple_frame_duplicator == 0 ) { - len = info->edit_list->audio_rate / info->edit_list->video_fps; - veejay_memset(audio_buf, 0, (len * info->edit_list->audio_bps)); - return len; + // @ resample buffer + int down_sample = audio_resample( downsample_context[ info->sfd-2 ], + down_sample_buffer, audio_buf, len ); + veejay_memcpy( audio_buf, down_sample_buffer, pred_len * bps ); } else { - len = - vj_el_get_audio_frame(info->edit_list, - settings->current_frame_num, - audio_buf); + veejay_memcpy( audio_buf, down_sample_buffer + (simple_frame_duplicator * pred_len * bps ), pred_len * bps ); } - } - - if (len <= 0) - { - veejay_memset(audio_buf,0,PERFORM_AUDIO_SIZE); - return (info->edit_list->audio_rate / info->edit_list->video_fps); } - if (top_speed < 0) - vj_perform_reverse_audio_frame(info, len, audio_buf); - - return len; + if( len < pred_len ) + len = pred_len; + return len; } static int vj_perform_apply_secundary_tag(veejay_t * info, int sample_id, @@ -2348,12 +2357,12 @@ static int vj_perform_tag_complete_buffers(veejay_t * info, int entry, int *hint static void vj_perform_plain_fill_buffer(veejay_t * info, int entry) { - video_playback_setup *settings = (video_playback_setup*) info->settings; - uint8_t *frame[3]; - int ret = 0; - frame[0] = primary_buffer[0]->Y; - frame[1] = primary_buffer[0]->Cb; - frame[2] = primary_buffer[0]->Cr; + video_playback_setup *settings = (video_playback_setup*) info->settings; + uint8_t *frame[3]; + int ret = 0; + frame[0] = primary_buffer[0]->Y; + frame[1] = primary_buffer[0]->Cb; + frame[2] = primary_buffer[0]->Cr; if(info->uc->playback_mode == VJ_PLAYBACK_MODE_SAMPLE) { @@ -2364,42 +2373,36 @@ static void vj_perform_plain_fill_buffer(veejay_t * info, int entry) ret = vj_el_get_video_frame(info->current_edit_list,settings->current_frame_num,frame); } - if(ret <= 0) - { - veejay_msg(0, "getting video frame. Stop veejay"); + if(ret <= 0) + { + veejay_msg(0, "Unable to queue video frae %d, stopping Veejay", + settings->current_frame_num ); veejay_change_state_save(info, LAVPLAY_STATE_STOP); - } + } } - -static long last_rendered_frame = 0; static int vj_perform_render_sample_frame(veejay_t *info, uint8_t *frame[3]) { int audio_len = 0; //uint8_t buf[16384]; long nframe = info->settings->current_frame_num; - uint8_t *_audio_buffer = NULL; - if(last_rendered_frame == nframe) return 0; // skip frame - - last_rendered_frame = info->settings->current_frame_num; + uint8_t *buf = (uint8_t*) vj_malloc( sizeof(uint8_t) * PERFORM_AUDIO_SIZE ); - if(info->edit_list->has_audio) - { - _audio_buffer = x_audio_buffer; - audio_len = (info->edit_list->audio_rate / info->edit_list->video_fps); - } - return(int)sample_record_frame( info->uc->sample_id,frame, - _audio_buffer,audio_len); + audio_len = vj_perform_fill_audio_buffers(info, buf, audio_render_buffer ); + int res = sample_record_frame( info->uc->sample_id,frame,buf,audio_len ); + + free(buf); + + return res; } + static int vj_perform_render_tag_frame(veejay_t *info, uint8_t *frame[3]) { long nframe = info->settings->current_frame_num; int sample_id = info->uc->sample_id; - if(last_rendered_frame == nframe) return 0; // skip frame - last_rendered_frame = info->settings->current_frame_num; if(info->settings->offline_record) sample_id = info->settings->offline_tag_id; @@ -2683,7 +2686,7 @@ static int vj_perform_tag_fill_buffer(veejay_t * info, int entry) /* vj_perform_pre_fade: prior to fading, we copy the orginal (unaffected) image to a tempory buffer */ -static inline void vj_perform_pre_chain(veejay_t *info, VJFrame *frame) +static void vj_perform_pre_chain(veejay_t *info, VJFrame *frame) { veejay_memcpy( temp_buffer[0] ,frame->data[0], frame->len ); veejay_memcpy( temp_buffer[1], frame->data[1], frame->uv_len); @@ -2817,88 +2820,80 @@ static void vj_perform_post_chain_tag(veejay_t *info, VJFrame *frame) int vj_perform_queue_audio_frame(veejay_t *info, int frame) { - if( info->audio == NO_AUDIO || !top_audio_buffer ) + if( info->audio == NO_AUDIO || !info->edit_list->has_audio) return 1; #ifdef HAVE_JACK + editlist *el = info->edit_list; video_playback_setup *settings = info->settings; long this_frame = settings->current_frame_num; - int num_samples = 0; - - editlist *el = info->edit_list; + int num_samples = (el->audio_rate/el->video_fps); + int grab_samples = 0; + int bps = el->audio_bps; uint8_t *a_buf = top_audio_buffer; - if(el->has_audio == 0 ) return 1; - - /* First, get the audio */ - if (info->audio == AUDIO_PLAY && el->has_audio) + if (info->audio == AUDIO_PLAY) { if(settings->audio_mute) - veejay_memset( a_buf, 0, num_samples * el->audio_bps); - else { - switch (info->uc->playback_mode) - { - case VJ_PLAYBACK_MODE_SAMPLE: - num_samples = vj_perform_fill_audio_buffers(info,a_buf); - break; + veejay_memset( a_buf, 0, num_samples * bps); + vj_jack_play( a_buf, num_samples * bps ); + return 1; + } - case VJ_PLAYBACK_MODE_PLAIN: + switch (info->uc->playback_mode) + { + case VJ_PLAYBACK_MODE_SAMPLE: + num_samples = vj_perform_fill_audio_buffers(info,a_buf, + audio_render_buffer + (2* PERFORM_AUDIO_SIZE * MAX_SPEED)); + break; + case VJ_PLAYBACK_MODE_PLAIN: if (settings->current_playback_speed == 0) { - veejay_memset( a_buf, 0, PERFORM_AUDIO_SIZE); - num_samples = (el->audio_rate/el->video_fps); + veejay_memset( a_buf, 0, num_samples * bps ); } else { - num_samples = + grab_samples = vj_el_get_audio_frame(el, this_frame,a_buf ); - if(num_samples < 0) - { - veejay_memset(a_buf,0,PERFORM_AUDIO_SIZE); - num_samples = (el->audio_rate/el->video_fps); - } + if(grab_samples < 0) + veejay_memset(a_buf,0,num_samples * bps ); + else + num_samples = grab_samples; } + if (settings->current_playback_speed < 0) vj_perform_reverse_audio_frame(info, num_samples,a_buf); break; - case VJ_PLAYBACK_MODE_TAG: - num_samples = vj_tag_get_audio_frame(info->uc->sample_id, a_buf); - if(num_samples <= 0) - { - veejay_memset( a_buf, 0, PERFORM_AUDIO_SIZE ); - num_samples = (el->audio_rate/el->video_fps); - } + case VJ_PLAYBACK_MODE_TAG: + grab_samples = vj_tag_get_audio_frame(info->uc->sample_id, a_buf); + if(grab_samples <= 0) + veejay_memset( a_buf, 0, num_samples * bps ); + else + num_samples = grab_samples; break; - default: - veejay_memset( a_buf, 0 , PERFORM_AUDIO_SIZE); - break; - } } - /* dump audio frame if required */ - if(info->stream_enabled==1) + + /* dump audio frame if required + if(info->stream_enabled==1) { // FIXME: does this still work ? vj_yuv_put_aframe(a_buf, el, num_samples * el->audio_bps); - } + } */ - if( el->play_rate != el->audio_rate && el->play_rate != 0) + if( jack_rate_ != el->audio_rate) { - veejay_memcpy( x_audio_buffer, a_buf, num_samples * el->audio_bps); - int r = audio_resample( resample_jack, (short*)top_audio_buffer,(short*)a_buf, num_samples ); - vj_jack_play( top_audio_buffer, ( r * el->audio_bps )); + veejay_memcpy( resample_audio_buffer, a_buf, num_samples * bps); + grab_samples = audio_resample( resample_jack, (short*)top_audio_buffer,(short*)a_buf, num_samples ); + vj_jack_play( top_audio_buffer, grab_samples * bps ); } else { - vj_jack_play( a_buf, (num_samples * el->audio_bps )); + vj_jack_play( a_buf, (num_samples * bps )); } } - #endif - return 1; - - } static int vj_perform_render_viewport( veejay_t *info, video_playback_setup *settings ) @@ -3118,15 +3113,15 @@ int vj_perform_queue_video_frame(veejay_t *info, int frame, const int skip_incr) { video_playback_setup *settings = info->settings; - if(settings->offline_record) - vj_perform_record_tag_frame(info,0); - if(skip_incr) return 1; - + int is444 = 0; int res = 0; veejay_memset( &pvar_, 0, sizeof(varcache_t)); + + if(settings->offline_record) + vj_perform_record_tag_frame(info,0); switch (info->uc->playback_mode) { @@ -3204,19 +3199,21 @@ int vj_perform_queue_frame(veejay_t * info, int frame, int skip ) { video_playback_setup *settings = (video_playback_setup*) info->settings; if(!skip) - switch(info->uc->playback_mode) { - case VJ_PLAYBACK_MODE_TAG: - vj_perform_increase_tag_frame(info, settings->current_playback_speed); - break; - case VJ_PLAYBACK_MODE_SAMPLE: - vj_perform_increase_sample_frame(info,settings->current_playback_speed); - break; - case VJ_PLAYBACK_MODE_PLAIN: - vj_perform_increase_plain_frame(info,settings->current_playback_speed); - break; - default: - veejay_change_state(info, LAVPLAY_STATE_STOP); - break; + { + switch(info->uc->playback_mode) + { + case VJ_PLAYBACK_MODE_TAG: + vj_perform_increase_tag_frame(info, settings->current_playback_speed); + break; + case VJ_PLAYBACK_MODE_SAMPLE: + vj_perform_increase_sample_frame(info,settings->current_playback_speed); + break; + case VJ_PLAYBACK_MODE_PLAIN: + vj_perform_increase_plain_frame(info,settings->current_playback_speed); + break; + default: + break; + } } vj_perform_clear_cache(); __global_frame = 0; diff --git a/veejay-current/veejay/vj-perform.h b/veejay-current/veejay/vj-perform.h index c9a5fc64..e4c6ffca 100644 --- a/veejay-current/veejay/vj-perform.h +++ b/veejay-current/veejay/vj-perform.h @@ -31,7 +31,7 @@ int vj_perform_send_primary_frame_s(veejay_t *info, int mcast); void vj_perform_get_primary_frame_420p(veejay_t *info, uint8_t **frame ); -int vj_perform_fill_audio_buffers(veejay_t *info, uint8_t *audio_buf); +int vj_perform_fill_audio_buffers(veejay_t *info, uint8_t *audio_buf, uint8_t *temporary_buffer); int vj_perform_tag_decode_buffers(veejay_t * info, int entry); diff --git a/veejay-current/veejay/vj-pjack.c b/veejay-current/veejay/vj-pjack.c index f9c01400..998ff9c2 100644 --- a/veejay-current/veejay/vj-pjack.c +++ b/veejay-current/veejay/vj-pjack.c @@ -69,30 +69,33 @@ int vj_jack_init(editlist *el) bits_per_sample = 16; audio_channels = el->audio_chans; - audio_rate = el->audio_rate; - if( !_vj_jack_start(&driver) ) return ret; + long jack_rate = JACK_GetSampleRate(driver ); + audio_bps = audio_rate * audio_channels; buffer_len = vj_jack_get_space(); - veejay_msg(2,"Jack: %d Hz/ %d Channels %d Bit ", audio_rate, audio_channels,bits_per_sample); + veejay_msg(2,"Jack: %ld, %d Hz/ %d Channels %d Bit ", jack_rate,audio_channels,bits_per_sample); ret = 1; - if( v_rate != audio_rate ) - { - el->play_rate = audio_rate; + if( jack_rate != el->audio_rate ) ret = 2; - } - + //JACK_SetState( driver, PLAYING); return ret; } +int vj_jack_rate() +{ + return JACK_GetSampleRate(driver); +} + + int vj_jack_continue(int speed) { if(speed==0)