[Libva] [PATCH v2 3/3] tests: allow selection of display.
Gwenole Beauchesne
gb.devel at gmail.com
Fri Jul 13 01:33:28 PDT 2012
Make it possible to select display for test applications that need
to render the decoded surfaces. Usage: --display <name> args.
Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
---
test/common/va_display.c | 74 ++++++++++++++++++++++++++++++++++++
test/common/va_display.h | 4 ++
test/common/va_display_android.cpp | 1 +
test/common/va_display_x11.c | 1 +
test/decode/loadjpeg.c | 3 ++
test/decode/mpeg2vldemo.cpp | 2 +
6 files changed, 85 insertions(+)
diff --git a/test/common/va_display.c b/test/common/va_display.c
index 9b20591..a15c6f3 100644
--- a/test/common/va_display.c
+++ b/test/common/va_display.c
@@ -23,7 +23,10 @@
*/
#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
#include <stddef.h>
+#include <string.h>
#include <va/va.h>
#include "va_display.h"
@@ -40,6 +43,66 @@ static const VADisplayHooks *g_display_hooks_available[] = {
NULL
};
+static const char *g_display_name;
+
+static const char *
+get_display_name(int argc, char *argv[])
+{
+ const char *display_name = NULL;
+ int i;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "--display") != 0)
+ continue;
+ argv[i] = NULL;
+
+ if (++i < argc) {
+ display_name = argv[i];
+ argv[i] = NULL;
+ }
+ }
+ return display_name;
+}
+
+static void
+print_display_names(void)
+{
+ const VADisplayHooks **h;
+
+ printf("Available displays:\n");
+ for (h = g_display_hooks_available; *h != NULL; h++)
+ printf(" %s\n", (*h)->name);
+}
+
+static void
+sanitize_args(int *argc, char *argv[])
+{
+ char **out_args = argv;
+ int i, n = *argc;
+
+ for (i = 0; i < n; i++) {
+ if (argv[i])
+ *out_args++ = argv[i];
+ }
+ *out_args = NULL;
+ *argc = out_args - argv;
+}
+
+void
+va_init_display_args(int *argc, char *argv[])
+{
+ const char *display_name;
+
+ display_name = get_display_name(*argc, argv);
+ if (display_name && strcmp(display_name, "help") == 0) {
+ print_display_names();
+ exit(0);
+ }
+ g_display_name = display_name;
+
+ sanitize_args(argc, argv);
+}
+
VADisplay
va_open_display(void)
{
@@ -48,10 +111,21 @@ va_open_display(void)
for (i = 0; !va_dpy && g_display_hooks_available[i]; i++) {
g_display_hooks = g_display_hooks_available[i];
+ if (g_display_name &&
+ strcmp(g_display_name, g_display_hooks->name) != 0)
+ continue;
if (!g_display_hooks->open_display)
continue;
va_dpy = g_display_hooks->open_display();
}
+
+ if (!va_dpy) {
+ fprintf(stderr, "error: failed to initialize display");
+ if (g_display_name)
+ fprintf(stderr, " '%s'", g_display_name);
+ fprintf(stderr, "\n");
+ abort();
+ }
return va_dpy;
}
diff --git a/test/common/va_display.h b/test/common/va_display.h
index 12992f5..4ed33e0 100644
--- a/test/common/va_display.h
+++ b/test/common/va_display.h
@@ -32,6 +32,7 @@ extern "C" {
#endif
typedef struct {
+ const char *name;
VADisplay (*open_display) (void);
void (*close_display) (VADisplay va_dpy);
VAStatus (*put_surface) (VADisplay va_dpy, VASurfaceID surface,
@@ -39,6 +40,9 @@ typedef struct {
const VARectangle *dst_rect);
} VADisplayHooks;
+void
+va_init_display_args(int *argc, char *argv[]);
+
VADisplay
va_open_display(void);
diff --git a/test/common/va_display_android.cpp b/test/common/va_display_android.cpp
index 33b510d..23630d7 100644
--- a/test/common/va_display_android.cpp
+++ b/test/common/va_display_android.cpp
@@ -84,6 +84,7 @@ va_put_surface_android(
}
const VADisplayHooks va_display_hooks_android = {
+ "android",
va_open_display_android,
va_close_display_android,
va_put_surface_android
diff --git a/test/common/va_display_x11.c b/test/common/va_display_x11.c
index de252a7..336bf86 100644
--- a/test/common/va_display_x11.c
+++ b/test/common/va_display_x11.c
@@ -132,6 +132,7 @@ va_put_surface_x11(
}
const VADisplayHooks va_display_hooks_x11 = {
+ "x11",
va_open_display_x11,
va_close_display_x11,
va_put_surface_x11,
diff --git a/test/decode/loadjpeg.c b/test/decode/loadjpeg.c
index 6258e28..7a9a235 100644
--- a/test/decode/loadjpeg.c
+++ b/test/decode/loadjpeg.c
@@ -37,6 +37,7 @@
#include <stdlib.h>
#include <string.h>
#include <time.h>
+#include "va_display.h"
static void exitmessage(const char *message) __attribute__((noreturn));
static void exitmessage(const char *message)
@@ -114,6 +115,8 @@ int main(int argc, char *argv[])
unsigned int duration;
int current_argument;
+ va_init_display_args(&argc, argv);
+
if (argc < 2)
usage();
diff --git a/test/decode/mpeg2vldemo.cpp b/test/decode/mpeg2vldemo.cpp
index fa7928d..715ea49 100644
--- a/test/decode/mpeg2vldemo.cpp
+++ b/test/decode/mpeg2vldemo.cpp
@@ -150,6 +150,8 @@ int main(int argc,char **argv)
VAStatus va_status;
int putsurface=0;
+ va_init_display_args(&argc, argv);
+
if (argc > 1)
putsurface=1;
--
1.7.9.5
More information about the Libva
mailing list