19e5bca2287057f03b3babdcca42487c0d7ba359fwangkun/*
29e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * Copyright (c) 2007 Intel Corporation. All Rights Reserved.
39e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *
49e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * Permission is hereby granted, free of charge, to any person obtaining a
59e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * copy of this software and associated documentation files (the
69e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * "Software"), to deal in the Software without restriction, including
79e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * without limitation the rights to use, copy, modify, merge, publish,
89e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * distribute, sub license, and/or sell copies of the Software, and to
99e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * permit persons to whom the Software is furnished to do so, subject to
109e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * the following conditions:
119e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *
129e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * The above copyright notice and this permission notice (including the
139e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * next paragraph) shall be included in all copies or substantial portions
149e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * of the Software.
159e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *
169e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
179e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
189e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
199e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
209e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
219e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
229e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
239e5bca2287057f03b3babdcca42487c0d7ba359fwangkun */
249e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
25409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include "sysdeps.h"
269e5bca2287057f03b3babdcca42487c0d7ba359fwangkun#include <stdarg.h>
279e5bca2287057f03b3babdcca42487c0d7ba359fwangkun#include <stdio.h>
289e5bca2287057f03b3babdcca42487c0d7ba359fwangkun#include <string.h>
299e5bca2287057f03b3babdcca42487c0d7ba359fwangkun#include <stdlib.h>
30409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include "va_display.h"
319e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
329e5bca2287057f03b3babdcca42487c0d7ba359fwangkun#define CHECK_VASTATUS(va_status,func, ret)                             \
339e5bca2287057f03b3babdcca42487c0d7ba359fwangkunif (va_status != VA_STATUS_SUCCESS) {                                   \
349e5bca2287057f03b3babdcca42487c0d7ba359fwangkun    fprintf(stderr,"%s failed with error code %d (%s),exit\n",func, va_status, vaErrorStr(va_status)); \
3510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    ret_val = ret;                                                      \
3610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    goto error;                                                         \
379e5bca2287057f03b3babdcca42487c0d7ba359fwangkun}
389e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
399e5bca2287057f03b3babdcca42487c0d7ba359fwangkunstatic char * profile_string(VAProfile profile)
409e5bca2287057f03b3babdcca42487c0d7ba359fwangkun{
419e5bca2287057f03b3babdcca42487c0d7ba359fwangkun    switch (profile) {
424b672db6ee89c9846451bbab23cf18e93c4260b2hding            case VAProfileNone: return "VAProfileNone";
439e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAProfileMPEG2Simple: return "VAProfileMPEG2Simple";
449e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAProfileMPEG2Main: return "VAProfileMPEG2Main";
459e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAProfileMPEG4Simple: return "VAProfileMPEG4Simple";
469e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAProfileMPEG4AdvancedSimple: return "VAProfileMPEG4AdvancedSimple";
479e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAProfileMPEG4Main: return "VAProfileMPEG4Main";
489e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAProfileH264Baseline: return "VAProfileH264Baseline";
499e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAProfileH264Main: return "VAProfileH264Main";
509e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAProfileH264High: return "VAProfileH264High";
519e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAProfileVC1Simple: return "VAProfileVC1Simple";
529e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAProfileVC1Main: return "VAProfileVC1Main";
539e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAProfileVC1Advanced: return "VAProfileVC1Advanced";
549e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAProfileH263Baseline: return "VAProfileH263Baseline";
559e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAProfileH264ConstrainedBaseline: return "VAProfileH264ConstrainedBaseline";
564b672db6ee89c9846451bbab23cf18e93c4260b2hding            case VAProfileJPEGBaseline: return "VAProfileJPEGBaseline";
57409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan            case VAProfileH264MultiviewHigh: return "VAProfileH264MultiviewHigh";
58409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan            case VAProfileH264StereoHigh: return "VAProfileH264StereoHigh";
59409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan            case VAProfileVP8Version0_3: return "VAProfileVP8Version0_3";
60409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
614b672db6ee89c9846451bbab23cf18e93c4260b2hding            default:
624b672db6ee89c9846451bbab23cf18e93c4260b2hding                break;
639e5bca2287057f03b3babdcca42487c0d7ba359fwangkun    }
649e5bca2287057f03b3babdcca42487c0d7ba359fwangkun    return "<unknown profile>";
659e5bca2287057f03b3babdcca42487c0d7ba359fwangkun}
669e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
679e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
689e5bca2287057f03b3babdcca42487c0d7ba359fwangkunstatic char * entrypoint_string(VAEntrypoint entrypoint)
699e5bca2287057f03b3babdcca42487c0d7ba359fwangkun{
709e5bca2287057f03b3babdcca42487c0d7ba359fwangkun    switch (entrypoint) {
719e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAEntrypointVLD:return "VAEntrypointVLD";
729e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAEntrypointIZZ:return "VAEntrypointIZZ";
739e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAEntrypointIDCT:return "VAEntrypointIDCT";
749e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAEntrypointMoComp:return "VAEntrypointMoComp";
759e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAEntrypointDeblocking:return "VAEntrypointDeblocking";
769e5bca2287057f03b3babdcca42487c0d7ba359fwangkun            case VAEntrypointEncSlice:return "VAEntrypointEncSlice";
774b672db6ee89c9846451bbab23cf18e93c4260b2hding            case VAEntrypointEncPicture:return "VAEntrypointEncPicture";
784b672db6ee89c9846451bbab23cf18e93c4260b2hding            case VAEntrypointVideoProc:return "VAEntrypointVideoProc";
794b672db6ee89c9846451bbab23cf18e93c4260b2hding            default:
804b672db6ee89c9846451bbab23cf18e93c4260b2hding                break;
819e5bca2287057f03b3babdcca42487c0d7ba359fwangkun    }
829e5bca2287057f03b3babdcca42487c0d7ba359fwangkun    return "<unknown entrypoint>";
839e5bca2287057f03b3babdcca42487c0d7ba359fwangkun}
849e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
859e5bca2287057f03b3babdcca42487c0d7ba359fwangkunint main(int argc, const char* argv[])
869e5bca2287057f03b3babdcca42487c0d7ba359fwangkun{
879e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  VADisplay va_dpy;
889e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  VAStatus va_status;
899e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  int major_version, minor_version;
909e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  const char *driver;
919e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  const char *name = strrchr(argv[0], '/');
9210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  VAProfile profile, *profile_list = NULL;
9310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  int num_profiles, max_num_profiles, i;
949e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  VAEntrypoint entrypoint, entrypoints[10];
959e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  int num_entrypoint;
9610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  int ret_val = 0;
979e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
989e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  if (name)
999e5bca2287057f03b3babdcca42487c0d7ba359fwangkun      name++;
1009e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  else
1019e5bca2287057f03b3babdcca42487c0d7ba359fwangkun      name = argv[0];
1029e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
103409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan  va_dpy = va_open_display();
1049e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  if (NULL == va_dpy)
1059e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  {
1069e5bca2287057f03b3babdcca42487c0d7ba359fwangkun      fprintf(stderr, "%s: vaGetDisplay() failed\n", name);
1079e5bca2287057f03b3babdcca42487c0d7ba359fwangkun      return 2;
1089e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  }
1099e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
1109e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  va_status = vaInitialize(va_dpy, &major_version, &minor_version);
1119e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  CHECK_VASTATUS(va_status, "vaInitialize", 3);
1129e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
1134b672db6ee89c9846451bbab23cf18e93c4260b2hding  printf("%s: VA-API version: %d.%d (libva %s)\n",
1144b672db6ee89c9846451bbab23cf18e93c4260b2hding         name, major_version, minor_version, LIBVA_VERSION_S);
1159e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
1169e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  driver = vaQueryVendorString(va_dpy);
1179e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  printf("%s: Driver version: %s\n", name, driver ? driver : "<unknown>");
1189e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
1199e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  printf("%s: Supported profile and entrypoints\n", name);
12010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  max_num_profiles = vaMaxNumProfiles(va_dpy);
12110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  profile_list = malloc(max_num_profiles * sizeof(VAProfile));
12210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
12310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  if (!profile_list) {
12410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan      printf("Failed to allocate memory for profile list\n");
12510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan      ret_val = 5;
12610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan      goto error;
12710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  }
12810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
12910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  va_status = vaQueryConfigProfiles(va_dpy, profile_list, &num_profiles);
13010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  CHECK_VASTATUS(va_status, "vaQueryConfigProfiles", 6);
13110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
13210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  for (i = 0; i < num_profiles; i++) {
1339e5bca2287057f03b3babdcca42487c0d7ba359fwangkun      char *profile_str;
1349e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
13510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan      profile = profile_list[i];
1369e5bca2287057f03b3babdcca42487c0d7ba359fwangkun      va_status = vaQueryConfigEntrypoints(va_dpy, profile, entrypoints,
1379e5bca2287057f03b3babdcca42487c0d7ba359fwangkun                                           &num_entrypoint);
1389e5bca2287057f03b3babdcca42487c0d7ba359fwangkun      if (va_status == VA_STATUS_ERROR_UNSUPPORTED_PROFILE)
1399e5bca2287057f03b3babdcca42487c0d7ba359fwangkun	continue;
1409e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
1419e5bca2287057f03b3babdcca42487c0d7ba359fwangkun      CHECK_VASTATUS(va_status, "vaQueryConfigEntrypoints", 4);
1429e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
1439e5bca2287057f03b3babdcca42487c0d7ba359fwangkun      profile_str = profile_string(profile);
1449e5bca2287057f03b3babdcca42487c0d7ba359fwangkun      for (entrypoint = 0; entrypoint < num_entrypoint; entrypoint++)
1459e5bca2287057f03b3babdcca42487c0d7ba359fwangkun          printf("      %-32s:	%s\n", profile_str, entrypoint_string(entrypoints[entrypoint]));
1469e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  }
1479e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
14810d94aff40fa7cb9349f839613856ea37327268cAustin Yuanerror:
14910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  free(profile_list);
1509e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  vaTerminate(va_dpy);
151409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan  va_close_display(va_dpy);
1529e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
15310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  return ret_val;
1549e5bca2287057f03b3babdcca42487c0d7ba359fwangkun}
155