[opencv] 05/19: repaired gstreamer camera capture:

Mattia Rizzolo mattia at debian.org
Tue Oct 4 17:51:09 UTC 2016


This is an automated email from the git hooks/post-receive script.

mattia pushed a commit to annotated tag 2.4.12.3
in repository opencv.

commit 2243bfa181dec54bf6cecca4f99a94296f807127
Author: Ilya Lavrenov <ilya.lavrenov at itseez.com>
Date:   Sat Aug 15 18:30:08 2015 +0300

    repaired gstreamer camera capture:
    
    1. Enabled property retrieval: height, width, FPS
    2. Fixed issue when isOpened returns always true even for non-existing devices
    3. Ability to work with non-0 device. Camera capture index is taken into account
    
    (cherry picked from commit dbd7912b88e36a045d1086d54f77467de5ab006f)
---
 modules/highgui/src/cap.cpp           |   6 +-
 modules/highgui/src/cap_gstreamer.cpp | 130 +++++++++++++++++++++-------------
 2 files changed, 83 insertions(+), 53 deletions(-)

diff --git a/modules/highgui/src/cap.cpp b/modules/highgui/src/cap.cpp
index 491e388..5c17848 100644
--- a/modules/highgui/src/cap.cpp
+++ b/modules/highgui/src/cap.cpp
@@ -238,10 +238,12 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index)
 #endif
 
 #ifdef HAVE_GSTREAMER
-            capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2, 0);
+            capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2,
+                                                reinterpret_cast<char *>(index));
             if (capture)
                 return capture;
-            capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L, 0);
+            capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L,
+                                                reinterpret_cast<char *>(index));
             if (capture)
                 return capture;
 #endif
