| Index: third_party/libva/va/android/va_android.cpp
|
| diff --git a/third_party/libva/va/android/va_android.cpp b/third_party/libva/va/android/va_android.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4d4885a506edbe138b78e003095659674e1e2ca2
|
| --- /dev/null
|
| +++ b/third_party/libva/va/android/va_android.cpp
|
| @@ -0,0 +1,308 @@
|
| +/*
|
| + * Copyright (c) 2007 Intel Corporation. All Rights Reserved.
|
| + *
|
| + * Permission is hereby granted, free of charge, to any person obtaining a
|
| + * copy of this software and associated documentation files (the
|
| + * "Software"), to deal in the Software without restriction, including
|
| + * without limitation the rights to use, copy, modify, merge, publish,
|
| + * distribute, sub license, and/or sell copies of the Software, and to
|
| + * permit persons to whom the Software is furnished to do so, subject to
|
| + * the following conditions:
|
| + *
|
| + * The above copyright notice and this permission notice (including the
|
| + * next paragraph) shall be included in all copies or substantial portions
|
| + * of the Software.
|
| + *
|
| + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
| + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
| + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
| + * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
|
| + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
| + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
| + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
| + */
|
| +
|
| +#define _GNU_SOURCE 1
|
| +#include "va.h"
|
| +#include "va_backend.h"
|
| +#include "va_trace.h"
|
| +#include "va_fool.h"
|
| +#include "va_android.h"
|
| +#include "va_dricommon.h" /* needs some helper functions from this file */
|
| +#include <stdio.h>
|
| +#include <stdlib.h>
|
| +#include <stdarg.h>
|
| +#include <string.h>
|
| +#include <unistd.h>
|
| +#include <sys/types.h>
|
| +#include <sys/stat.h>
|
| +#include <fcntl.h>
|
| +#include <dlfcn.h>
|
| +#include <errno.h>
|
| +#ifndef ANDROID
|
| +#include <libudev.h>
|
| +#include "drmtest.h"
|
| +#endif
|
| +
|
| +#define CHECK_SYMBOL(func) { if (!func) printf("func %s not found\n", #func); return VA_STATUS_ERROR_UNKNOWN; }
|
| +#define DEVICE_NAME "/dev/card0"
|
| +
|
| +static int open_device (char *dev_name)
|
| +{
|
| + struct stat st;
|
| + int fd;
|
| +
|
| + if (-1 == stat (dev_name, &st))
|
| + {
|
| + printf ("Cannot identify '%s': %d, %s\n",
|
| + dev_name, errno, strerror (errno));
|
| + return -1;
|
| + }
|
| +
|
| + if (!S_ISCHR (st.st_mode))
|
| + {
|
| + printf ("%s is no device\n", dev_name);
|
| + return -1;
|
| + }
|
| +
|
| + fd = open (dev_name, O_RDWR);
|
| +
|
| + if (-1 == fd)
|
| + {
|
| + fprintf (stderr, "Cannot open '%s': %d, %s\n",
|
| + dev_name, errno, strerror (errno));
|
| + return -1;
|
| + }
|
| +
|
| + return fd;
|
| +}
|
| +
|
| +static int va_DisplayContextIsValid (
|
| + VADisplayContextP pDisplayContext
|
| + )
|
| +{
|
| + return (pDisplayContext != NULL &&
|
| + pDisplayContext->pDriverContext != NULL);
|
| +}
|
| +
|
| +static void va_DisplayContextDestroy (
|
| + VADisplayContextP pDisplayContext
|
| +)
|
| +{
|
| + struct dri_state *dri_state;
|
| +
|
| + if (pDisplayContext == NULL)
|
| + return;
|
| +
|
| + /* close the open-ed DRM fd */
|
| + dri_state = (struct dri_state *)pDisplayContext->pDriverContext->dri_state;
|
| + close(dri_state->fd);
|
| +
|
| + free(pDisplayContext->pDriverContext->dri_state);
|
| + free(pDisplayContext->pDriverContext);
|
| + free(pDisplayContext);
|
| +}
|
| +
|
| +#ifdef ANDROID
|
| +static VAStatus va_DisplayContextGetDriverName (
|
| + VADisplayContextP pDisplayContext,
|
| + char **driver_name
|
| +)
|
| +{
|
| + VADriverContextP ctx = pDisplayContext->pDriverContext;
|
| + struct dri_state *dri_state = (struct dri_state *)ctx->dri_state;
|
| + char *driver_name_env;
|
| + int vendor_id, device_id;
|
| +
|
| + struct {
|
| + int vendor_id;
|
| + int device_id;
|
| + char driver_name[64];
|
| + } devices[] = {
|
| + { 0x8086, 0x4100, "pvr" },
|
| + { 0x8086, 0x0130, "pvr" },
|
| + { 0x0, 0x0, "\0" },
|
| + };
|
| +
|
| + memset(dri_state, 0, sizeof(*dri_state));
|
| + dri_state->fd = open_device((char *)DEVICE_NAME);
|
| +
|
| + if (dri_state->fd < 0) {
|
| + fprintf(stderr,"can't open DRM devices\n");
|
| + return VA_STATUS_ERROR_UNKNOWN;
|
| + }
|
| +
|
| + /* TBD: other vendor driver names */
|
| + vendor_id = devices[0].vendor_id;
|
| + device_id = devices[0].device_id;
|
| + *driver_name = strdup(devices[0].driver_name);
|
| +
|
| + dri_state->driConnectedFlag = VA_DUMMY;
|
| +
|
| + return VA_STATUS_SUCCESS;
|
| +}
|
| +#else
|
| +static VAStatus va_DisplayContextGetDriverName (
|
| + VADisplayContextP pDisplayContext,
|
| + char **driver_name
|
| +)
|
| +{
|
| + VADriverContextP ctx = pDisplayContext->pDriverContext;
|
| + struct dri_state *dri_state = (struct dri_state *)ctx->dri_state;
|
| + char *driver_name_env;
|
| + int vendor_id, device_id;
|
| + int i = 0;
|
| +
|
| + struct {
|
| + int vendor_id;
|
| + int device_id;
|
| + char driver_name[64];
|
| + } devices[] = {
|
| + { 0x8086, 0x4100, "pvr" },
|
| + { 0x8086, 0x0130, "pvr" },
|
| + { 0x0, 0x0, "\0" },
|
| + };
|
| +
|
| + memset(dri_state, 0, sizeof(*dri_state));
|
| + dri_state->fd = drm_open_any(&vendor_id, &device_id);
|
| +
|
| + if (dri_state->fd < 0) {
|
| + fprintf(stderr,"can't open DRM devices\n");
|
| + return VA_STATUS_ERROR_UNKNOWN;
|
| + }
|
| +
|
| + /* TBD: other vendor driver names */
|
| +
|
| + while (devices[i].device_id != 0) {
|
| + if ((devices[i].vendor_id == vendor_id) &&
|
| + (devices[i].device_id == device_id))
|
| + break;
|
| + i++;
|
| + }
|
| +
|
| + if (devices[i].device_id != 0)
|
| + *driver_name = strdup(devices[i].driver_name);
|
| + else {
|
| + fprintf(stderr,"device (0x%04x:0x%04x) is not supported\n",
|
| + vendor_id, device_id);
|
| +
|
| + return VA_STATUS_ERROR_UNKNOWN;
|
| + }
|
| +
|
| + printf("DRM device is opened, loading driver %s for device 0x%04x:0x%04x\n",
|
| + driver_name, vendor_id, device_id);
|
| +
|
| + dri_state->driConnectedFlag = VA_DUMMY;
|
| +
|
| + return VA_STATUS_SUCCESS;
|
| +}
|
| +#endif
|
| +
|
| +VADisplay vaGetDisplay (
|
| + void *native_dpy /* implementation specific */
|
| +)
|
| +{
|
| + VADisplay dpy = NULL;
|
| + VADisplayContextP pDisplayContext;
|
| +
|
| + if (!native_dpy)
|
| + return NULL;
|
| +
|
| + if (!dpy)
|
| + {
|
| + /* create new entry */
|
| + VADriverContextP pDriverContext;
|
| + struct dri_state *dri_state;
|
| + pDisplayContext = (VADisplayContextP)calloc(1, sizeof(*pDisplayContext));
|
| + pDriverContext = (VADriverContextP)calloc(1, sizeof(*pDriverContext));
|
| + dri_state = (struct dri_state*)calloc(1, sizeof(*dri_state));
|
| + if (pDisplayContext && pDriverContext && dri_state)
|
| + {
|
| + pDisplayContext->vadpy_magic = VA_DISPLAY_MAGIC;
|
| +
|
| + pDriverContext->native_dpy = (void *)native_dpy;
|
| + pDisplayContext->pDriverContext = pDriverContext;
|
| + pDisplayContext->vaIsValid = va_DisplayContextIsValid;
|
| + pDisplayContext->vaDestroy = va_DisplayContextDestroy;
|
| + pDisplayContext->vaGetDriverName = va_DisplayContextGetDriverName;
|
| + pDriverContext->dri_state = dri_state;
|
| + dpy = (VADisplay)pDisplayContext;
|
| + }
|
| + else
|
| + {
|
| + if (pDisplayContext)
|
| + free(pDisplayContext);
|
| + if (pDriverContext)
|
| + free(pDriverContext);
|
| + if (dri_state)
|
| + free(dri_state);
|
| + }
|
| + }
|
| +
|
| + return dpy;
|
| +}
|
| +
|
| +#define CTX(dpy) (((VADisplayContextP)dpy)->pDriverContext)
|
| +#define CHECK_DISPLAY(dpy) if( !vaDisplayIsValid(dpy) ) { return VA_STATUS_ERROR_INVALID_DISPLAY; }
|
| +
|
| +
|
| +#ifdef ANDROID
|
| +extern "C" {
|
| + extern int fool_postp; /* do nothing for vaPutSurface if set */
|
| + extern int trace_flag; /* trace vaPutSurface parameters */
|
| +
|
| + void va_TracePutSurface (
|
| + VADisplay dpy,
|
| + VASurfaceID surface,
|
| + void *draw, /* the target Drawable */
|
| + short srcx,
|
| + short srcy,
|
| + unsigned short srcw,
|
| + unsigned short srch,
|
| + short destx,
|
| + short desty,
|
| + unsigned short destw,
|
| + unsigned short desth,
|
| + VARectangle *cliprects, /* client supplied clip list */
|
| + unsigned int number_cliprects, /* number of clip rects in the clip list */
|
| + unsigned int flags /* de-interlacing flags */
|
| + );
|
| +}
|
| +
|
| +VAStatus vaPutSurface (
|
| + VADisplay dpy,
|
| + VASurfaceID surface,
|
| + sp<ISurface> draw, /* Android Surface/Window */
|
| + short srcx,
|
| + short srcy,
|
| + unsigned short srcw,
|
| + unsigned short srch,
|
| + short destx,
|
| + short desty,
|
| + unsigned short destw,
|
| + unsigned short desth,
|
| + VARectangle *cliprects, /* client supplied clip list */
|
| + unsigned int number_cliprects, /* number of clip rects in the clip list */
|
| + unsigned int flags /* de-interlacing flags */
|
| +)
|
| +{
|
| + VADriverContextP ctx;
|
| +
|
| + if (fool_postp)
|
| + return VA_STATUS_SUCCESS;
|
| +
|
| + if (draw == NULL)
|
| + return VA_STATUS_ERROR_UNKNOWN;
|
| +
|
| + CHECK_DISPLAY(dpy);
|
| + ctx = CTX(dpy);
|
| +
|
| + VA_TRACE_LOG(va_TracePutSurface, dpy, surface, static_cast<void*>(&draw), srcx, srcy, srcw, srch,
|
| + destx, desty, destw, desth,
|
| + cliprects, number_cliprects, flags );
|
| +
|
| + return ctx->vtable->vaPutSurface( ctx, surface, static_cast<void*>(&draw), srcx, srcy, srcw, srch,
|
| + destx, desty, destw, desth,
|
| + cliprects, number_cliprects, flags );
|
| +}
|
| +#endif
|
|
|