Update the trunk to the OpenCV's CVS (2008-07-14)
[opencv] / otherlibs / highgui / cvcap.cpp
index 0c9c24a..18379c1 100644 (file)
@@ -56,59 +56,35 @@ CV_IMPL void cvReleaseCapture( CvCapture** pcapture )
 {
     if( pcapture && *pcapture )
     {
-        CvCapture* capture = *pcapture;
-        if( capture && capture->vtable &&
-            capture->vtable->count >= CV_CAPTURE_BASE_API_COUNT &&
-            capture->vtable->close )
-            capture->vtable->close( capture );
-        cvFree( pcapture );
+        delete *pcapture;
+        *pcapture = 0;
     }
 }
 
 CV_IMPL IplImage* cvQueryFrame( CvCapture* capture )
 {
-    if( capture && capture->vtable &&
-        capture->vtable->count >= CV_CAPTURE_BASE_API_COUNT &&
-        capture->vtable->grab_frame && capture->vtable->retrieve_frame &&
-        capture->vtable->grab_frame( capture ))
-        return capture->vtable->retrieve_frame( capture );
-    return 0;
+    return capture ? capture->queryFrame() : 0;
 }
 
+
 CV_IMPL int cvGrabFrame( CvCapture* capture )
 {
-    if( capture && capture->vtable &&
-        capture->vtable->count >= CV_CAPTURE_BASE_API_COUNT &&
-        capture->vtable->grab_frame )
-        return capture->vtable->grab_frame( capture );
-    return 0;
-} 
+    return capture ? capture->grabFrame() : 0;
+}
 
 CV_IMPL IplImage* cvRetrieveFrame( CvCapture* capture )
 {
-    if( capture && capture->vtable &&
-        capture->vtable->count >= CV_CAPTURE_BASE_API_COUNT &&
-        capture->vtable->retrieve_frame )
-        return capture->vtable->retrieve_frame( capture );
-    return 0;
-}                                       
+    return capture ? capture->retrieveFrame() : 0;
+}
 
 CV_IMPL double cvGetCaptureProperty( CvCapture* capture, int id )
 {
-    if( capture && capture->vtable &&
-        capture->vtable->count >= CV_CAPTURE_BASE_API_COUNT &&
-        capture->vtable->get_property )
-        return capture->vtable->get_property( capture, id );
-    return 0;
+    return capture ? capture->getProperty(id) : 0;
 }
 
 CV_IMPL int cvSetCaptureProperty( CvCapture* capture, int id, double value )
 {
-    if( capture && capture->vtable &&
-        capture->vtable->count >= CV_CAPTURE_BASE_API_COUNT &&
-        capture->vtable->set_property )
-        return capture->vtable->set_property( capture, id, value );
-    return 0;
+    return capture ? capture->setProperty(id, value) : 0;
 }
 
 
@@ -118,136 +94,204 @@ CV_IMPL int cvSetCaptureProperty( CvCapture* capture, int id, double value )
  * API that can access a given camera index.
  * Add multiples of 100 to select an API.
  */
-CV_IMPL CvCapture * cvCaptureFromCAM (int index)
+CV_IMPL CvCapture * cvCreateCameraCapture (int index)
 {
-    int  domains[] = 
+       int  domains[] =
        {
-               CV_CAP_IEEE1394,   // identical to CV_CAP_DC1394 
-               CV_CAP_STEREO, 
+               CV_CAP_IEEE1394,   // identical to CV_CAP_DC1394
+               CV_CAP_STEREO,
                CV_CAP_VFW,        // identical to CV_CAP_V4L
-               CV_CAP_MIL, 
+               CV_CAP_MIL,
                CV_CAP_QT,
-               -1 
+               CV_CAP_UNICAP,
+               -1
        };
-       
 
-    // interpret preferred interface (0 = autodetect)
-    int pref = (index / 100) * 100;
-    if (pref) 
+
+       // interpret preferred interface (0 = autodetect)
+       int pref = (index / 100) * 100;
+       if (pref)
        {
                domains[0]=pref;
                index %= 100;
                domains[1]=-1;
-    }
+       }
 
-    // try every possibly installed camera API
-    for (int i = 0; domains[i] >= 0; i++) 
+       // try every possibly installed camera API
+       for (int i = 0; domains[i] >= 0; i++)
        {
-
                // local variable to memorize the captured device
                CvCapture *capture;
 
-               switch (domains[i]) 
+               switch (domains[i])
                {
                #ifdef HAVE_TYZX
                case CV_CAP_STEREO:
-                       capture = cvCaptureFromCAM_TYZX (index);
+                       capture = cvCreateCameraCapture_TYZX (index);
                        if (capture)
                                return capture;
+                       break;
                #endif
 
-               #if   defined (HAVE_VFW)
                case CV_CAP_VFW:
-                       capture = cvCaptureFromCAM_VFW (index);
-                       if (capture) 
+               #ifdef HAVE_VFW
+                       capture = cvCreateCameraCapture_VFW (index);
+                       if (capture)
+                               return capture;
+               #endif
+               #if defined (HAVE_CAMV4L) || defined (HAVE_CAMV4L2)
+                       capture = cvCreateCameraCapture_V4L (index);
+                       if (capture)
+                               return capture;
+               #endif
+               #ifdef HAVE_GSTREAMER
+                       capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2, 0);
+                       if (capture)
                                return capture;
-               #elif defined (HAVE_CAMV4L) || defined (HAVE_CAMV4L2)
-               case CV_CAP_V4L:
-                       capture = cvCaptureFromCAM_V4L (index);
-                       if (capture) 
+                       capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L, 0);
+                       if (capture)
                                return capture;
                #endif
