st/omx: add headless support

This will allow dec/enc/transcode without X

v2:  use env override even with X,
     use loader_open_device instead of open
v3:  clean up

Signed-off-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
This commit is contained in:
Leo Liu 2015-11-04 16:38:28 -05:00
parent 25526d77b1
commit 519502d08f

View file

@ -38,6 +38,7 @@
#include "os/os_thread.h"
#include "util/u_memory.h"
#include "loader/loader.h"
#include "entrypoint.h"
#include "vid_dec.h"
@ -47,6 +48,8 @@ pipe_static_mutex(omx_lock);
static Display *omx_display = NULL;
static struct vl_screen *omx_screen = NULL;
static unsigned omx_usecount = 0;
static const char *omx_render_node = NULL;
static int drm_fd;
int omx_component_library_Setup(stLoaderComponentType **stComponents)
{
@ -73,18 +76,30 @@ struct vl_screen *omx_get_screen(void)
pipe_mutex_lock(omx_lock);
if (!omx_display) {
omx_display = XOpenDisplay(NULL);
if (!omx_display) {
pipe_mutex_unlock(omx_lock);
return NULL;
omx_render_node = debug_get_option("OMX_RENDER_NODE", NULL);
if (!omx_render_node) {
omx_display = XOpenDisplay(NULL);
if (!omx_display)
goto error;
}
}
if (!omx_screen) {
omx_screen = vl_screen_create(omx_display, 0);
if (!omx_screen) {
pipe_mutex_unlock(omx_lock);
return NULL;
if (omx_render_node) {
drm_fd = loader_open_device(omx_render_node);
if (drm_fd < 0)
goto error;
omx_screen = vl_drm_screen_create(drm_fd);
if (!omx_screen) {
close(drm_fd);
goto error;
}
} else {
omx_screen = vl_screen_create(omx_display, 0);
if (!omx_screen) {
XCloseDisplay(omx_display);
goto error;
}
}
}
@ -92,14 +107,24 @@ struct vl_screen *omx_get_screen(void)
pipe_mutex_unlock(omx_lock);
return omx_screen;
error:
pipe_mutex_unlock(omx_lock);
return NULL;
}
void omx_put_screen(void)
{
pipe_mutex_lock(omx_lock);
if ((--omx_usecount) == 0) {
vl_screen_destroy(omx_screen);
XCloseDisplay(omx_display);
if (!omx_render_node) {
vl_screen_destroy(omx_screen);
if (omx_display)
XCloseDisplay(omx_display);
} else {
close(drm_fd);
vl_drm_screen_destroy(omx_screen);
}
omx_screen = NULL;
omx_display = NULL;
}