Dear mailing list,

Please find in the attaches patch an enhancement to vainfo to report
VPP capabilities.

Best regards,

Josep Torra
From e5dbc1df83ad82eac0232d51bf125c8f5284b277 Mon Sep 17 00:00:00 2001
From: Josep Torra <[email protected]>
Date: Sat, 15 Aug 2015 18:11:13 +0200
Subject: [PATCH] Add reporting of VPP capabilities to vainfo

Make vainfo report about the video post processing capabilities
supported by the system.
---
 test/vainfo/vainfo.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 119 insertions(+), 2 deletions(-)

diff --git a/test/vainfo/vainfo.c b/test/vainfo/vainfo.c
index 4ccfe60..8c0e80b 100644
--- a/test/vainfo/vainfo.c
+++ b/test/vainfo/vainfo.c
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 #include "va_display.h"
 #include "va/sysdeps.h"
+#include "va/va_vpp.h"
 
 #define CHECK_VASTATUS(va_status,func, ret)                             \
 if (va_status != VA_STATUS_SUCCESS) {                                   \
@@ -86,6 +87,37 @@ static char * entrypoint_string(VAEntrypoint entrypoint)
     return "<unknown entrypoint>";
 }
 
+static char * deinterlacing_string (VAProcDeinterlacingType type)
+{
+    switch (type) {
+            case VAProcDeinterlacingNone: return "VAProcDeinterlacingNone";
+            case VAProcDeinterlacingBob: return "VAProcDeinterlacingBob";
+            case VAProcDeinterlacingWeave: return "VAProcDeinterlacingWeave"; 
+            case VAProcDeinterlacingMotionAdaptive: return "VAProcDeinterlacingMotionAdaptive";
+            case VAProcDeinterlacingMotionCompensated: return "VAProcDeinterlacingMotionCompensated";
+            default:
+                break;
+    }
+    return "<unknown deinterlacing>";
+}
+
+static char * colorbalance_string (VAProcColorBalanceType type)
+{
+    switch (type) {
+            case VAProcColorBalanceNone: return "VAProcColorBalanceNone";
+            case VAProcColorBalanceHue: return "VAProcColorBalanceHue";
+            case VAProcColorBalanceSaturation: return "VAProcColorBalanceSaturation";
+            case VAProcColorBalanceBrightness: return "VAProcColorBalanceBrightness";
+            case VAProcColorBalanceContrast: return "VAProcColorBalanceContrast";
+            case VAProcColorBalanceAutoSaturation: return "VAProcColorBalanceAutoSaturation";
+            case VAProcColorBalanceAutoBrightness: return "VAProcColorBalanceAutoBrightness";
+            case VAProcColorBalanceAutoContrast: return "VAProcColorBalanceAutoContrast";
+            default:
+                break;
+    }
+    return "<unknown colorbalance>";
+}
+
 int main(int argc, const char* argv[])
 {
   VADisplay va_dpy;
@@ -94,11 +126,15 @@ int main(int argc, const char* argv[])
   const char *driver;
   const char *name = strrchr(argv[0], '/'); 
   VAProfile profile, *profile_list = NULL;
-  int num_profiles, max_num_profiles, i;
+  int num_profiles, max_num_profiles, i, j;
   VAEntrypoint entrypoint, entrypoints[10];
   int num_entrypoint;
   int ret_val = 0;
-  
+  VAConfigID va_config = VA_INVALID_ID;
+  VAContextID vpp_ctx = VA_INVALID_ID;
+  VAProcFilterType *filters = NULL;
+  int num_filters = VAProcFilterCount;
+
   if (name)
       name++;
   else
@@ -148,8 +184,89 @@ int main(int argc, const char* argv[])
       for (entrypoint = 0; entrypoint < num_entrypoint; entrypoint++)
           printf("      %-32s:	%s\n", profile_str, entrypoint_string(entrypoints[entrypoint]));
   }
+
+  va_status = vaCreateConfig(va_dpy, VAProfileNone,
+        VAEntrypointVideoProc, NULL, 0, &va_config);
+
+  va_status = vaCreateContext(va_dpy, va_config, 0, 0, 0,
+        NULL, 0, &vpp_ctx);
+
+  filters = malloc(num_filters * sizeof(*filters));
+  if (!filters)
+    goto error;
+  va_status = vaQueryVideoProcFilters(va_dpy, vpp_ctx, filters, &num_filters);
+
+  if (va_status == VA_STATUS_ERROR_MAX_NUM_EXCEEDED) {
+    VAProcFilterType * const new_filters =
+            realloc(filters, num_filters * sizeof(*new_filters));
+    if (!new_filters)
+      goto error;
+    filters = new_filters;
+
+    va_status = vaQueryVideoProcFilters(va_dpy, vpp_ctx, filters, &num_filters);
+  }
+
+  printf("\n%s: Supported VPP filters\n", name);
+  for (i = 0; i < num_filters; i++) {
+    switch (filters[i]) {
+      case VAProcFilterNoiseReduction:
+      {
+        unsigned int num = 1;
+        VAProcFilterCap caps[num];
+        vaQueryVideoProcFilterCaps(va_dpy, vpp_ctx, filters[i], &caps, &num);
+        printf ("      %-32s: %4.2f %4.2f %4.2f %4.5f\n",
+                "VAProcFilterNoiseReduction", caps[0].range.min_value,
+                caps[0].range.max_value, caps[0].range.default_value,
+                caps[0].range.step);
+        break;
+      }
+      case VAProcFilterDeinterlacing:
+      {
+        unsigned int num = VAProcDeinterlacingCount;
+        VAProcFilterCapDeinterlacing caps[num];
+        vaQueryVideoProcFilterCaps(va_dpy, vpp_ctx, filters[i], &caps, &num);
+        printf ("      %-32s:\n", "VAProcFilterDeinterlacing");
+        for (j = 0; j < num; j++)
+            printf ("          %s\n", deinterlacing_string (caps[j].type));
+        break;
+      }
+      case VAProcFilterSharpening:
+      {
+        unsigned int num = 1;
+        VAProcFilterCap caps[num];
+        vaQueryVideoProcFilterCaps(va_dpy, vpp_ctx, filters[i], &caps, &num);
+        printf ("      %-32s: %4.2f %4.2f %4.2f %4.5f\n",
+                "VAProcFilterSharpening", caps[0].range.min_value,
+                caps[0].range.max_value, caps[0].range.default_value,
+                caps[0].range.step);
+        break;
+      }
+      case VAProcFilterColorBalance:
+      {
+        unsigned int num = VAProcColorBalanceCount;
+        VAProcFilterCapColorBalance caps[num];
+        vaQueryVideoProcFilterCaps(va_dpy, vpp_ctx, filters[i], &caps, &num);
+        printf ("      %-32s:\n", "VAProcFilterColorBalance");
+        for (j = 0; j < num; j++)
+            printf ("          %-28s: %4.2f %4.2f %4.2f %4.2f\n",
+                colorbalance_string (caps[j].type), caps[j].range.min_value,
+                caps[j].range.max_value, caps[j].range.default_value,
+                caps[j].range.step);
+        break;
+      }
+      default:
+        break;
+    }
+  }
   
 error:
+  if (filters)
+    free (filters);
+  if (vpp_ctx != VA_INVALID_ID)
+    vaDestroyContext(va_dpy, vpp_ctx);
+  if (va_config != VA_INVALID_ID)
+    vaDestroyConfig(va_dpy, va_config);
+
   free(profile_list);
   vaTerminate(va_dpy);
   va_close_display(va_dpy);
-- 
2.5.0

_______________________________________________
Libva mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/libva

Reply via email to