diff --git a/modules/highgui/src/cap_gstreamer.cpp b/modules/highgui/src/cap_gstreamer.cpp
index cae7199..fe4eaf2 100644
--- a/modules/highgui/src/cap_gstreamer.cpp
+++ b/modules/highgui/src/cap_gstreamer.cpp
@@ -371,9 +371,7 @@ void CvCapture_GStreamer::startPipeline()
     if (status == GST_STATE_CHANGE_ASYNC)
     {
         // wait for status update
-        GstState st1;
-        GstState st2;
-        status = gst_element_get_state(pipeline, &st1, &st2, GST_CLOCK_TIME_NONE);
+        status = gst_element_get_state(pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
     }
     if (status == GST_STATE_CHANGE_FAILURE)
     {
@@ -568,21 +566,39 @@ bool CvCapture_GStreamer::open( int type, const char* filename )
     GstElementFactory * testfac;
     GstStateChangeReturn status;
 
-    if (type == CV_CAP_GSTREAMER_V4L){
+    int cameraID = -1;
+    if (type == CV_CAP_GSTREAMER_V4L ||
+            type == CV_CAP_GSTREAMER_V4L2)
+    {
+        cameraID = static_cast<int>(reinterpret_cast<intptr_t>(filename));
+    }
+
+    std::stringstream stdstream;
+    std::string stdfilename;
+
+    if (type == CV_CAP_GSTREAMER_V4L)
+    {
         testfac = gst_element_factory_find("v4lsrc");
         if (!testfac){
             return false;
         }
         g_object_unref(G_OBJECT(testfac));
-        filename = "v4lsrc ! "COLOR_ELEM" ! appsink";
+
+        stdstream << "v4lsrc device=/dev/video" << cameraID << " ! " << COLOR_ELEM << " ! appsink";
+        stdfilename = stdstream.str();
+        filename = stdfilename.c_str();
     }
-    if (type == CV_CAP_GSTREAMER_V4L2){
+    else if (type == CV_CAP_GSTREAMER_V4L2)
+    {
         testfac = gst_element_factory_find("v4l2src");
         if (!testfac){
             return false;
         }
         g_object_unref(G_OBJECT(testfac));
-        filename = "v4l2src ! "COLOR_ELEM" ! appsink";
+
+        stdstream << "v4l2src device=/dev/video" << cameraID << " ! " << COLOR_ELEM << " ! appsink";
+        stdfilename = stdstream.str();
+        filename = stdfilename.c_str();
     }
 
 
@@ -620,7 +636,9 @@ bool CvCapture_GStreamer::open( int type, const char* filename )
             stream = true;
             manualpipeline = true;
         }
-    } else {
+    }
+    else
+    {
         stream = true;
         uri = g_strdup(filename);
     }
@@ -641,64 +659,77 @@ bool CvCapture_GStreamer::open( int type, const char* filename )
             uridecodebin = gst_element_make_from_uri(GST_URI_SRC, uri, "src", NULL);
 #endif
             element_from_uri = true;
-        }else{
+        }
+        else
+        {
             uridecodebin = gst_element_factory_make("uridecodebin", NULL);
             g_object_set(G_OBJECT(uridecodebin), "uri", uri, NULL);
         }
         g_free(protocol);
 
-        if(!uridecodebin) {
+        if(!uridecodebin)
+        {
             //fprintf(stderr, "GStreamer: Error opening bin: %s\n", err->message);
             close();
             return false;
         }
     }
 
-    if(manualpipeline)
+    if (manualpipeline)
     {
         GstIterator *it = NULL;
 #if GST_VERSION_MAJOR == 0
         it = gst_bin_iterate_sinks(GST_BIN(uridecodebin));
-        if(gst_iterator_next(it, (gpointer *)&sink) != GST_ITERATOR_OK) {
+        if (gst_iterator_next(it, (gpointer *)&sink) != GST_ITERATOR_OK)
+        {
             CV_ERROR(CV_StsError, "GStreamer: cannot find appsink in manual pipeline\n");
             return false;
         }
 #else
-        it = gst_bin_iterate_sinks (GST_BIN(uridecodebin));
+        it = gst_bin_iterate_elements(GST_BIN(uridecodebin));
 
-        gboolean done = FALSE;
+        gboolean done = false;
         GstElement *element = NULL;
         gchar* name = NULL;
         GValue value = G_VALUE_INIT;
 
-        while (!done) {
-          switch (gst_iterator_next (it, &value)) {
+        while (!done)
+        {
+            switch (gst_iterator_next (it, &value))
+            {
             case GST_ITERATOR_OK:
-              element = GST_ELEMENT (g_value_get_object (&value));
-              name = gst_element_get_name(element);
-              if (name){
-                if(strstr(name, "opencvsink") != NULL || strstr(name, "appsink") != NULL) {
-                  sink = GST_ELEMENT ( gst_object_ref (element) );
-                  done = TRUE;
+                element = GST_ELEMENT (g_value_get_object (&value));
+                name = gst_element_get_name(element);
+                if (name)
+                {
+                    if (strstr(name, "opencvsink") != NULL || strstr(name, "appsink") != NULL)
+                    {
+                        sink = GST_ELEMENT ( gst_object_ref (element) );
+                        done = sink && color;
+                    }
+                    else if (strstr(name, COLOR_ELEM) != NULL)
+                    {
+                        color = GST_ELEMENT ( gst_object_ref (element) );
+                        done = sink && color;
+                    }
+                    g_free(name);
                 }
-                g_free(name);
-              }
-              g_value_unset (&value);
+                g_value_unset (&value);
 
-              break;
+                break;
             case GST_ITERATOR_RESYNC:
-              gst_iterator_resync (it);
-              break;
+                gst_iterator_resync (it);
+                break;
             case GST_ITERATOR_ERROR:
             case GST_ITERATOR_DONE:
-              done = TRUE;
-              break;
-          }
+                done = TRUE;
+                break;
+            }
         }
         gst_iterator_free (it);
 
-
-        if (!sink){
+        if (!sink)
+        {
             CV_ERROR(CV_StsError, "GStreamer: cannot find appsink in manual pipeline\n");
             return false;
         }
@@ -715,18 +746,23 @@ bool CvCapture_GStreamer::open( int type, const char* filename )
 
         gst_bin_add_many(GST_BIN(pipeline), uridecodebin, color, sink, NULL);
 
-        if(element_from_uri) {
-            if(!gst_element_link(uridecodebin, color)) {
+        if(element_from_uri)
+        {
+            if(!gst_element_link(uridecodebin, color))
+            {
                 CV_ERROR(CV_StsError, "GStreamer: cannot link color -> sink\n");
                 gst_object_unref(pipeline);
                 pipeline = NULL;
                 return false;
             }
-        }else{
+        }
+        else
+        {
             g_signal_connect(uridecodebin, "pad-added", G_CALLBACK(newPad), color);
         }
 
-        if(!gst_element_link(color, sink)) {
+        if(!gst_element_link(color, sink))
+        {
             CV_ERROR(CV_StsError, "GStreamer: cannot link color -> sink\n");
             gst_object_unref(pipeline);
             pipeline = NULL;
@@ -754,16 +790,13 @@ bool CvCapture_GStreamer::open( int type, const char* filename )
     gst_app_sink_set_caps(GST_APP_SINK(sink), caps);
     gst_caps_unref(caps);
 
-    // For video files only: set pipeline to PAUSED state to get its duration
-    if (file)
     {
-        status = gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PAUSED);
+        status = gst_element_set_state(GST_ELEMENT(pipeline),
+                                       file ? GST_STATE_PAUSED : GST_STATE_PLAYING);
         if (status == GST_STATE_CHANGE_ASYNC)
         {
             // wait for status update
-            GstState st1;
-            GstState st2;
-            status = gst_element_get_state(pipeline, &st1, &st2, GST_CLOCK_TIME_NONE);
+            status = gst_element_get_state(pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
         }
         if (status == GST_STATE_CHANGE_FAILURE)
         {
@@ -814,14 +847,9 @@ bool CvCapture_GStreamer::open( int type, const char* filename )
 
         fps = (double)num/(double)denom;
 
-         // GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "pipeline");
-    }
-    else
-    {
-        duration = -1;
-        width = -1;
-        height = -1;
-        fps = -1;
+         // GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "pipeline")
+
+        stopPipeline();
     }
 
     __END__;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/opencv.git



More information about the debian-science-commits mailing list