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