1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- From 2ecf240b1cd20875991a5b18efafbe799864ff7f Mon Sep 17 00:00:00 2001
- From: Mark Thompson <sw@jkqxz.net>
- Date: Mon, 9 Oct 2017 20:10:26 +0100
- Subject: vaapi: Use libva2 message callbacks
- They are no longer global, so they work vaguely sensibly.
- ---
- video/vaapi.c | 32 +++++++++++++++++++++++++++++---
- 1 file changed, 29 insertions(+), 3 deletions(-)
- diff --git a/video/vaapi.c b/video/vaapi.c
- index 6bedbbaa18..3b1cb9cc41 100644
- --- a/video/vaapi.c
- +++ b/video/vaapi.c
- @@ -40,9 +40,27 @@ int va_get_colorspace_flag(enum mp_csp csp)
- return 0;
- }
-
- -// VA message callbacks are global and do not have a context parameter, so it's
- -// impossible to know from which VADisplay they originate. Try to route them
- -// to existing mpv/libmpv instances within this process.
- +#if VA_CHECK_VERSION(1, 0, 0)
- +static void va_message_callback(void *context, const char *msg, int mp_level)
- +{
- + struct mp_vaapi_ctx *res = context;
- + mp_msg(res->log, mp_level, "libva: %s", msg);
- +}
- +
- +static void va_error_callback(void *context, const char *msg)
- +{
- + va_message_callback(context, msg, MSGL_ERR);
- +}
- +
- +static void va_info_callback(void *context, const char *msg)
- +{
- + va_message_callback(context, msg, MSGL_V);
- +}
- +#else
- +// Pre-libva2 VA message callbacks are global and do not have a context
- +// parameter, so it's impossible to know from which VADisplay they
- +// originate. Try to route them to existing mpv/libmpv instances within
- +// this process.
- static pthread_mutex_t va_log_mutex = PTHREAD_MUTEX_INITIALIZER;
- static struct mp_vaapi_ctx **va_mpv_clients;
- static int num_va_mpv_clients;
- @@ -77,6 +95,7 @@ static void va_info_callback(const char *msg)
- {
- va_message_callback(msg, MSGL_V);
- }
- +#endif
-
- static void open_lavu_vaapi_device(struct mp_vaapi_ctx *ctx)
- {
- @@ -108,6 +127,10 @@ struct mp_vaapi_ctx *va_initialize(VADisplay *display, struct mp_log *plog,
- },
- };
-
- +#if VA_CHECK_VERSION(1, 0, 0)
- + vaSetErrorCallback(display, va_error_callback, res);
- + vaSetInfoCallback(display, va_info_callback, res);
- +#else
- pthread_mutex_lock(&va_log_mutex);
- MP_TARRAY_APPEND(NULL, va_mpv_clients, num_va_mpv_clients, res);
- pthread_mutex_unlock(&va_log_mutex);
- @@ -117,6 +140,7 @@ struct mp_vaapi_ctx *va_initialize(VADisplay *display, struct mp_log *plog,
- #ifdef VA_FOURCC_I010
- vaSetErrorCallback(va_error_callback);
- vaSetInfoCallback(va_info_callback);
- +#endif
- #endif
-
- int major, minor;
- @@ -154,6 +178,7 @@ void va_destroy(struct mp_vaapi_ctx *ctx)
- if (ctx->destroy_native_ctx)
- ctx->destroy_native_ctx(ctx->native_ctx);
-
- +#if !VA_CHECK_VERSION(1, 0, 0)
- pthread_mutex_lock(&va_log_mutex);
- for (int n = 0; n < num_va_mpv_clients; n++) {
- if (va_mpv_clients[n] == ctx) {
- @@ -164,6 +189,7 @@ void va_destroy(struct mp_vaapi_ctx *ctx)
- if (num_va_mpv_clients == 0)
- TA_FREEP(&va_mpv_clients); // avoid triggering leak detectors
- pthread_mutex_unlock(&va_log_mutex);
- +#endif
-
- talloc_free(ctx);
- }
- --
- cgit v1.1-22-g1649
|