diff -Nru tmp/dvgrab-1.5/dvgrab.cc dvgrab-1.5/dvgrab.cc
--- tmp/dvgrab-1.5/dvgrab.cc	2004-01-14 06:46:29.000000000 -0700
+++ dvgrab-1.5/dvgrab.cc	2004-02-03 21:07:20.000000000 -0700
@@ -137,6 +137,7 @@
 		m_port( -1 ), m_node( -1 ), m_reader_active( false ), m_autosplit( false ),
 		m_timestamp( false ), m_channel( 63 ), m_frame_count( 0 ), m_max_file_size( 1000 ),
 		m_file_format( AVI_DV2_FORMAT ), m_open_dml( false ), m_frame_every( 1 ),
+		m_stop_motion_state( 0 ),
 		m_dv1394( NULL ), m_jpeg_quality( 75 ),
 		m_jpeg_deinterlace( false ), m_jpeg_width( -1 ), m_jpeg_height( -1 ),
 		m_jpeg_overwrite( false ), m_captureActive( false ), m_avc( NULL ), m_reader( NULL ),
@@ -543,6 +544,7 @@
 		m_writer->SetMaxFrameCount( m_frame_count );
 		m_writer->SetAutoSplit( m_autosplit );
 		m_writer->SetEveryNthFrame( m_frame_every );
+		m_writer->SetStopMotionState( m_stop_motion_state );
 		m_writer->SetMaxFileSize( ( off_t ) m_max_file_size * ( off_t ) ( 1024 * 1024 ) );
 	}
 	if ( m_avc )
@@ -613,6 +615,15 @@
 	pthread_mutex_unlock( &capture_mutex );
 }
 
+void DVgrab::grabStopMotion()
+{
+	if ( ! m_captureActive ) {
+		m_stop_motion_state = 2;
+		startCapture();
+	}
+	m_writer->SetStopMotionState(1);
+}
+
 void *DVgrab::captureThread( void *arg )
 {
 	DVgrab * me = ( DVgrab* ) arg;
@@ -952,14 +963,20 @@
 			m_avc->Stop( m_node );
 		break;
 	case 'c':
+		m_stop_motion_state = 0;
 		startCapture();
 		break;
+	case 'x':
+		grabStopMotion();
+		cerr << "Grabbed one frame.\n";
+		break;
 	case 'q':
 		result = false;
 		break;
 	case '?':
 		cerr << "q=quit, p=play, c=capture, Esc=stop, h=reverse, j=backward scan, k=pause\n";
 		cerr << "l=forward scan, a=rewind, z=fast forward, 0-9=trickplay, <space>=play/pause\n";
+		cerr << "x=stop-motion frame capture\n";
 		break;
 	default:
 		//fprintf( stderr, "\nunkown key 0x%2.2x", cmd );
diff -Nru tmp/dvgrab-1.5/dvgrab.h dvgrab-1.5/dvgrab.h
--- tmp/dvgrab-1.5/dvgrab.h	2003-12-09 12:06:02.000000000 -0700
+++ dvgrab-1.5/dvgrab.h	2004-02-03 20:59:52.000000000 -0700
@@ -53,6 +53,7 @@
 	int m_file_format;
 	bool m_open_dml;
 	int m_frame_every;
+	int m_stop_motion_state;
 	char *m_dv1394;
 	int m_jpeg_quality;
 	bool m_jpeg_deinterlace;
@@ -89,6 +90,7 @@
 	void getargs( int argc, char *argv[] );
 	void startCapture();
 	void stopCapture();
+	void grabStopMotion();
 	void status();
 	void captureThreadRun();
 	bool execute( const char );
diff -Nru tmp/dvgrab-1.5/filehandler.cc dvgrab-1.5/filehandler.cc
--- tmp/dvgrab-1.5/filehandler.cc	2003-12-29 20:18:47.000000000 -0700
+++ dvgrab-1.5/filehandler.cc	2004-02-03 20:50:14.000000000 -0700
@@ -136,6 +136,12 @@
 }
 
 
+int FileHandler::GetStopMotionState() const
+{
+	return stopMotionState;
+}
+
+
 string FileHandler::GetBaseName() const
 {
 	return base;
@@ -171,6 +177,12 @@
 }
 
 
+void FileHandler::SetStopMotionState( int state )
+{
+	stopMotionState = state;
+}
+
+
 void FileHandler::SetBaseName( const string& s )
 {
 	base = s;
@@ -274,7 +286,7 @@
 
 	/* write frame */
 
-	if ( framesToSkip == 0 )
+	if ( (framesToSkip == 0 && stopMotionState == 0) || stopMotionState == 1)
 	{
 		if ( 0 > Write( frame ) )
 		{
@@ -285,6 +297,8 @@
 		++framesWritten;
 	}
 	framesToSkip--;
+	if (stopMotionState == 1)
+		stopMotionState = 2;
 
 	/* If the frame count is exceeded, close the current file.
 	   If the autosplit flag is set, a new file will be created in the next iteration.
diff -Nru tmp/dvgrab-1.5/filehandler.h dvgrab-1.5/filehandler.h
--- tmp/dvgrab-1.5/filehandler.h	2003-12-09 12:06:03.000000000 -0700
+++ dvgrab-1.5/filehandler.h	2004-02-03 20:42:37.000000000 -0700
@@ -70,6 +70,7 @@
 
 	virtual bool GetAutoSplit() const;
 	virtual bool GetTimeStamp() const;
+	virtual int  GetStopMotionState() const;
 	virtual string GetBaseName() const;
 	virtual string GetExtension() const;
 	virtual int GetMaxFrameCount() const;
@@ -79,6 +80,7 @@
 
 	virtual void SetAutoSplit( bool );
 	virtual void SetTimeStamp( bool );
+	virtual void SetStopMotionState( int );
 	virtual void SetBaseName( const string& base );
 	virtual void SetMaxFrameCount( int );
 	virtual void SetEveryNthFrame( int );
@@ -108,6 +110,7 @@
 	bool done;
 	bool autoSplit;
 	bool timeStamp;
+	int stopMotionState;
 	int maxFrameCount;
 	int framesWritten;
 	int everyNthFrame;

