added some property setting and getting
authorIlya Lavrenov <ilya.lavrenov@itseez.com>
Sun, 16 Aug 2015 18:25:36 +0000 (21:25 +0300)
committerIlya Lavrenov <ilya.lavrenov@itseez.com>
Sun, 16 Aug 2015 18:25:36 +0000 (21:25 +0300)
modules/highgui/src/cap_gstreamer.cpp

index 957587c..cab652d 100644 (file)
@@ -145,6 +145,7 @@ protected:
                        gpointer    data);
     GstElement*   pipeline;
     GstElement*   uridecodebin;
+    GstElement*   v4l2src;
     GstElement*   color;
     GstElement*   sink;
 #if GST_VERSION_MAJOR > 0
@@ -168,6 +169,7 @@ void CvCapture_GStreamer::init()
 {
     pipeline = NULL;
     uridecodebin = NULL;
+    v4l2src = NULL;
     color = NULL;
     sink = NULL;
 #if GST_VERSION_MAJOR > 0
@@ -707,14 +709,18 @@ bool CvCapture_GStreamer::open( int type, const char* filename )
                     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_NAME) != NULL)
                     {
                         color = GST_ELEMENT ( gst_object_ref (element) );
-                        done = sink && color;
+                    }
+                    else if (strstr(name, "v4l") != NULL)
+                    {
+                        v4l2src = GST_ELEMENT ( gst_object_ref (element) );
                     }
                     g_free(name);
+
+                    done = sink && color && v4l2src;
                 }
 #if GST_VERSION_MAJOR > 0
                 g_value_unset (&value);
@@ -884,7 +890,7 @@ double CvCapture_GStreamer::getProperty( int propId )
 
     if(!pipeline) {
         CV_WARN("GStreamer: no pipeline");
-        return false;
+        return 0;
     }
 
     switch(propId) {
@@ -893,7 +899,7 @@ double CvCapture_GStreamer::getProperty( int propId )
         status = gst_element_query_position(sink, FORMAT, &value);
         if(!status) {
             CV_WARN("GStreamer: unable to query position of stream");
-            return false;
+            return 0;
         }
         return value * 1e-6; // nano seconds to milli seconds
     case CV_CAP_PROP_POS_FRAMES:
@@ -901,7 +907,7 @@ double CvCapture_GStreamer::getProperty( int propId )
         status = gst_element_query_position(sink, FORMAT, &value);
         if(!status) {
             CV_WARN("GStreamer: unable to query position of stream");
-            return false;
+            return 0;
         }
         return value;
     case CV_CAP_PROP_POS_AVI_RATIO:
@@ -909,7 +915,7 @@ double CvCapture_GStreamer::getProperty( int propId )
         status = gst_element_query_position(sink, FORMAT, &value);
         if(!status) {
             CV_WARN("GStreamer: unable to query position of stream");
-            return false;
+            return 0;
         }
         return ((double) value) / GST_FORMAT_PERCENT_MAX;
     case CV_CAP_PROP_FRAME_WIDTH:
@@ -928,6 +934,21 @@ double CvCapture_GStreamer::getProperty( int propId )
     case CV_CAP_PROP_CONTRAST:
     case CV_CAP_PROP_SATURATION:
     case CV_CAP_PROP_HUE:
+        if (v4l2src)
+        {
+            const gchar * propName =
+                    propId == CV_CAP_PROP_BRIGHTNESS ? "brightness" :
+                    propId == CV_CAP_PROP_CONTRAST ? "contrast" :
+                    propId == CV_CAP_PROP_SATURATION ? "saturation" :
+                    propId == CV_CAP_PROP_HUE ? "hue" : NULL;
+
+            if (propName)
+            {
+                gint32 value32 = 0;
+                g_object_get(G_OBJECT(v4l2src), propName, &value32, NULL);
+                return value32;
+            }
+        }
     case CV_CAP_PROP_GAIN:
     case CV_CAP_PROP_CONVERT_RGB:
         break;
@@ -944,7 +965,7 @@ double CvCapture_GStreamer::getProperty( int propId )
 
 #undef FORMAT
 
-    return false;
+    return 0;
 }
 
 /*!
@@ -1023,6 +1044,21 @@ bool CvCapture_GStreamer::setProperty( int propId, double value )
     case CV_CAP_PROP_CONTRAST:
     case CV_CAP_PROP_SATURATION:
     case CV_CAP_PROP_HUE:
+        if (v4l2src)
+        {
+            const gchar * propName =
+                    propId == CV_CAP_PROP_BRIGHTNESS ? "brightness" :
+                    propId == CV_CAP_PROP_CONTRAST ? "contrast" :
+                    propId == CV_CAP_PROP_SATURATION ? "saturation" :
+                    propId == CV_CAP_PROP_HUE ? "hue" : NULL;
+
+            if (propName)
+            {
+                gint32 value32 = cv::saturate_cast<gint32>(value);
+                g_object_set(G_OBJECT(v4l2src), propName, &value32, NULL);
+                return true;
+            }
+        }
     case CV_CAP_PROP_GAIN:
     case CV_CAP_PROP_CONVERT_RGB:
         break;