summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/omx.c50
-rw-r--r--libavcodec/version.h2
2 files changed, 45 insertions, 7 deletions
diff --git a/libavcodec/omx.c b/libavcodec/omx.c
index 6a4a5a1de5..98277d9a98 100644
--- a/libavcodec/omx.c
+++ b/libavcodec/omx.c
@@ -19,6 +19,12 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include "config.h"
+
+#if CONFIG_OMX_RPI
+#define OMX_SKIP64BIT
+#endif
+
#include <dlfcn.h>
#include <OMX_Core.h>
#include <OMX_Component.h>
@@ -69,6 +75,7 @@ static int64_t from_omx_ticks(OMX_TICKS value)
typedef struct OMXContext {
void *lib;
+ void *lib2;
OMX_ERRORTYPE (*ptr_Init)(void);
OMX_ERRORTYPE (*ptr_Deinit)(void);
OMX_ERRORTYPE (*ptr_ComponentNameEnum)(OMX_STRING, OMX_U32, OMX_U32);
@@ -76,6 +83,7 @@ typedef struct OMXContext {
OMX_ERRORTYPE (*ptr_FreeHandle)(OMX_HANDLETYPE);
OMX_ERRORTYPE (*ptr_GetComponentsOfRole)(OMX_STRING, OMX_U32*, OMX_U8**);
OMX_ERRORTYPE (*ptr_GetRolesOfComponent)(OMX_STRING, OMX_U32*, OMX_U8**);
+ void (*host_init)(void);
} OMXContext;
static av_cold void *dlsym_prefixed(void *handle, const char *symbol, const char *prefix)
@@ -86,8 +94,23 @@ static av_cold void *dlsym_prefixed(void *handle, const char *symbol, const char
}
static av_cold int omx_try_load(OMXContext *s, void *logctx,
- const char *libname, const char *prefix)
+ const char *libname, const char *prefix,
+ const char *libname2)
{
+ if (libname2) {
+ s->lib2 = dlopen(libname2, RTLD_NOW | RTLD_GLOBAL);
+ if (!s->lib2) {
+ av_log(logctx, AV_LOG_WARNING, "%s not found\n", libname);
+ return AVERROR_ENCODER_NOT_FOUND;
+ }
+ s->host_init = dlsym(s->lib2, "bcm_host_init");
+ if (!s->host_init) {
+ av_log(logctx, AV_LOG_WARNING, "bcm_host_init not found\n");
+ dlclose(s->lib2);
+ s->lib2 = NULL;
+ return AVERROR_ENCODER_NOT_FOUND;
+ }
+ }
s->lib = dlopen(libname, RTLD_NOW | RTLD_GLOBAL);
if (!s->lib) {
av_log(logctx, AV_LOG_WARNING, "%s not found\n", libname);
@@ -106,6 +129,9 @@ static av_cold int omx_try_load(OMXContext *s, void *logctx,
av_log(logctx, AV_LOG_WARNING, "Not all functions found in %s\n", libname);
dlclose(s->lib);
s->lib = NULL;
+ if (s->lib2)
+ dlclose(s->lib2);
+ s->lib2 = NULL;
return AVERROR_ENCODER_NOT_FOUND;
}
return 0;
@@ -114,8 +140,12 @@ static av_cold int omx_try_load(OMXContext *s, void *logctx,
static av_cold OMXContext *omx_init(void *logctx, const char *libname, const char *prefix)
{
static const char * const libnames[] = {
- "libOMX_Core.so",
- "libOmxCore.so",
+#if CONFIG_OMX_RPI
+ "/opt/vc/lib/libopenmaxil.so", "/opt/vc/lib/libbcm_host.so",
+#else
+ "libOMX_Core.so", NULL,
+ "libOmxCore.so", NULL,
+#endif
NULL
};
const char* const* nameptr;
@@ -126,14 +156,14 @@ static av_cold OMXContext *omx_init(void *logctx, const char *libname, const cha
if (!omx_context)
return NULL;
if (libname) {
- ret = omx_try_load(omx_context, logctx, libname, prefix);
+ ret = omx_try_load(omx_context, logctx, libname, prefix, NULL);
if (ret < 0) {
av_free(omx_context);
return NULL;
}
} else {
- for (nameptr = libnames; *nameptr; nameptr++)
- if (!(ret = omx_try_load(omx_context, logctx, *nameptr, prefix)))
+ for (nameptr = libnames; *nameptr; nameptr += 2)
+ if (!(ret = omx_try_load(omx_context, logctx, nameptr[0], prefix, nameptr[1])))
break;
if (!*nameptr) {
av_free(omx_context);
@@ -141,6 +171,8 @@ static av_cold OMXContext *omx_init(void *logctx, const char *libname, const cha
}
}
+ if (omx_context->host_init)
+ omx_context->host_init();
omx_context->ptr_Init();
return omx_context;
}
@@ -298,6 +330,12 @@ static av_cold int find_component(OMXContext *omx_context, void *logctx,
char **components;
int ret = 0;
+#if CONFIG_OMX_RPI
+ if (av_strstart(role, "video_encoder.", NULL)) {
+ av_strlcpy(str, "OMX.broadcom.video_encode", str_size);
+ return 0;
+ }
+#endif
omx_context->ptr_GetComponentsOfRole((OMX_STRING) role, &num, NULL);
if (!num) {
av_log(logctx, AV_LOG_WARNING, "No component for role %s found\n", role);
diff --git a/libavcodec/version.h b/libavcodec/version.h
index a84cdeda98..71515a985f 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -29,7 +29,7 @@
#define LIBAVCODEC_VERSION_MAJOR 57
#define LIBAVCODEC_VERSION_MINOR 18
-#define LIBAVCODEC_VERSION_MICRO 0
+#define LIBAVCODEC_VERSION_MICRO 1
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \