diff -ru hvirtual.orig/cinelerra/audio1394.C hvirtual/cinelerra/audio1394.C
--- hvirtual.orig/cinelerra/audio1394.C	2003-04-30 06:47:15.000000000 +1300
+++ hvirtual/cinelerra/audio1394.C	2003-05-11 11:18:57.000000000 +1300
@@ -6,7 +6,7 @@
 #include "videodevice.h"
 
 #ifdef HAVE_FIREWIRE
-#define SAMPLES_PER_FRAME 2048
+#define SAMPLES_PER_FRAME 1944
 
 Audio1394::Audio1394(AudioDevice *device) : AudioLowLevel(device)
 {
@@ -45,8 +45,8 @@
 // Fix the ichannels for the DV format
 	device->in_channels = 2;
 	device->in_bits = 16;
-	frames = 30;
-
+	frames = device->in_config->afirewire_in_framerate;
+	
 	if(dv_start_grabbing(grabber, 
 			device->in_config->afirewire_in_port, 
 			device->in_config->afirewire_in_channel, 
@@ -58,7 +58,7 @@
 	else
 	{
 		bytes_per_sample = 4;
-		ring_buffer = new unsigned char[2 * frames * 2048 * bytes_per_sample];
+		ring_buffer = new unsigned char[2 * frames * SAMPLES_PER_FRAME * bytes_per_sample];
 	}
 
 	return 0;
diff -ru hvirtual.orig/cinelerra/audioconfig.C hvirtual/cinelerra/audioconfig.C
--- hvirtual.orig/cinelerra/audioconfig.C	2003-04-30 06:47:15.000000000 +1300
+++ hvirtual/cinelerra/audioconfig.C	2003-05-11 11:18:57.000000000 +1300
@@ -21,6 +21,7 @@
 	audio_in_driver = that.audio_in_driver;
 	afirewire_in_port = that.afirewire_in_port;
 	afirewire_in_channel = that.afirewire_in_channel;
+	afirewire_in_framerate = that.afirewire_in_framerate;
 	strcpy(esound_in_server, that.esound_in_server);
 	esound_in_port = that.esound_in_port;
 	strcpy(oss_in_device, that.oss_in_device);
@@ -54,6 +55,7 @@
 	audio_in_driver =             defaults->get("AUDIOINDRIVER", AUDIO_OSS);
 	afirewire_in_port =           defaults->get("AFIREWIRE_IN_PORT", 0);
 	afirewire_in_channel =        defaults->get("AFIREWIRE_IN_CHANNEL", 63);
+	afirewire_in_framerate =        defaults->get("AFIREWIRE_IN_FRAMERATE", 25);
 	sprintf(oss_in_device, "/dev/dsp");
 	                              defaults->get("OSS_IN_DEVICE", oss_in_device);
 	oss_in_channels =             defaults->get("OSS_IN_CHANNELS", 2);
@@ -88,6 +90,7 @@
 	defaults->update("AUDIOINDRIVER", audio_in_driver);
 	defaults->update("AFIREWIRE_IN_PORT", afirewire_in_port);
 	defaults->update("AFIREWIRE_IN_CHANNEL", afirewire_in_channel);
+	defaults->update("AFIREWIRE_IN_FRAMERATE", afirewire_in_framerate);
 	defaults->update("OSS_IN_DEVICE", oss_in_device);
 	defaults->update("OSS_IN_CHANNELS", oss_in_channels);
 	defaults->update("OSS_IN_BITS", oss_in_bits);
diff -ru hvirtual.orig/cinelerra/audioconfig.h hvirtual/cinelerra/audioconfig.h
--- hvirtual.orig/cinelerra/audioconfig.h	2003-04-30 06:47:15.000000000 +1300
+++ hvirtual/cinelerra/audioconfig.h	2003-05-11 11:18:57.000000000 +1300
@@ -20,7 +20,7 @@
 	char oss_in_device[1024];
 	int oss_in_channels;
 	int oss_in_bits;
-	int afirewire_in_port, afirewire_in_channel;
+	int afirewire_in_port, afirewire_in_channel, afirewire_in_framerate;
 	char esound_in_server[1024];
 	int esound_in_port;
 
diff -ru hvirtual.orig/cinelerra/recordconfig.C hvirtual/cinelerra/recordconfig.C
--- hvirtual.orig/cinelerra/recordconfig.C	2003-04-30 06:47:15.000000000 +1300
+++ hvirtual/cinelerra/recordconfig.C	2003-05-11 23:20:26.000000000 +1300
@@ -21,6 +21,7 @@
 	oss_in_bits = 16;
 	afirewire_in_port = 0;
 	afirewire_in_channel = 63;
+	afirewire_in_framerate = 30;
 	sprintf(esound_in_server, "");
 	esound_in_port = 0;
 
@@ -63,6 +64,7 @@
 	driver = that.driver;
 	afirewire_in_port = that.afirewire_in_port;
 	afirewire_in_channel = that.afirewire_in_channel;
+	afirewire_in_framerate = that.afirewire_in_framerate;
 	strcpy(esound_in_server, that.esound_in_server);
 	esound_in_port = that.esound_in_port;
 
@@ -87,6 +89,7 @@
 	driver =                      defaults->get("AUDIOINDRIVER", driver);
 	afirewire_in_port =           defaults->get("AFIREWIRE_IN_PORT", afirewire_in_port);
 	afirewire_in_channel =        defaults->get("AFIREWIRE_IN_CHANNEL", afirewire_in_channel);
+	afirewire_in_framerate =      defaults->get("AFIREWIRE_IN_FRAMERATE", afirewire_in_framerate);
 	for(int i = 0; i < MAXDEVICES; i++)
 	{
 		sprintf(string, "OSS_ENABLE_%d", i);
@@ -114,6 +117,8 @@
 	defaults->update("AUDIOINDRIVER", driver);
 	defaults->update("AFIREWIRE_IN_PORT", afirewire_in_port);
 	defaults->update("AFIREWIRE_IN_CHANNEL", afirewire_in_channel);
+	defaults->update("AFIREWIRE_IN_FRAMERATE", afirewire_in_framerate);
+
 
 	for(int i = 0; i < MAXDEVICES; i++)
 	{
Only in hvirtual/cinelerra: recordconfig.C~
diff -ru hvirtual.orig/cinelerra/recordconfig.h hvirtual/cinelerra/recordconfig.h
--- hvirtual.orig/cinelerra/recordconfig.h	2003-04-30 06:47:15.000000000 +1300
+++ hvirtual/cinelerra/recordconfig.h	2003-05-11 11:18:57.000000000 +1300
@@ -24,7 +24,7 @@
 	char oss_in_device[MAXDEVICES][BCTEXTLEN];
 	int oss_in_channels[MAXDEVICES];
 	int oss_in_bits;
-	int afirewire_in_port, afirewire_in_channel;
+	int afirewire_in_port, afirewire_in_channel, afirewire_in_framerate;
 	char esound_in_server[BCTEXTLEN];
 	int esound_in_port;
 	char alsa_in_device[BCTEXTLEN];
diff -ru hvirtual.orig/cinelerra/vdevice1394.C hvirtual/cinelerra/vdevice1394.C
--- hvirtual.orig/cinelerra/vdevice1394.C	2003-04-30 06:47:15.000000000 +1300
+++ hvirtual/cinelerra/vdevice1394.C	2003-05-12 00:48:19.000000000 +1300
@@ -17,22 +17,18 @@
 #ifdef HAVE_FIREWIRE
 
 
-
-
-
 #include "avc1394.h"
 #include "avc1394_vcr.h"
 #include "rom1394.h"
 
 
 
-
-
 #define CIP_N_NTSC 2436
 #define CIP_D_NTSC 38400
 #define CIP_N_PAL 1
 #define CIP_D_PAL 16
 
+
 VDevice1394::VDevice1394(VideoDevice *device)
  : VDeviceBase(device)
 {
@@ -146,7 +142,6 @@
 
 
 
-
         output_mmap.channel = device->out_config->firewire_channel;
         output_queue.channel = output_mmap.channel;
         output_mmap.sync_tag = 0;
@@ -398,7 +393,7 @@
 			input->get_h() == 576))
 		{
 //printf("VDevice1394::write_buffer 3\n");
-			int norm = (input->get_h() == 480) ? DV_NTSC : DV_PAL;
+			int norm = (input->IsPAL()) ? DV_PAL : DV_NTSC;
 			int data_size = (norm == DV_NTSC) ? DV_NTSC_SIZE : DV_PAL_SIZE;
 			temp_frame->allocate_compressed_data(data_size);
 			temp_frame->set_compressed_size(data_size);
@@ -417,9 +412,7 @@
 //printf("VDevice1394::write_buffer 5\n");
 			if(!temp_frame2)
 			{
-				int h = input->get_h();
-				if(h != 480 && h != 576) h = 480;
-
+				int h = (input->IsPAL()) ? 576 : 480;
 				temp_frame2 = new VFrame(0,
 					720,
 					h,
@@ -428,7 +421,7 @@
 			}
 //printf("VDevice1394::write_buffer 5\n");
 
-			int norm = (input->get_h() == 480) ? DV_NTSC : DV_PAL;
+			int norm = (input->IsPAL()) ? DV_PAL : DV_NTSC;
 			int data_size = (norm == DV_NTSC) ? DV_NTSC_SIZE : DV_PAL_SIZE;
 			temp_frame->allocate_compressed_data(data_size);
 			temp_frame->set_compressed_size(data_size);
@@ -492,13 +485,13 @@
 	while(unused_buffers--)
 	{
 //printf("VDevice1394::write_buffer 8\n");
-		int is_pal = (ptr->get_h() == 576);
+		bool is_pal = ptr->IsPAL();
 		unsigned char *output = output_buffer + output_queue.buffer * output_mmap.buf_size;
 		int output_size = 320;
-		int packets_per_frame = (is_pal ? 300 : 250);
+		int packets_per_frame = (is_pal ? 300 : 250); 
 		int min_packet_size = output_mmap.packet_size;
-		long frame_size = packets_per_frame * 480;
-		char vdata = 0;
+		unsigned long frame_size = packets_per_frame * 480;
+		unsigned long vdata = 0;
 		unsigned char *data = ptr->get_data();
 		unsigned int *packet_sizes = this->packet_sizes;
 //printf("VDevice1394::write_buffer 9\n");
@@ -507,14 +500,14 @@
 		{
         	if(packets_per_frame == 250) 
 			{
-            	cip_n = CIP_N_NTSC;
-            	cip_d = CIP_D_NTSC;
+            	cip_n = (cip_n > 0) ? cip_n : CIP_N_NTSC;
+            	cip_d = (cip_d > 0) ? cip_d : CIP_D_NTSC;
             	f50_60 = 0x00;
         	}
 			else 
 			{
-            	cip_n = CIP_N_PAL;
-            	cip_d = CIP_D_PAL;
+            	cip_n = (cip_n > 0) ? cip_n : CIP_N_PAL;
+            	cip_d = (cip_d > 0) ? cip_d : CIP_D_PAL;
             	f50_60 = 0x80;
         	}
         	cip_counter = cip_n;
@@ -524,7 +517,7 @@
 		for(int i = 0; i < output_size && vdata < frame_size; i++)
 		{
         	unsigned char *p = output;
-        	int want_sync = (cip_counter > cip_d);
+        	bool want_sync = ((cip_counter + cip_n) > cip_d);
 
 /* Source node ID ! */
        	 	*p++ = 0x01; 
@@ -554,7 +547,7 @@
             	vdata += 480;
         	}
         	else
-            	cip_counter -= cip_d;
+            	cip_counter -= (cip_d - cip_n);
 
         	*packet_sizes++ = p - output;
         	output += min_packet_size;
@@ -570,8 +563,8 @@
     	}
 //printf("VDevice1394::write_buffer 13\n");
 
-    	output_queue.buffer++;
-		if(output_queue.buffer >= output_mmap.nb_buffers) output_queue.buffer = 0;
+    	output_queue.buffer++;		
+	output_queue.buffer %= output_mmap.nb_buffers;
 	}
 //printf("VDevice1394::write_buffer 14\n");
 
Only in hvirtual/cinelerra: vdevice1394.C~
diff -ru hvirtual.orig/cinelerra/vdeviceprefs.C hvirtual/cinelerra/vdeviceprefs.C
--- hvirtual.orig/cinelerra/vdeviceprefs.C	2003-04-30 06:47:15.000000000 +1300
+++ hvirtual/cinelerra/vdeviceprefs.C	2003-05-11 11:18:57.000000000 +1300
@@ -220,6 +220,7 @@
 	}
 	dialog->add_subwindow(channel_title = new BC_Title(x1, y, "Channel:", MEDIUMFONT, BLACK));
 	dialog->add_subwindow(firewire_channel = new VDeviceIntBox(x1, y + 20, output_int));
+
 	return 0;
 }
 
Only in hvirtual: cinelerra1394.diff~
diff -ru hvirtual.orig/guicast/vframe.C hvirtual/guicast/vframe.C
--- hvirtual.orig/guicast/vframe.C	2003-04-30 06:47:16.000000000 +1300
+++ hvirtual/guicast/vframe.C	2003-05-11 11:18:57.000000000 +1300
@@ -848,5 +848,20 @@
 }
 
 
+/** checks whether the frame is in PAL or NTSC format
+ 
+    \todo function can't handle "empty" frame
+    \return true for PAL frame, false for a NTSC frame
+*/
 
-
+bool VFrame::IsPAL(void) const
+{
+    unsigned char dsf = data[3] & 0x80;
+    bool pal = (dsf == 0) ? false : true;
+#ifdef HAVE_LIBDV
+    if (!pal) {
+        pal = (dv_system_50_fields (decoder) == 1) ? true : pal;
+    }
+#endif
+    return pal;
+}
diff -ru hvirtual.orig/guicast/vframe.h hvirtual/guicast/vframe.h
--- hvirtual.orig/guicast/vframe.h	2003-04-30 06:47:16.000000000 +1300
+++ hvirtual/guicast/vframe.h	2003-05-11 11:18:57.000000000 +1300
@@ -24,6 +24,7 @@
 		int h, 
 		int color_model = BC_RGBA8888, 
 		long bytes_per_line = -1);
+	bool IsPAL(void) const;
 // Create a frame with the png image
 	VFrame(unsigned char *png_data);
 	VFrame(VFrame &vframe);
diff -ru hvirtual.orig/quicktime/libdv.c hvirtual/quicktime/libdv.c
--- hvirtual.orig/quicktime/libdv.c	2003-04-30 06:47:14.000000000 +1300
+++ hvirtual/quicktime/libdv.c	2003-05-11 11:18:57.000000000 +1300
@@ -17,6 +17,7 @@
 static dv_grabber_t *dv_grabber = 0;
 #endif
 
+#define DV_AUDIO_MAX_SAMPLES 1944
 
 #ifdef HAVE_FIREWIRE
 int dv_advance_frame(dv_grabber_t *grabber, int *frame_number)
