Jarod Wilson 882aaa
diff -Naurp dvgrab-3.0.orig/dvgrab.cc dvgrab-3.0/dvgrab.cc
Jarod Wilson 882aaa
--- dvgrab-3.0.orig/dvgrab.cc	2007-08-06 23:00:43.000000000 -0400
Jarod Wilson 882aaa
+++ dvgrab-3.0/dvgrab.cc	2007-10-22 17:22:18.000000000 -0400
Jarod Wilson 882aaa
@@ -436,9 +436,6 @@ void DVgrab::getargs( int argc, char *ar
Jarod Wilson 882aaa
 			print_version();
Jarod Wilson 882aaa
 			exit( EXIT_SUCCESS );
Jarod Wilson 882aaa
 			break;
Jarod Wilson 882aaa
-		case '-':
Jarod Wilson 882aaa
-			m_raw_pipe = true;
Jarod Wilson 882aaa
-			break;
Jarod Wilson 882aaa
 		default:
Jarod Wilson 882aaa
 			print_usage();
Jarod Wilson 882aaa
 			exit( EXIT_FAILURE );
Jarod Wilson 882aaa
@@ -447,15 +444,31 @@ void DVgrab::getargs( int argc, char *ar
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
 	if ( optind < argc )
Jarod Wilson 882aaa
 	{
Jarod Wilson 882aaa
+		if ( argv[ optind ][0] == '-' )
Jarod Wilson 882aaa
+		{
Jarod Wilson 882aaa
+			m_raw_pipe = true;
Jarod Wilson 882aaa
+			++optind;
Jarod Wilson 882aaa
+		}
Jarod Wilson 882aaa
+	}
Jarod Wilson 882aaa
+	if ( optind < argc )
Jarod Wilson 882aaa
+	{
Jarod Wilson 882aaa
 		m_dst_file_name = argv[ optind++ ];
Jarod Wilson 882aaa
 		set_format_from_name();
Jarod Wilson 882aaa
 	}
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
 	if ( optind < argc )
Jarod Wilson 882aaa
 	{
Jarod Wilson 882aaa
-		cerr << "Too many output file names." << endl;
Jarod Wilson 882aaa
-		print_usage();
Jarod Wilson 882aaa
-		exit( EXIT_FAILURE );
Jarod Wilson 882aaa
+		if ( argv[ optind ][0] == '-' )
Jarod Wilson 882aaa
+		{
Jarod Wilson 882aaa
+			m_raw_pipe = true;
Jarod Wilson 882aaa
+			++optind;
Jarod Wilson 882aaa
+		}
Jarod Wilson 882aaa
+		else
Jarod Wilson 882aaa
+		{
Jarod Wilson 882aaa
+			cerr << "Too many output file names." << endl;
Jarod Wilson 882aaa
+			print_usage();
Jarod Wilson 882aaa
+			exit( EXIT_FAILURE );
Jarod Wilson 882aaa
+		}
Jarod Wilson 882aaa
 	}
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
 	if ( m_dst_file_name == NULL && !m_raw_pipe )
Jarod Wilson 882aaa
diff -Naurp dvgrab-3.0.orig/filehandler.cc dvgrab-3.0/filehandler.cc
Jarod Wilson 882aaa
--- dvgrab-3.0.orig/filehandler.cc	2007-07-28 23:47:15.000000000 -0400
Jarod Wilson 882aaa
+++ dvgrab-3.0/filehandler.cc	2007-10-22 17:25:53.000000000 -0400
Jarod Wilson 882aaa
@@ -41,6 +41,7 @@ using std::setfill;
Jarod Wilson 882aaa
 #include <sys/stat.h>
Jarod Wilson 882aaa
 #include <assert.h>
Jarod Wilson 882aaa
 #include <time.h>
Jarod Wilson 882aaa
+#include <errno.h>
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
 #include "filehandler.h"
Jarod Wilson 882aaa
 #include "error.h"
Jarod Wilson 882aaa
@@ -459,6 +460,32 @@ TimeSys:
Jarod Wilson 882aaa
 	return true;
Jarod Wilson 882aaa
 }
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
+static ssize_t writen( int fd, unsigned char *vptr, size_t n )
Jarod Wilson 882aaa
+{
Jarod Wilson 882aaa
+	size_t nleft = n;
Jarod Wilson 882aaa
+	ssize_t nwritten;
Jarod Wilson 882aaa
+	unsigned char *ptr = vptr;
Jarod Wilson 882aaa
+
Jarod Wilson 882aaa
+	while ( nleft > 0 )
Jarod Wilson 882aaa
+	{
Jarod Wilson 882aaa
+		if ( ( nwritten = write( fd, ptr, nleft ) ) <= 0 )
Jarod Wilson 882aaa
+		{
Jarod Wilson 882aaa
+			if ( errno == EINTR )
Jarod Wilson 882aaa
+			{
Jarod Wilson 882aaa
+				nwritten = 0;
Jarod Wilson 882aaa
+			}
Jarod Wilson 882aaa
+			else
Jarod Wilson 882aaa
+			{
Jarod Wilson 882aaa
+				n = -1;
Jarod Wilson 882aaa
+				break;
Jarod Wilson 882aaa
+			}
Jarod Wilson 882aaa
+		}
Jarod Wilson 882aaa
+		nleft -= nwritten;
Jarod Wilson 882aaa
+		ptr += nwritten;
Jarod Wilson 882aaa
+	}
Jarod Wilson 882aaa
+	return n;
Jarod Wilson 882aaa
+}
Jarod Wilson 882aaa
+
Jarod Wilson 882aaa
 /***************************************************************************/
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
@@ -497,7 +524,7 @@ bool RawHandler::Create( const string& f
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
 int RawHandler::Write( Frame *frame )
Jarod Wilson 882aaa
 {
Jarod Wilson 882aaa
-	int result = write( fd, frame->data, frame->GetDataLen() );
Jarod Wilson 882aaa
+	int result = writen( fd, frame->data, frame->GetDataLen() );
Jarod Wilson 882aaa
 	return result;
Jarod Wilson 882aaa
 }
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
@@ -1261,12 +1288,12 @@ int Mpeg2Handler::Write( Frame *frame )
Jarod Wilson 882aaa
 	// Write any buffered data first.
Jarod Wilson 882aaa
 	if ( bufferLen > 0 )
Jarod Wilson 882aaa
 	{
Jarod Wilson 882aaa
-		if ( 0 > ( result = write( fd, buffer, bufferLen ) ) )
Jarod Wilson 882aaa
+		if ( 0 > ( result = writen( fd, buffer, bufferLen ) ) )
Jarod Wilson 882aaa
 			return result;
Jarod Wilson 882aaa
 		bufferLen = 0;
Jarod Wilson 882aaa
 	}
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
-	result = write( fd, frame->data, frame->GetDataLen() );
Jarod Wilson 882aaa
+	result = writen( fd, frame->data, frame->GetDataLen() );
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
 	if ( 0 <= result )
Jarod Wilson 882aaa
 		totalFrames++;
Jarod Wilson 882aaa
diff -Naurp dvgrab-3.0.orig/ieee1394io.cc dvgrab-3.0/ieee1394io.cc
Jarod Wilson 882aaa
--- dvgrab-3.0.orig/ieee1394io.cc	2007-07-07 03:10:12.000000000 -0400
Jarod Wilson 882aaa
+++ dvgrab-3.0/ieee1394io.cc	2007-10-22 17:14:52.000000000 -0400
Jarod Wilson 882aaa
@@ -432,14 +432,18 @@ bool iec61883Reader::Open()
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
 void iec61883Reader::Close()
Jarod Wilson 882aaa
 {
Jarod Wilson 882aaa
-	if ( m_iec61883.ref != NULL )
Jarod Wilson 882aaa
-	{
Jarod Wilson 882aaa
-		if ( isHDV )
Jarod Wilson 882aaa
+	if ( isHDV ) {
Jarod Wilson 882aaa
+		if ( m_iec61883.mpeg2 != NULL ) {
Jarod Wilson 882aaa
 			iec61883_mpeg2_close( m_iec61883.mpeg2 );
Jarod Wilson 882aaa
-		else
Jarod Wilson 882aaa
+			m_iec61883.mpeg2 = NULL;
Jarod Wilson 882aaa
+		}
Jarod Wilson 882aaa
+	}
Jarod Wilson 882aaa
+	else
Jarod Wilson 882aaa
+	{
Jarod Wilson 882aaa
+		if ( m_iec61883.dv != NULL ) {
Jarod Wilson 882aaa
 			iec61883_dv_fb_close( m_iec61883.dv );
Jarod Wilson 882aaa
-
Jarod Wilson 882aaa
-		m_iec61883.dv = NULL;
Jarod Wilson 882aaa
+			m_iec61883.dv = NULL;
Jarod Wilson 882aaa
+		}
Jarod Wilson 882aaa
 	}
Jarod Wilson 882aaa
 }
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
@@ -470,9 +474,9 @@ void iec61883Reader::StopReceive()
Jarod Wilson 882aaa
 	if ( m_iec61883.ref != NULL )
Jarod Wilson 882aaa
 	{
Jarod Wilson 882aaa
 		if ( isHDV )
Jarod Wilson 882aaa
-			iec61883_mpeg2_close( m_iec61883.mpeg2 );
Jarod Wilson 882aaa
+			iec61883_mpeg2_recv_stop( m_iec61883.mpeg2 );
Jarod Wilson 882aaa
 		else
Jarod Wilson 882aaa
-			iec61883_dv_fb_close( m_iec61883.dv );
Jarod Wilson 882aaa
+			iec61883_dv_fb_stop( m_iec61883.dv );
Jarod Wilson 882aaa
 
Jarod Wilson 882aaa
 		m_iec61883.ref = NULL;
Jarod Wilson 882aaa
 	}
Jarod Wilson 882aaa
@@ -1085,6 +1089,7 @@ void* pipeReader::Thread()
Jarod Wilson 882aaa
 	pthread_mutex_lock( &mutex );
Jarod Wilson 882aaa
 	if ( currentFrame ) outFrames.push_back( currentFrame );
Jarod Wilson 882aaa
 	currentFrame = NULL;
Jarod Wilson 882aaa
+	outFrames.push_back( currentFrame );
Jarod Wilson 882aaa
 	TriggerAction( );
Jarod Wilson 882aaa
 	pthread_mutex_unlock( &mutex );
Jarod Wilson 882aaa
 	return NULL;