tests: allow selection of display.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Tue, 10 Jul 2012 13:58:31 +0000 (15:58 +0200)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Fri, 13 Jul 2012 11:44:31 +0000 (13:44 +0200)
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@intel.com>
test/common/va_display.c
test/common/va_display.h
test/common/va_display_android.cpp
test/common/va_display_x11.c
test/decode/loadjpeg.c
test/decode/mpeg2vldemo.cpp

index 7a4e563..80955a5 100644 (file)
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
+#include <stdio.h>
+#include <stdlib.h>
 #include <stddef.h>
+#include <string.h>
 #include <va/va.h>
 #include "va_display.h"
 
@@ -42,6 +45,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)
 {
@@ -50,10 +113,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;
 }
 
index 12992f5..4ed33e0 100644 (file)
@@ -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);
 
index 77bdc1d..1e45ae9 100644 (file)
@@ -85,6 +85,7 @@ va_put_surface_android(
 
 extern "C"
 const VADisplayHooks va_display_hooks_android = {
+    "android",
     va_open_display_android,
     va_close_display_android,
     va_put_surface_android
index de252a7..336bf86 100644 (file)
@@ -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,
index 6258e28..7a9a235 100644 (file)
@@ -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();
 
index fa7928d..715ea49 100644 (file)
@@ -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;