1 /* 2 * Copyright (c) 2007 Intel Corporation. All Rights Reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the 6 * "Software"), to deal in the Software without restriction, including 7 * without limitation the rights to use, copy, modify, merge, publish, 8 * distribute, sub license, and/or sell copies of the Software, and to 9 * permit persons to whom the Software is furnished to do so, subject to 10 * the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the 13 * next paragraph) shall be included in all copies or substantial portions 14 * of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 /* 26 * Video Decode Acceleration -Backend API 27 */ 28 29 #ifndef _VA_BACKEND_H_ 30 #define _VA_BACKEND_H_ 31 32 #include <va/va.h> 33 #include <linux/videodev2.h> 34 35 typedef struct VADriverContext *VADriverContextP; 36 typedef struct VADisplayContext *VADisplayContextP; 37 38 /** \brief VA display types. */ 39 enum { 40 /** \brief Mask to major identifier for VA display type. */ 41 VA_DISPLAY_MAJOR_MASK = 0xf0, 42 43 /** \brief VA/X11 API is used, through vaGetDisplay() entry-point. */ 44 VA_DISPLAY_X11 = 0x10, 45 /** \brief VA/GLX API is used, through vaGetDisplayGLX() entry-point. */ 46 VA_DISPLAY_GLX = (VA_DISPLAY_X11 | (1 << 0)), 47 /** \brief VA/Android API is used, through vaGetDisplay() entry-point. */ 48 VA_DISPLAY_ANDROID = 0x20, 49 /** \brief VA/DRM API is used, through vaGetDisplayDRM() entry-point. */ 50 VA_DISPLAY_DRM = 0x30, 51 /** \brief VA/Wayland API is used, through vaGetDisplayWl() entry-point. */ 52 VA_DISPLAY_WAYLAND = 0x40, 53 }; 54 55 struct VADriverVTable 56 { 57 VAStatus (*vaTerminate) ( VADriverContextP ctx ); 58 59 VAStatus (*vaQueryConfigProfiles) ( 60 VADriverContextP ctx, 61 VAProfile *profile_list, /* out */ 62 int *num_profiles /* out */ 63 ); 64 65 VAStatus (*vaQueryConfigEntrypoints) ( 66 VADriverContextP ctx, 67 VAProfile profile, 68 VAEntrypoint *entrypoint_list, /* out */ 69 int *num_entrypoints /* out */ 70 ); 71 72 VAStatus (*vaGetConfigAttributes) ( 73 VADriverContextP ctx, 74 VAProfile profile, 75 VAEntrypoint entrypoint, 76 VAConfigAttrib *attrib_list, /* in/out */ 77 int num_attribs 78 ); 79 80 VAStatus (*vaCreateConfig) ( 81 VADriverContextP ctx, 82 VAProfile profile, 83 VAEntrypoint entrypoint, 84 VAConfigAttrib *attrib_list, 85 int num_attribs, 86 VAConfigID *config_id /* out */ 87 ); 88 89 VAStatus (*vaDestroyConfig) ( 90 VADriverContextP ctx, 91 VAConfigID config_id 92 ); 93 94 VAStatus (*vaQueryConfigAttributes) ( 95 VADriverContextP ctx, 96 VAConfigID config_id, 97 VAProfile *profile, /* out */ 98 VAEntrypoint *entrypoint, /* out */ 99 VAConfigAttrib *attrib_list, /* out */ 100 int *num_attribs /* out */ 101 ); 102 103 VAStatus (*vaCreateSurfaces) ( 104 VADriverContextP ctx, 105 int width, 106 int height, 107 int format, 108 int num_surfaces, 109 VASurfaceID *surfaces /* out */ 110 ); 111 112 VAStatus (*vaDestroySurfaces) ( 113 VADriverContextP ctx, 114 VASurfaceID *surface_list, 115 int num_surfaces 116 ); 117 118 VAStatus (*vaCreateContext) ( 119 VADriverContextP ctx, 120 VAConfigID config_id, 121 int picture_width, 122 int picture_height, 123 int flag, 124 VASurfaceID *render_targets, 125 int num_render_targets, 126 VAContextID *context /* out */ 127 ); 128 129 VAStatus (*vaDestroyContext) ( 130 VADriverContextP ctx, 131 VAContextID context 132 ); 133 134 VAStatus (*vaCreateBuffer) ( 135 VADriverContextP ctx, 136 VAContextID context, /* in */ 137 VABufferType type, /* in */ 138 unsigned int size, /* in */ 139 unsigned int num_elements, /* in */ 140 void *data, /* in */ 141 VABufferID *buf_id /* out */ 142 ); 143 144 VAStatus (*vaBufferSetNumElements) ( 145 VADriverContextP ctx, 146 VABufferID buf_id, /* in */ 147 unsigned int num_elements /* in */ 148 ); 149 150 VAStatus (*vaMapBuffer) ( 151 VADriverContextP ctx, 152 VABufferID buf_id, /* in */ 153 void **pbuf /* out */ 154 ); 155 156 VAStatus (*vaUnmapBuffer) ( 157 VADriverContextP ctx, 158 VABufferID buf_id /* in */ 159 ); 160 161 VAStatus (*vaDestroyBuffer) ( 162 VADriverContextP ctx, 163 VABufferID buffer_id 164 ); 165 166 VAStatus (*vaBeginPicture) ( 167 VADriverContextP ctx, 168 VAContextID context, 169 VASurfaceID render_target 170 ); 171 172 VAStatus (*vaRenderPicture) ( 173 VADriverContextP ctx, 174 VAContextID context, 175 VABufferID *buffers, 176 int num_buffers 177 ); 178 179 VAStatus (*vaEndPicture) ( 180 VADriverContextP ctx, 181 VAContextID context 182 ); 183 184 VAStatus (*vaSyncSurface) ( 185 VADriverContextP ctx, 186 VASurfaceID render_target 187 ); 188 189 VAStatus (*vaQuerySurfaceStatus) ( 190 VADriverContextP ctx, 191 VASurfaceID render_target, 192 VASurfaceStatus *status /* out */ 193 ); 194 195 VAStatus (*vaQuerySurfaceError) ( 196 VADriverContextP ctx, 197 VASurfaceID render_target, 198 VAStatus error_status, 199 void **error_info /*out*/ 200 ); 201 202 VAStatus (*vaPutSurface) ( 203 VADriverContextP ctx, 204 VASurfaceID surface, 205 void* draw, /* Drawable of window system */ 206 short srcx, 207 short srcy, 208 unsigned short srcw, 209 unsigned short srch, 210 short destx, 211 short desty, 212 unsigned short destw, 213 unsigned short desth, 214 VARectangle *cliprects, /* client supplied clip list */ 215 unsigned int number_cliprects, /* number of clip rects in the clip list */ 216 unsigned int flags /* de-interlacing flags */ 217 ); 218 219 VAStatus (*vaQueryImageFormats) ( 220 VADriverContextP ctx, 221 VAImageFormat *format_list, /* out */ 222 int *num_formats /* out */ 223 ); 224 225 VAStatus (*vaCreateImage) ( 226 VADriverContextP ctx, 227 VAImageFormat *format, 228 int width, 229 int height, 230 VAImage *image /* out */ 231 ); 232 233 VAStatus (*vaDeriveImage) ( 234 VADriverContextP ctx, 235 VASurfaceID surface, 236 VAImage *image /* out */ 237 ); 238 239 VAStatus (*vaDestroyImage) ( 240 VADriverContextP ctx, 241 VAImageID image 242 ); 243 244 VAStatus (*vaSetImagePalette) ( 245 VADriverContextP ctx, 246 VAImageID image, 247 /* 248 * pointer to an array holding the palette data. The size of the array is 249 * num_palette_entries * entry_bytes in size. The order of the components 250 * in the palette is described by the component_order in VAImage struct 251 */ 252 unsigned char *palette 253 ); 254 255 VAStatus (*vaGetImage) ( 256 VADriverContextP ctx, 257 VASurfaceID surface, 258 int x, /* coordinates of the upper left source pixel */ 259 int y, 260 unsigned int width, /* width and height of the region */ 261 unsigned int height, 262 VAImageID image 263 ); 264 265 VAStatus (*vaPutImage) ( 266 VADriverContextP ctx, 267 VASurfaceID surface, 268 VAImageID image, 269 int src_x, 270 int src_y, 271 unsigned int src_width, 272 unsigned int src_height, 273 int dest_x, 274 int dest_y, 275 unsigned int dest_width, 276 unsigned int dest_height 277 ); 278 279 VAStatus (*vaQuerySubpictureFormats) ( 280 VADriverContextP ctx, 281 VAImageFormat *format_list, /* out */ 282 unsigned int *flags, /* out */ 283 unsigned int *num_formats /* out */ 284 ); 285 286 VAStatus (*vaCreateSubpicture) ( 287 VADriverContextP ctx, 288 VAImageID image, 289 VASubpictureID *subpicture /* out */ 290 ); 291 292 VAStatus (*vaDestroySubpicture) ( 293 VADriverContextP ctx, 294 VASubpictureID subpicture 295 ); 296 297 VAStatus (*vaSetSubpictureImage) ( 298 VADriverContextP ctx, 299 VASubpictureID subpicture, 300 VAImageID image 301 ); 302 303 VAStatus (*vaSetSubpictureChromakey) ( 304 VADriverContextP ctx, 305 VASubpictureID subpicture, 306 unsigned int chromakey_min, 307 unsigned int chromakey_max, 308 unsigned int chromakey_mask 309 ); 310 311 VAStatus (*vaSetSubpictureGlobalAlpha) ( 312 VADriverContextP ctx, 313 VASubpictureID subpicture, 314 float global_alpha 315 ); 316 317 VAStatus (*vaAssociateSubpicture) ( 318 VADriverContextP ctx, 319 VASubpictureID subpicture, 320 VASurfaceID *target_surfaces, 321 int num_surfaces, 322 short src_x, /* upper left offset in subpicture */ 323 short src_y, 324 unsigned short src_width, 325 unsigned short src_height, 326 short dest_x, /* upper left offset in surface */ 327 short dest_y, 328 unsigned short dest_width, 329 unsigned short dest_height, 330 /* 331 * whether to enable chroma-keying or global-alpha 332 * see VA_SUBPICTURE_XXX values 333 */ 334 unsigned int flags 335 ); 336 337 VAStatus (*vaDeassociateSubpicture) ( 338 VADriverContextP ctx, 339 VASubpictureID subpicture, 340 VASurfaceID *target_surfaces, 341 int num_surfaces 342 ); 343 344 VAStatus (*vaQueryDisplayAttributes) ( 345 VADriverContextP ctx, 346 VADisplayAttribute *attr_list, /* out */ 347 int *num_attributes /* out */ 348 ); 349 350 VAStatus (*vaGetDisplayAttributes) ( 351 VADriverContextP ctx, 352 VADisplayAttribute *attr_list, /* in/out */ 353 int num_attributes 354 ); 355 356 VAStatus (*vaSetDisplayAttributes) ( 357 VADriverContextP ctx, 358 VADisplayAttribute *attr_list, 359 int num_attributes 360 ); 361 362 /* used by va trace */ 363 VAStatus (*vaBufferInfo) ( 364 VADriverContextP ctx, /* in */ 365 VABufferID buf_id, /* in */ 366 VABufferType *type, /* out */ 367 unsigned int *size, /* out */ 368 unsigned int *num_elements /* out */ 369 ); 370 371 /* lock/unlock surface for external access */ 372 VAStatus (*vaLockSurface) ( 373 VADriverContextP ctx, 374 VASurfaceID surface, 375 unsigned int *fourcc, /* out for follow argument */ 376 unsigned int *luma_stride, 377 unsigned int *chroma_u_stride, 378 unsigned int *chroma_v_stride, 379 unsigned int *luma_offset, 380 unsigned int *chroma_u_offset, 381 unsigned int *chroma_v_offset, 382 unsigned int *buffer_name, /* if it is not NULL, assign the low lever 383 * surface buffer name 384 */ 385 void **buffer /* if it is not NULL, map the surface buffer for 386 * CPU access 387 */ 388 ); 389 390 VAStatus (*vaUnlockSurface) ( 391 VADriverContextP ctx, 392 VASurfaceID surface 393 ); 394 395 /* DEPRECATED */ 396 VAStatus 397 (*vaGetSurfaceAttributes)( 398 VADriverContextP dpy, 399 VAConfigID config, 400 VASurfaceAttrib *attrib_list, 401 unsigned int num_attribs 402 ); 403 404 VAStatus 405 (*vaCreateSurfaces2)( 406 VADriverContextP ctx, 407 unsigned int format, 408 unsigned int width, 409 unsigned int height, 410 VASurfaceID *surfaces, 411 unsigned int num_surfaces, 412 VASurfaceAttrib *attrib_list, 413 unsigned int num_attribs 414 ); 415 416 VAStatus 417 (*vaQuerySurfaceAttributes)( 418 VADriverContextP dpy, 419 VAConfigID config, 420 VASurfaceAttrib *attrib_list, 421 unsigned int *num_attribs 422 ); 423 }; 424 425 struct VADriverContext 426 { 427 void *pDriverData; 428 429 /** 430 * The core VA implementation hooks. 431 * 432 * This structure is allocated from libva with calloc(). 433 */ 434 struct VADriverVTable *vtable; 435 436 /** 437 * The VA/GLX implementation hooks. 438 * 439 * This structure is intended for drivers that implement the 440 * VA/GLX API. The driver implementation is responsible for the 441 * allocation and deallocation of this structure. 442 */ 443 struct VADriverVTableGLX *vtable_glx; 444 445 /** 446 * The VA/EGL implementation hooks. 447 * 448 * This structure is intended for drivers that implement the 449 * VA/EGL API. The driver implementation is responsible for the 450 * allocation and deallocation of this structure. 451 */ 452 struct VADriverVTableEGL *vtable_egl; 453 454 /** 455 * The third-party/private implementation hooks. 456 * 457 * This structure is intended for drivers that implement the 458 * private API. The driver implementation is responsible for the 459 * allocation and deallocation of this structure. 460 */ 461 void *vtable_tpi; 462 463 void *native_dpy; 464 int x11_screen; 465 int version_major; 466 int version_minor; 467 int max_profiles; 468 int max_entrypoints; 469 int max_attributes; 470 int max_image_formats; 471 int max_subpic_formats; 472 int max_display_attributes; 473 const char *str_vendor; 474 475 void *handle; /* dlopen handle */ 476 477 /** 478 * \brief DRM state. 479 * 480 * This field holds driver specific data for DRM-based 481 * drivers. This structure is allocated from libva with 482 * calloc(). Do not deallocate from within VA driver 483 * implementations. 484 * 485 * All structures shall be derived from struct drm_state. So, for 486 * instance, this field holds a dri_state structure for VA/X11 487 * drivers that use the DRM protocol. 488 */ 489 void *drm_state; 490 491 void *glx; /* opaque for GLX code */ 492 493 /** \brief VA display type. */ 494 unsigned long display_type; 495 496 /** 497 * The VA/Wayland implementation hooks. 498 * 499 * This structure is intended for drivers that implement the 500 * VA/Wayland API. libVA allocates this structure with calloc() 501 * and owns the resulting memory. 502 */ 503 struct VADriverVTableWayland *vtable_wayland; 504 505 /** 506 * \brief The VA/VPP implementation hooks. 507 * 508 * This structure is allocated from libva with calloc(). 509 */ 510 struct VADriverVTableVPP *vtable_vpp; 511 512 unsigned long reserved[42]; /* reserve for future add-ins, decrease the subscript accordingly */ 513 }; 514 515 #define VA_DISPLAY_MAGIC 0x56414430 /* VAD0 */ 516 struct VADisplayContext 517 { 518 int vadpy_magic; 519 520 VADisplayContextP pNext; 521 VADriverContextP pDriverContext; 522 523 int (*vaIsValid) ( 524 VADisplayContextP ctx 525 ); 526 527 void (*vaDestroy) ( 528 VADisplayContextP ctx 529 ); 530 531 VAStatus (*vaGetDriverName) ( 532 VADisplayContextP ctx, 533 char **driver_name 534 ); 535 536 void *opaque; /* opaque for display extensions (e.g. GLX) */ 537 }; 538 539 typedef VAStatus (*VADriverInit) ( 540 VADriverContextP driver_context 541 ); 542 543 #endif /* _VA_BACKEND_H_ */ 544