Add support of plugins management (in *.ini file) Add dubug parameters for GStreamer... 99/60699/1
authorAndrey Shelest <a.shelest@samsung.com>
Tue, 1 Mar 2016 14:16:33 +0000 (16:16 +0200)
committerAndrey Shelest <a.shelest@samsung.com>
Tue, 1 Mar 2016 14:16:33 +0000 (16:16 +0200)
Change-Id: I95dffcc6ae5f8297a88a94f4cf8d79a475254cc4
Signed-off-by: Andrey Shelest <a.shelest@samsung.com>
include/media_streamer_util.h
src/media_streamer_gst.c
src/media_streamer_priv.c
src/media_streamer_util.c

index a1d79e2e3b952df40b84a8bb05dfa3f03a69d667..4e886e25a03aa2c3af99eb59826bea66c6220b80 100644 (file)
@@ -108,6 +108,8 @@ typedef struct __media_streamer_ini {
        /* general */
        gboolean generate_dot;
        gboolean use_decodebin;
+       gchar **exclude_elem_names;
+       gchar **gst_args;
 
 } media_streamer_ini_t;
 
index 017ca8864484cacd7423a31ee819d68827fe885a..cf92806af8f675cd17f81184d27427547465f736 100755 (executable)
@@ -674,6 +674,9 @@ static gint __decodebin_autoplug_select_cb(GstElement * bin, GstPad * pad, GstCa
                GST_AUTOPLUG_SELECT_SKIP
        } GstAutoplugSelectResult;
 
+       media_streamer_s *ms_streamer = (media_streamer_s *) data;
+       ms_retvm_if(!ms_streamer, GST_AUTOPLUG_SELECT_TRY, "Handle is NULL");
+
        gchar *factory_name = NULL;
        const gchar *klass = NULL;
 
