2012-12-19 11:08:35 +00:00
|
|
|
/*
|
|
|
|
* 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 */
|
2012-12-19 11:19:12 +00:00
|
|
|
if (g_str_has_suffix (filename, "vc/lib/libopenmaxil.so")) {
|
2012-12-19 11:08:35 +00:00
|
|
|
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;
|
|
|
|
}
|