From 9a3e53e7386b7a94976d216dae41ddb48600db3d Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Sun, 16 Aug 2015 21:01:22 +0300 Subject: [PATCH] repaired GStreamer 0.10 version (cherry picked from commit c19ed39a785d7ac9e39c117cfacc3827024619f7) --- cmake/OpenCVFindLibsVideo.cmake | 6 +++--- modules/highgui/src/cap_gstreamer.cpp | 30 +++++++++++++++++------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/cmake/OpenCVFindLibsVideo.cmake b/cmake/OpenCVFindLibsVideo.cmake index 1654df7..514aa5c 100644 --- a/cmake/OpenCVFindLibsVideo.cmake +++ b/cmake/OpenCVFindLibsVideo.cmake @@ -12,8 +12,8 @@ endif(WITH_VFW) # --- GStreamer --- ocv_clear_vars(HAVE_GSTREAMER) -# try to find gstreamer 1.x first -if(WITH_GSTREAMER) +# try to find gstreamer 1.x first if 0.10 was not requested +if(WITH_GSTREAMER AND NOT WITH_GSTREAMER_0_10) CHECK_MODULE(gstreamer-base-1.0 HAVE_GSTREAMER_BASE) CHECK_MODULE(gstreamer-video-1.0 HAVE_GSTREAMER_VIDEO) CHECK_MODULE(gstreamer-app-1.0 HAVE_GSTREAMER_APP) @@ -29,7 +29,7 @@ if(WITH_GSTREAMER) set(GSTREAMER_PBUTILS_VERSION ${ALIASOF_gstreamer-pbutils-1.0_VERSION}) endif() -endif(WITH_GSTREAMER) +endif() # gstreamer support was requested but could not find gstreamer 1.x, # so fallback/try to find gstreamer 0.10 diff --git a/modules/highgui/src/cap_gstreamer.cpp b/modules/highgui/src/cap_gstreamer.cpp index fe4eaf2..957587c 100644 --- a/modules/highgui/src/cap_gstreamer.cpp +++ b/modules/highgui/src/cap_gstreamer.cpp @@ -75,10 +75,13 @@ #if GST_VERSION_MAJOR == 0 #define COLOR_ELEM "ffmpegcolorspace" +#define COLOR_ELEM_NAME "ffmpegcsp" #elif FULL_GST_VERSION < VERSION_NUM(1,5,0) #define COLOR_ELEM "videoconvert" +#define COLOR_ELEM_NAME COLOR_ELEM #else #define COLOR_ELEM "autovideoconvert" +#define COLOR_ELEM_NAME COLOR_ELEM #endif void toFraction(double decimal, double &numerator, double &denominator); @@ -677,28 +680,27 @@ bool CvCapture_GStreamer::open( int type, const char* filename ) 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) - { - CV_ERROR(CV_StsError, "GStreamer: cannot find appsink in manual pipeline\n"); - return false; - } -#else - it = gst_bin_iterate_elements(GST_BIN(uridecodebin)); + GstIterator *it = gst_bin_iterate_elements(GST_BIN(uridecodebin)); - gboolean done = false; GstElement *element = NULL; + gboolean done = false; gchar* name = NULL; +#if GST_VERSION_MAJOR > 0 GValue value = G_VALUE_INIT; +#endif while (!done) { +#if GST_VERSION_MAJOR > 0 switch (gst_iterator_next (it, &value)) { case GST_ITERATOR_OK: element = GST_ELEMENT (g_value_get_object (&value)); +#else + switch (gst_iterator_next (it, (gpointer *)&element)) + { + case GST_ITERATOR_OK: +#endif name = gst_element_get_name(element); if (name) { @@ -707,14 +709,16 @@ bool CvCapture_GStreamer::open( int type, const char* filename ) sink = GST_ELEMENT ( gst_object_ref (element) ); done = sink && color; } - else if (strstr(name, COLOR_ELEM) != NULL) + else if (strstr(name, COLOR_ELEM_NAME) != NULL) { color = GST_ELEMENT ( gst_object_ref (element) ); done = sink && color; } g_free(name); } +#if GST_VERSION_MAJOR > 0 g_value_unset (&value); +#endif break; case GST_ITERATOR_RESYNC: @@ -733,7 +737,7 @@ bool CvCapture_GStreamer::open( int type, const char* filename ) CV_ERROR(CV_StsError, "GStreamer: cannot find appsink in manual pipeline\n"); return false; } -#endif + pipeline = uridecodebin; } else -- 2.7.4