summaryrefslogtreecommitdiffstats
path: root/media/ffvpx/mozva/mozva.c
diff options
context:
space:
mode:
Diffstat (limited to 'media/ffvpx/mozva/mozva.c')
-rw-r--r--media/ffvpx/mozva/mozva.c406
1 files changed, 406 insertions, 0 deletions
diff --git a/media/ffvpx/mozva/mozva.c b/media/ffvpx/mozva/mozva.c
new file mode 100644
index 0000000000..6799062ffa
--- /dev/null
+++ b/media/ffvpx/mozva/mozva.c
@@ -0,0 +1,406 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:expandtab:shiftwidth=4:tabstop=4:
+ */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma GCC visibility push(default)
+#include <va/va.h>
+#pragma GCC visibility pop
+
+#include "mozilla/Types.h"
+#include <dlfcn.h>
+#include <pthread.h>
+#include <stdlib.h>
+
+#define GET_FUNC(func, lib) (func##Fn = dlsym(lib, #func))
+
+#define IS_FUNC_LOADED(func) (func##Fn != NULL)
+
+static VAStatus (*vaDestroyBufferFn)(VADisplay dpy, VABufferID buffer_id);
+static VAStatus (*vaBeginPictureFn)(VADisplay dpy, VAContextID context,
+ VASurfaceID render_target);
+static VAStatus (*vaEndPictureFn)(VADisplay dpy, VAContextID context);
+static VAStatus (*vaRenderPictureFn)(VADisplay dpy, VAContextID context,
+ VABufferID* buffers, int num_buffers);
+static int (*vaMaxNumProfilesFn)(VADisplay dpy);
+static VAStatus (*vaCreateContextFn)(VADisplay dpy, VAConfigID config_id,
+ int picture_width, int picture_height,
+ int flag, VASurfaceID* render_targets,
+ int num_render_targets,
+ VAContextID* context /* out */);
+static VAStatus (*vaDestroyContextFn)(VADisplay dpy, VAContextID context);
+static VAStatus (*vaCreateBufferFn)(VADisplay dpy, VAContextID context,
+ VABufferType type, /* in */
+ unsigned int size, /* in */
+ unsigned int num_elements, /* in */
+ void* data, /* in */
+ VABufferID* buf_id /* out */);
+static VAStatus (*vaQuerySurfaceAttributesFn)(VADisplay dpy, VAConfigID config,
+ VASurfaceAttrib* attrib_list,
+ unsigned int* num_attribs);
+static VAStatus (*vaQueryConfigProfilesFn)(VADisplay dpy,
+ VAProfile* profile_list, /* out */
+ int* num_profiles /* out */);
+static const char* (*vaErrorStrFn)(VAStatus error_status);
+static VAStatus (*vaCreateConfigFn)(VADisplay dpy, VAProfile profile,
+ VAEntrypoint entrypoint,
+ VAConfigAttrib* attrib_list,
+ int num_attribs,
+ VAConfigID* config_id /* out */);
+static VAStatus (*vaDestroyConfigFn)(VADisplay dpy, VAConfigID config_id);
+static int (*vaMaxNumImageFormatsFn)(VADisplay dpy);
+static VAStatus (*vaQueryImageFormatsFn)(VADisplay dpy,
+ VAImageFormat* format_list, /* out */
+ int* num_formats /* out */);
+static const char* (*vaQueryVendorStringFn)(VADisplay dpy);
+static VAStatus (*vaDestroySurfacesFn)(VADisplay dpy, VASurfaceID* surfaces,
+ int num_surfaces);
+static VAStatus (*vaCreateSurfacesFn)(VADisplay dpy, unsigned int format,
+ unsigned int width, unsigned int height,
+ VASurfaceID* surfaces,
+ unsigned int num_surfaces,
+ VASurfaceAttrib* attrib_list,
+ unsigned int num_attribs);
+static VAStatus (*vaDeriveImageFn)(VADisplay dpy, VASurfaceID surface,
+ VAImage* image /* out */);
+static VAStatus (*vaDestroyImageFn)(VADisplay dpy, VAImageID image);
+static VAStatus (*vaPutImageFn)(VADisplay dpy, VASurfaceID surface,
+ VAImageID image, int src_x, int src_y,
+ unsigned int src_width, unsigned int src_height,
+ int dest_x, int dest_y, unsigned int dest_width,
+ unsigned int dest_height);
+static VAStatus (*vaSyncSurfaceFn)(VADisplay dpy, VASurfaceID render_target);
+static VAStatus (*vaCreateImageFn)(VADisplay dpy, VAImageFormat* format,
+ int width, int height,
+ VAImage* image /* out */);
+static VAStatus (*vaGetImageFn)(
+ VADisplay dpy, VASurfaceID surface,
+ int x, /* coordinates of the upper left source pixel */
+ int y, unsigned int width, /* width and height of the region */
+ unsigned int height, VAImageID image);
+static VAStatus (*vaMapBufferFn)(VADisplay dpy, VABufferID buf_id, /* in */
+ void** pbuf /* out */);
+static VAStatus (*vaUnmapBufferFn)(VADisplay dpy, VABufferID buf_id /* in */);
+static VAStatus (*vaTerminateFn)(VADisplay dpy);
+static VAStatus (*vaInitializeFn)(VADisplay dpy, int* major_version, /* out */
+ int* minor_version /* out */);
+static VAStatus (*vaSetDriverNameFn)(VADisplay dpy, char* driver_name);
+
+int LoadVALibrary() {
+ static pthread_mutex_t sVALock = PTHREAD_MUTEX_INITIALIZER;
+ static void* sVALib = NULL;
+ static int sVAInitialized = 0;
+ static int sVALoaded = 0;
+
+ pthread_mutex_lock(&sVALock);
+
+ if (!sVAInitialized) {
+ sVAInitialized = 1;
+ sVALib = dlopen("libva.so.2", RTLD_LAZY);
+ if (!sVALib) {
+ pthread_mutex_unlock(&sVALock);
+ return 0;
+ }
+ GET_FUNC(vaDestroyBuffer, sVALib);
+ GET_FUNC(vaBeginPicture, sVALib);
+ GET_FUNC(vaEndPicture, sVALib);
+ GET_FUNC(vaRenderPicture, sVALib);
+ GET_FUNC(vaMaxNumProfiles, sVALib);
+ GET_FUNC(vaCreateContext, sVALib);
+ GET_FUNC(vaDestroyContext, sVALib);
+ GET_FUNC(vaCreateBuffer, sVALib);
+ GET_FUNC(vaQuerySurfaceAttributes, sVALib);
+ GET_FUNC(vaQueryConfigProfiles, sVALib);
+ GET_FUNC(vaErrorStr, sVALib);
+ GET_FUNC(vaCreateConfig, sVALib);
+ GET_FUNC(vaDestroyConfig, sVALib);
+ GET_FUNC(vaMaxNumImageFormats, sVALib);
+ GET_FUNC(vaQueryImageFormats, sVALib);
+ GET_FUNC(vaQueryVendorString, sVALib);
+ GET_FUNC(vaDestroySurfaces, sVALib);
+ GET_FUNC(vaCreateSurfaces, sVALib);
+ GET_FUNC(vaDeriveImage, sVALib);
+ GET_FUNC(vaDestroyImage, sVALib);
+ GET_FUNC(vaPutImage, sVALib);
+ GET_FUNC(vaSyncSurface, sVALib);
+ GET_FUNC(vaCreateImage, sVALib);
+ GET_FUNC(vaGetImage, sVALib);
+ GET_FUNC(vaMapBuffer, sVALib);
+ GET_FUNC(vaUnmapBuffer, sVALib);
+ GET_FUNC(vaTerminate, sVALib);
+ GET_FUNC(vaInitialize, sVALib);
+ GET_FUNC(vaSetDriverName, sVALib);
+
+ sVALoaded =
+ (IS_FUNC_LOADED(vaDestroyBuffer) && IS_FUNC_LOADED(vaBeginPicture) &&
+ IS_FUNC_LOADED(vaEndPicture) && IS_FUNC_LOADED(vaRenderPicture) &&
+ IS_FUNC_LOADED(vaMaxNumProfiles) && IS_FUNC_LOADED(vaCreateContext) &&
+ IS_FUNC_LOADED(vaDestroyContext) && IS_FUNC_LOADED(vaCreateBuffer) &&
+ IS_FUNC_LOADED(vaQuerySurfaceAttributes) &&
+ IS_FUNC_LOADED(vaQueryConfigProfiles) && IS_FUNC_LOADED(vaErrorStr) &&
+ IS_FUNC_LOADED(vaCreateConfig) && IS_FUNC_LOADED(vaDestroyConfig) &&
+ IS_FUNC_LOADED(vaMaxNumImageFormats) &&
+ IS_FUNC_LOADED(vaQueryImageFormats) &&
+ IS_FUNC_LOADED(vaQueryVendorString) &&
+ IS_FUNC_LOADED(vaDestroySurfaces) &&
+ IS_FUNC_LOADED(vaCreateSurfaces) && IS_FUNC_LOADED(vaDeriveImage) &&
+ IS_FUNC_LOADED(vaDestroyImage) && IS_FUNC_LOADED(vaPutImage) &&
+ IS_FUNC_LOADED(vaSyncSurface) && IS_FUNC_LOADED(vaCreateImage) &&
+ IS_FUNC_LOADED(vaGetImage) && IS_FUNC_LOADED(vaMapBuffer) &&
+ IS_FUNC_LOADED(vaUnmapBuffer) && IS_FUNC_LOADED(vaTerminate) &&
+ IS_FUNC_LOADED(vaInitialize) && IS_FUNC_LOADED(vaSetDriverName));
+ }
+ pthread_mutex_unlock(&sVALock);
+ return sVALoaded;
+}
+
+#pragma GCC visibility push(default)
+
+VAStatus vaDestroyBuffer(VADisplay dpy, VABufferID buffer_id) {
+ if (LoadVALibrary()) {
+ return vaDestroyBufferFn(dpy, buffer_id);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaBeginPicture(VADisplay dpy, VAContextID context,
+ VASurfaceID render_target) {
+ if (LoadVALibrary()) {
+ return vaBeginPictureFn(dpy, context, render_target);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaEndPicture(VADisplay dpy, VAContextID context) {
+ if (LoadVALibrary()) {
+ return vaEndPictureFn(dpy, context);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaRenderPicture(VADisplay dpy, VAContextID context,
+ VABufferID* buffers, int num_buffers) {
+ if (LoadVALibrary()) {
+ return vaRenderPictureFn(dpy, context, buffers, num_buffers);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+int vaMaxNumProfiles(VADisplay dpy) {
+ if (LoadVALibrary()) {
+ return vaMaxNumProfilesFn(dpy);
+ }
+ return 0;
+}
+
+VAStatus vaCreateContext(VADisplay dpy, VAConfigID config_id, int picture_width,
+ int picture_height, int flag,
+ VASurfaceID* render_targets, int num_render_targets,
+ VAContextID* context /* out */) {
+ if (LoadVALibrary()) {
+ return vaCreateContextFn(dpy, config_id, picture_width, picture_height,
+ flag, render_targets, num_render_targets, context);
+ }
+ *context = 0;
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaDestroyContext(VADisplay dpy, VAContextID context) {
+ if (LoadVALibrary()) {
+ return vaDestroyContextFn(dpy, context);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaCreateBuffer(VADisplay dpy, VAContextID context,
+ VABufferType type, /* in */
+ unsigned int size, /* in */
+ unsigned int num_elements, /* in */
+ void* data, /* in */
+ VABufferID* buf_id /* out */) {
+ if (LoadVALibrary()) {
+ return vaCreateBufferFn(dpy, context, type, size, num_elements, data,
+ buf_id);
+ }
+ *buf_id = 0;
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaQuerySurfaceAttributes(VADisplay dpy, VAConfigID config,
+ VASurfaceAttrib* attrib_list,
+ unsigned int* num_attribs) {
+ if (LoadVALibrary()) {
+ return vaQuerySurfaceAttributesFn(dpy, config, attrib_list, num_attribs);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaQueryConfigProfiles(VADisplay dpy, VAProfile* profile_list, /* out */
+ int* num_profiles /* out */) {
+ if (LoadVALibrary()) {
+ return vaQueryConfigProfilesFn(dpy, profile_list, num_profiles);
+ }
+ *num_profiles = 0;
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+const char* vaErrorStr(VAStatus error_status) {
+ if (LoadVALibrary()) {
+ return vaErrorStrFn(error_status);
+ }
+ static char tmp[] = "Unimplemented";
+ return tmp;
+}
+
+VAStatus vaCreateConfig(VADisplay dpy, VAProfile profile,
+ VAEntrypoint entrypoint, VAConfigAttrib* attrib_list,
+ int num_attribs, VAConfigID* config_id /* out */) {
+ if (LoadVALibrary()) {
+ return vaCreateConfigFn(dpy, profile, entrypoint, attrib_list, num_attribs,
+ config_id);
+ }
+ *config_id = 0;
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaDestroyConfig(VADisplay dpy, VAConfigID config_id) {
+ if (LoadVALibrary()) {
+ return vaDestroyConfigFn(dpy, config_id);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+int vaMaxNumImageFormats(VADisplay dpy) {
+ if (LoadVALibrary()) {
+ return vaMaxNumImageFormatsFn(dpy);
+ }
+ return 0;
+}
+
+VAStatus vaQueryImageFormats(VADisplay dpy, VAImageFormat* format_list,
+ int* num_formats) {
+ if (LoadVALibrary()) {
+ return vaQueryImageFormatsFn(dpy, format_list, num_formats);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+const char* vaQueryVendorString(VADisplay dpy) {
+ if (LoadVALibrary()) {
+ return vaQueryVendorStringFn(dpy);
+ }
+ return NULL;
+}
+
+VAStatus vaDestroySurfaces(VADisplay dpy, VASurfaceID* surfaces,
+ int num_surfaces) {
+ if (LoadVALibrary()) {
+ return vaDestroySurfacesFn(dpy, surfaces, num_surfaces);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaCreateSurfaces(VADisplay dpy, unsigned int format,
+ unsigned int width, unsigned int height,
+ VASurfaceID* surfaces, unsigned int num_surfaces,
+ VASurfaceAttrib* attrib_list,
+ unsigned int num_attribs) {
+ if (LoadVALibrary()) {
+ return vaCreateSurfacesFn(dpy, format, width, height, surfaces,
+ num_surfaces, attrib_list, num_attribs);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaDeriveImage(VADisplay dpy, VASurfaceID surface,
+ VAImage* image /* out */) {
+ if (LoadVALibrary()) {
+ return vaDeriveImageFn(dpy, surface, image);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaDestroyImage(VADisplay dpy, VAImageID image) {
+ if (LoadVALibrary()) {
+ return vaDestroyImageFn(dpy, image);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaPutImage(VADisplay dpy, VASurfaceID surface, VAImageID image,
+ int src_x, int src_y, unsigned int src_width,
+ unsigned int src_height, int dest_x, int dest_y,
+ unsigned int dest_width, unsigned int dest_height) {
+ if (LoadVALibrary()) {
+ return vaPutImageFn(dpy, surface, image, src_x, src_y, src_width,
+ src_height, dest_x, dest_y, dest_width, dest_height);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaSyncSurface(VADisplay dpy, VASurfaceID render_target) {
+ if (LoadVALibrary()) {
+ return vaSyncSurfaceFn(dpy, render_target);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaCreateImage(VADisplay dpy, VAImageFormat* format, int width,
+ int height, VAImage* image /* out */) {
+ if (LoadVALibrary()) {
+ return vaCreateImageFn(dpy, format, width, height, image);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaGetImage(VADisplay dpy, VASurfaceID surface,
+ int x, /* coordinates of the upper left source pixel */
+ int y,
+ unsigned int width, /* width and height of the region */
+ unsigned int height, VAImageID image) {
+ if (LoadVALibrary()) {
+ return vaGetImageFn(dpy, surface, x, y, width, height, image);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaMapBuffer(VADisplay dpy, VABufferID buf_id, /* in */
+ void** pbuf /* out */) {
+ if (LoadVALibrary()) {
+ return vaMapBufferFn(dpy, buf_id, pbuf);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaUnmapBuffer(VADisplay dpy, VABufferID buf_id /* in */) {
+ if (LoadVALibrary()) {
+ return vaUnmapBufferFn(dpy, buf_id);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaTerminate(VADisplay dpy) {
+ if (LoadVALibrary()) {
+ return vaTerminateFn(dpy);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaInitialize(VADisplay dpy, int* major_version, /* out */
+ int* minor_version /* out */) {
+ if (LoadVALibrary()) {
+ return vaInitializeFn(dpy, major_version, minor_version);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+VAStatus vaSetDriverName(VADisplay dpy, char* driver_name) {
+ if (LoadVALibrary()) {
+ return vaSetDriverNameFn(dpy, driver_name);
+ }
+ return VA_STATUS_ERROR_UNIMPLEMENTED;
+}
+
+#pragma GCC visibility pop