@@ -682,25 +685,17 @@ static gint __decodebin_autoplug_select_cb(GstElement * bin, GstPad * pad, GstCa
 
        ms_debug("Decodebin: found new element [%s] to link [%s]", factory_name, klass);
 
-       if ((g_strrstr(klass, "Codec/Decoder/Video"))) {
-
-               /* Skip Video4Linux decoders */
-               if (g_strrstr(factory_name, "v4l2video")) {
-                       ms_debug("Decodebin: skipping [%s] as not required", factory_name);
-                       return GST_AUTOPLUG_SELECT_SKIP;
-               }
+       if (ms_streamer->ini.exclude_elem_names) {
+               /* Search if such plugin must be excluded */
 
-               /* Skip OMX HW decoders */
-               if (g_strrstr(factory_name, "omx")) {
-                       ms_debug("Decodebin: skipping [%s] as disabled", factory_name);
-                       return GST_AUTOPLUG_SELECT_SKIP;
+               int index = 0;
+               for ( ; ms_streamer->ini.exclude_elem_names[index]; ++index) {
+                       if (g_strrstr(factory_name, ms_streamer->ini.exclude_elem_names[index])) {
+                               ms_debug("Decodebin: skipping [%s] as excluded", factory_name);
+                               return GST_AUTOPLUG_SELECT_SKIP;
+                       }
                }
 
-               /* Skip SPRD HW decoders */
-               if (g_strrstr(factory_name, "sprd")) {
-                       ms_debug("Decodebin: skipping [%s] as disabled", factory_name);
-                       return GST_AUTOPLUG_SELECT_SKIP;
-               }
        }
 
        return GST_AUTOPLUG_SELECT_TRY;
@@ -858,7 +853,7 @@ GstElement *__ms_decodebin_create(media_streamer_s * ms_streamer)
        gst_element_sync_state_with_parent(decodebin);
 
        __ms_signal_create(&ms_streamer->autoplug_sig_list, decodebin, "pad-added", G_CALLBACK(__decodebin_newpad_cb), ms_streamer);
-       __ms_signal_create(&ms_streamer->autoplug_sig_list, decodebin, "autoplug-select", G_CALLBACK(__decodebin_autoplug_select_cb), NULL);
+       __ms_signal_create(&ms_streamer->autoplug_sig_list, decodebin, "autoplug-select", G_CALLBACK(__decodebin_autoplug_select_cb), ms_streamer);
        __ms_signal_create(&ms_streamer->autoplug_sig_list, decodebin, "no-more-pads", G_CALLBACK(__decodebin_nomore_pads_cb), ms_streamer);
 
        return decodebin;
@@ -1382,7 +1377,44 @@ int __ms_pipeline_create(media_streamer_s *ms_streamer)
        ms_retvm_if(ms_streamer == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
        GError *err = NULL;
-       if (!gst_init_check(NULL, NULL, &err)) {
+       int ret = MEDIA_STREAMER_ERROR_NONE;
+
+       int *argc = (int *)malloc(sizeof(int));
+       char **argv = NULL;
+       if (argc) {
+               *argc = 1;
+               if (ms_streamer->ini.gst_args)
+                       (*argc) += g_strv_length(ms_streamer->ini.gst_args);
+
+               argv = (char **)calloc(*argc, sizeof(char*));
+               if (argv) {
+                       argv[0] = g_strdup("MediaStreamer");
+
+                       if (ms_streamer->ini.gst_args) {
+                               int i = 0;
+                               for ( ; ms_streamer->ini.gst_args[i]; ++i) {
+                                       argv[i+1] = ms_streamer->ini.gst_args[i];
+                                       ms_debug("Add [%s] gstreamer parameter.", argv[i+1]);
+                               }
+                       }
+
+               } else {
+                       MS_SAFE_FREE(argc);
+                       ms_error("Error allocation memory");
+               }
+       } else {
+               ms_error("Error allocation memory");
+       }
+
+       gboolean gst_ret = gst_init_check(argc, &argv, &err);
+       /* Clean memory of gstreamer arguments*/
+       g_strfreev(ms_streamer->ini.gst_args);
+       ms_streamer->ini.gst_args = NULL;
+       MS_SAFE_FREE(argv[0]);
+       MS_SAFE_FREE(argv);
+       MS_SAFE_FREE(argc);
+
+       if (!gst_ret) {
                ms_error("Error: Failed to initialize GStreamer [%s].", err->message);
                g_clear_error(&err);
                return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
@@ -1408,7 +1440,7 @@ int __ms_pipeline_create(media_streamer_s *ms_streamer)
        gst_bin_add_many(GST_BIN(ms_streamer->pipeline), ms_streamer->src_bin, ms_streamer->sink_bin, ms_streamer->topology_bin, NULL);
        ms_info("Media streamer pipeline created successfully.");
 
-       return MEDIA_STREAMER_ERROR_NONE;
+       return ret;
 }
 
 static GstCaps *__ms_create_caps_from_fmt(media_format_h fmt)
index e5eb26cc1c0978c4cbbaa6dfaaa56b5d13eb0dc9..a41a571607a69cdd87ecd4378be49c237a7df875 100644 (file)
@@ -153,6 +153,10 @@ int __ms_streamer_destroy(media_streamer_s *ms_streamer)
        MS_SAFE_UNREF(ms_streamer->bus);
        MS_SAFE_UNREF(ms_streamer->pipeline);
 
+       /* Clean up exclude elements list */
+       if (ms_streamer->ini.exclude_elem_names)
+               g_strfreev(ms_streamer->ini.exclude_elem_names);
+
        g_mutex_unlock(&ms_streamer->mutex_lock);
        g_mutex_clear(&ms_streamer->mutex_lock);
        MS_SAFE_FREE(ms_streamer);
index 81394d015b55c11b32116335c4483ae2d3d620f8..98cab1da9736624c469ec7251d2e221bebf395d2 100644 (file)
@@ -73,6 +73,21 @@ gboolean __ms_destroy_ini_dictionary(dictionary *dict)
        return TRUE;
 }
 
+static void __ms_ini_read_list(dictionary *dict, const char* key, gchar ***list)
+{
+       ms_retm_if(!dict || !list || !key, "Handle is NULL");
+
+       /* Read exclude elements list */
+       gchar *str = iniparser_getstring(dict, key, NULL);
+       if (str && strlen(str) > 0) {
+               gchar *strtmp = g_strdup(str);
+               g_strstrip(strtmp);
+
+               *list = g_strsplit(strtmp, ",", 10);
+               MS_SAFE_FREE(strtmp);
+       }
+}
+
 void __ms_load_ini_settings(media_streamer_ini_t *ini)
 {
        dictionary *dict = NULL;
@@ -90,6 +105,12 @@ void __ms_load_ini_settings(media_streamer_ini_t *ini)
                }
 
                ini->use_decodebin = iniparser_getboolean(dict, "general:use decodebin", DEFAULT_USE_DECODEBIN);
+
+               /* Read exclude elements list */
+               __ms_ini_read_list(dict, "general:exclude elements", &ini->exclude_elem_names);
+               /* Read gstreamer arguments list */
+               __ms_ini_read_list(dict, "general:gstreamer arguments", &ini->gst_args);
+
        } else {
                /* if dict is not available just fill the structure with default values */
                ini->generate_dot = DEFAULT_GENERATE_DOT;