gstreamer/tools/listcomponents.c

169 lines
4.6 KiB
C

/*
* 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_suffix (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;
}