summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2012-12-19 12:08:35 +0100
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-12-19 12:08:35 +0100
commit7ab0910cc3d64551483c1e82c7718a735f9cdad3 (patch)
tree87acbb23358ff7e81c5b89b290701357088d210e /tools
parent5105daba1aee53278c3435f457f64036450bf4ee (diff)
downloadgst-omx-7ab0910cc3d64551483c1e82c7718a735f9cdad3.tar.gz
tools: Add tool to list all components and their roles
Diffstat (limited to 'tools')
-rw-r--r--tools/Makefile.am6
-rw-r--r--tools/listcomponents.c169
2 files changed, 175 insertions, 0 deletions
diff --git a/tools/Makefile.am b/tools/Makefile.am
new file mode 100644
index 0000000..8e85219
--- /dev/null
+++ b/tools/Makefile.am
@@ -0,0 +1,6 @@
+noinst_PROGRAMS = listcomponents
+
+listcomponents_SOURCES = listcomponents.c
+listcomponents_LDADD = $(GLIB_LIBS)
+listcomponents_CFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir)/omx/openmax $(GST_OPTION_CFLAGS)
+
diff --git a/tools/listcomponents.c b/tools/listcomponents.c
new file mode 100644
index 0000000..9a99c93
--- /dev/null
+++ b/tools/listcomponents.c
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2012 Collabora Ltd.
+ * Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <glib.h>
+#include <gmodule.h>
+
+#ifdef GST_OMX_STRUCT_PACKING
+# if GST_OMX_STRUCT_PACKING == 1
+# pragma pack(1)
+# elif GST_OMX_STRUCT_PACKING == 2
+# pragma pack(2)
+# elif GST_OMX_STRUCT_PACKING == 4
+# pragma pack(4)
+# elif GST_OMX_STRUCT_PACKING == 8
+# pragma pack(8)
+# else
+# error "Unsupported struct packing value"
+# endif
+#endif
+
+#include <OMX_Core.h>
+#include <OMX_Component.h>
+
+#ifdef GST_OMX_STRUCT_PACKING
+#pragma pack()
+#endif
+
+gint
+main (gint argc, gchar ** argv)
+{
+ gchar *filename;
+ GModule *core_module;
+ OMX_ERRORTYPE err;
+ OMX_ERRORTYPE (*omx_init) (void);
+ OMX_ERRORTYPE (*omx_component_name_enum) (OMX_STRING cComponentName,
+ OMX_U32 nNameLength, OMX_U32 nIndex);
+ OMX_ERRORTYPE (*omx_get_roles_of_component) (OMX_STRING compName,
+ OMX_U32 * pNumRoles, OMX_U8 ** roles);
+ guint32 i;
+
+ if (argc != 2) {
+ g_printerr ("Usage: %s /path/to/libopenmaxil.so\n", argv[0]);
+ return -1;
+ }
+
+ filename = argv[1];
+
+ if (!g_path_is_absolute (filename)) {
+ g_printerr ("'%s' is not an absolute filename\n", filename);
+ return -1;
+ }
+
+ /* Hack for the Broadcom OpenMAX IL implementation */
+ if (g_str_has_prefix (filename, "vc/lib/libopenmaxil.so")) {
+ gchar *bcm_host_filename;
+ gchar *bcm_host_path;
+ GModule *bcm_host_module;
+ void (*bcm_host_init) (void);
+
+ bcm_host_path = g_path_get_dirname (filename);
+ bcm_host_filename =
+ g_build_filename (bcm_host_path, "libbcm_host.so", NULL);
+
+ bcm_host_module = g_module_open (bcm_host_filename, G_MODULE_BIND_LAZY);
+
+ g_free (bcm_host_filename);
+ g_free (bcm_host_path);
+
+ if (!bcm_host_module) {
+ g_printerr ("Failed to load 'libbcm_host.so'\n");
+ return -1;
+ }
+
+ if (!g_module_symbol (bcm_host_module, "bcm_host_init",
+ (gpointer *) & bcm_host_init)) {
+ g_printerr ("Failed to find 'bcm_host_init' in 'libbcm_host.so'\n");
+ return -1;
+ }
+
+ bcm_host_init ();
+ }
+
+ core_module = g_module_open (filename, G_MODULE_BIND_LAZY);
+ if (!core_module) {
+ g_printerr ("Failed to load '%s'\n", filename);
+ return -1;
+ }
+
+ if (!g_module_symbol (core_module, "OMX_Init", (gpointer *) & omx_init)) {
+ g_printerr ("Failed to find '%s' in '%s'\n", "OMX_Init", filename);
+ return -1;
+ }
+
+ if (!g_module_symbol (core_module, "OMX_ComponentNameEnum",
+ (gpointer *) & omx_component_name_enum)) {
+ g_printerr ("Failed to find '%s' in '%s'\n", "OMX_ComponentNameEnum",
+ filename);
+ return -1;
+ }
+
+ if (!g_module_symbol (core_module, "OMX_GetRolesOfComponent",
+ (gpointer *) & omx_get_roles_of_component)) {
+ g_printerr ("Failed to find '%s' in '%s'\n", "OMX_GetRolesOfComponent",
+ filename);
+ return -1;
+ }
+
+
+ if ((err = omx_init ()) != OMX_ErrorNone) {
+ g_printerr ("Failed to initialize core: %d\n", err);
+ return -1;
+ }
+
+ i = 0;
+ while (err == OMX_ErrorNone) {
+ gchar component_name[1024];
+
+ err = omx_component_name_enum (component_name, sizeof (component_name), i);
+ if (err == OMX_ErrorNone || err == OMX_ErrorNoMore) {
+ guint32 nroles;
+
+ g_print ("Component %d: %s\n", i, component_name);
+
+ if (omx_get_roles_of_component (component_name, (OMX_U32 *) & nroles,
+ NULL) == OMX_ErrorNone && nroles > 0) {
+ gchar **roles = g_new (gchar *, nroles);
+ gint j;
+
+ roles[0] = g_new0 (gchar, 129 * nroles);
+ for (j = 1; j < nroles; j++) {
+ roles[j] = roles[j - 1] + 129;
+ }
+
+ if (omx_get_roles_of_component (component_name, (OMX_U32 *) & nroles,
+ (OMX_U8 **) roles) == OMX_ErrorNone) {
+ for (j = 0; j < nroles; j++) {
+ g_print (" Role %d: %s\n", j, roles[j]);
+ }
+ }
+ g_free (roles[0]);
+ g_free (roles);
+ }
+ }
+ i++;
+ }
+
+ return 0;
+}