+                       break;
 
-               #if   defined (HAVE_DC1394)
-               case CV_CAP_DC1394:
-                       capture = cvCaptureFromCAM_DC1394 (index);
+               case CV_CAP_FIREWIRE:
+               #ifdef HAVE_DC1394
+                       capture = cvCreateCameraCapture_DC1394 (index);
+                       if (capture)
+                               return capture;
+               #endif
+               #ifdef HAVE_CMU1394
+                       capture = cvCreateCameraCapture_CMU (index);
                        if (capture)
                                return capture;
-               #elif defined (HAVE_CMU1394)        
-                       case CV_CAP_IEEE1394:
-                       capture = cvCaptureFromCAM_CMU (index);
+               #endif
+               #ifdef HAVE_GSTREAMER
+                       capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_1394, 0);
                        if (capture)
                                return capture;
                #endif
+                       break;
 
                #ifdef HAVE_MIL
                case CV_CAP_MIL:
-                       capture = cvCaptureFromCAM_MIL (index);
-                       if (capture) 
+                       capture = cvCreateCameraCapture_MIL (index);
+                       if (capture)
                                return capture;
+                       break;
                #endif
-               
+
                #ifdef HAVE_QUICKTIME
                case CV_CAP_QT:
-                       capture = cvCaptureFromCAM_QT (index);
+                       capture = cvCreateCameraCapture_QT (index);
                        if (capture)
                                return capture;
+                       break;
                #endif
-        }
-    }
+                       
+               #ifdef HAVE_UNICAP
+               case CV_CAP_UNICAP:
+                 capture = cvCreateCameraCapture_Unicap (index);
+                 if (capture)
+                   return capture;
+                 break;
+               #endif
+
+               }
+       }
 
        // failed open a camera
-    return 0;
+       return 0;
 }
 
 /**
  * Videoreader dispatching method: it tries to find the first
  * API that can access a given filename.
  */
-CV_IMPL CvCapture * cvCaptureFromFile (const char * filename)
+CV_IMPL CvCapture * cvCreateFileCapture (const char * filename)
 {
     CvCapture * result = 0;
-    
+
+    if (! result)
+        result = cvCreateFileCapture_Images (filename);
+
     #ifdef WIN32
     if (! result)
-        result = cvCaptureFromFile_Win32 (filename);
+        result = cvCreateFileCapture_Win32 (filename);
     #endif
-    
+
     #ifdef HAVE_XINE
     if (! result)
-        result = cvCaptureFromFile_XINE (filename);
+        result = cvCreateFileCapture_XINE (filename);
+    #endif
+
+    #ifdef HAVE_GSTREAMER
+    if (! result)
+        result = cvCreateCapture_GStreamer (CV_CAP_GSTREAMER_FILE, filename);
     #endif
-    
+
     #ifdef HAVE_FFMPEG
     if (! result)
-        result = cvCaptureFromFile_FFMPEG (filename);
+        result = cvCreateFileCapture_FFMPEG (filename);
     #endif
-    
+
     #ifdef HAVE_QUICKTIME
     if (! result)
-        result = cvCaptureFromFile_QT (filename);
+        result = cvCreateFileCapture_QT (filename);
     #endif
 
     return result;
 }
 
-#if !defined WIN32 && !defined HAVE_FFMPEG && !defined HAVE_VFW && !defined HAVE_QUICKTIME
-
-// quick fix for rc1
-
+/**
+ * Videowriter dispatching method: it tries to find the first
+ * API that can write a given stream.
+ */
 CV_IMPL CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc,
                                             double fps, CvSize frameSize, int is_color )
 {
-    return 0;
+       CV_FUNCNAME( "cvCreateVideoWriter" );
+
+       CvVideoWriter *result = 0;
+
+       if(!fourcc || !fps)
+               result = cvCreateVideoWriter_Images(filename);
+
+       #ifdef WIN32
+       if(!result)
+               result = cvCreateVideoWriter_Win32(filename, fourcc, fps, frameSize, is_color);
+       #endif
+
+/*     #ifdef HAVE_XINE
+       if(!result)
+               result = cvCreateVideoWriter_XINE(filename, fourcc, fps, frameSize, is_color);
+       #endif
+*/
+       #ifdef HAVE_FFMPEG
+       if(!result)
+               result = cvCreateVideoWriter_FFMPEG(filename, fourcc, fps, frameSize, is_color);
+       #endif
+
+       #ifdef HAVE_QUICKTIME
+       if(!result)
+               result = cvCreateVideoWriter_QT(filename, fourcc, fps, frameSize, is_color);
+       #endif
+
+       if(!result)
+               result = cvCreateVideoWriter_Images(filename);
+
+       return result;
 }
 
-CV_IMPL int cvWriteFrame( CvVideoWriter* _writer, const IplImage* image )
+CV_IMPL int cvWriteFrame( CvVideoWriter* writer, const IplImage* image )
 {
-  return 0;
+    return writer ? writer->writeFrame(image) : 0;
 }
 
-CV_IMPL void cvReleaseVideoWriter( CvVideoWriter** writer )
+CV_IMPL void cvReleaseVideoWriter( CvVideoWriter** pwriter )
 {
+    if( pwriter && *pwriter )
+    {
+        delete *pwriter;
+        *pwriter = 0;
+    }
 }
-
-#endif