OSDN Git Service

add support for processing rate
[android-x86/hardware-intel-common-libva.git] / va / va_backend.h
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/DRM API is used, with a render-node device path */
52     VA_DISPLAY_DRM_RENDERNODES = (VA_DISPLAY_DRM | (1 << 0)),
53     /** \brief VA/Wayland API is used, through vaGetDisplayWl() entry-point. */
54     VA_DISPLAY_WAYLAND  = 0x40,
55 };
56
57 struct VADriverVTable
58 {
59         VAStatus (*vaTerminate) ( VADriverContextP ctx );
60
61         VAStatus (*vaQueryConfigProfiles) (
62                 VADriverContextP ctx,
63                 VAProfile *profile_list,        /* out */
64                 int *num_profiles                       /* out */
65         );
66
67         VAStatus (*vaQueryConfigEntrypoints) (
68                 VADriverContextP ctx,
69                 VAProfile profile,
70                 VAEntrypoint  *entrypoint_list, /* out */
71                 int *num_entrypoints                    /* out */
72         );
73
74         VAStatus (*vaGetConfigAttributes) (
75                 VADriverContextP ctx,
76                 VAProfile profile,
77                 VAEntrypoint entrypoint,
78                 VAConfigAttrib *attrib_list,    /* in/out */
79                 int num_attribs
80         );
81
82         VAStatus (*vaCreateConfig) (
83                 VADriverContextP ctx,
84                 VAProfile profile, 
85                 VAEntrypoint entrypoint, 
86                 VAConfigAttrib *attrib_list,
87                 int num_attribs,
88                 VAConfigID *config_id           /* out */
89         );
90
91         VAStatus (*vaDestroyConfig) (
92                 VADriverContextP ctx,
93                 VAConfigID config_id
94         );
95
96         VAStatus (*vaQueryConfigAttributes) (
97                 VADriverContextP ctx,
98                 VAConfigID config_id, 
99                 VAProfile *profile,             /* out */
100                 VAEntrypoint *entrypoint,       /* out */
101                 VAConfigAttrib *attrib_list,    /* out */
102                 int *num_attribs                /* out */
103         );
104
105         VAStatus (*vaCreateSurfaces) (
106                 VADriverContextP ctx,
107                 int width,
108                 int height,
109                 int format,
110                 int num_surfaces,
111                 VASurfaceID *surfaces           /* out */
112         );
113
114         VAStatus (*vaDestroySurfaces) (
115                 VADriverContextP ctx,
116                 VASurfaceID *surface_list,
117                 int num_surfaces
118         );
119
120         VAStatus (*vaCreateContext) (
121                 VADriverContextP ctx,
122                 VAConfigID config_id,
123                 int picture_width,
124                 int picture_height,
125                 int flag,
126                 VASurfaceID *render_targets,
127                 int num_render_targets,
128                 VAContextID *context            /* out */
129         );
130
131         VAStatus (*vaDestroyContext) (
132                 VADriverContextP ctx,
133                 VAContextID context
134         );
135
136         VAStatus (*vaCreateBuffer) (
137                 VADriverContextP ctx,
138                 VAContextID context,            /* in */
139                 VABufferType type,              /* in */
140                 unsigned int size,              /* in */
141                 unsigned int num_elements,      /* in */
142                 void *data,                     /* in */
143                 VABufferID *buf_id
144         );
145
146         VAStatus (*vaBufferSetNumElements) (
147                 VADriverContextP ctx,
148                 VABufferID buf_id,      /* in */
149                 unsigned int num_elements       /* in */
150         );
151
152         VAStatus (*vaMapBuffer) (
153                 VADriverContextP ctx,
154                 VABufferID buf_id,      /* in */
155                 void **pbuf         /* out */
156         );
157
158         VAStatus (*vaUnmapBuffer) (
159                 VADriverContextP ctx,
160                 VABufferID buf_id       /* in */
161         );
162
163         VAStatus (*vaDestroyBuffer) (
164                 VADriverContextP ctx,
165                 VABufferID buffer_id
166         );
167
168         VAStatus (*vaBeginPicture) (
169                 VADriverContextP ctx,
170                 VAContextID context,
171                 VASurfaceID render_target
172         );
173
174         VAStatus (*vaRenderPicture) (
175                 VADriverContextP ctx,
176                 VAContextID context,
177                 VABufferID *buffers,
178                 int num_buffers
179         );
180
181         VAStatus (*vaEndPicture) (
182                 VADriverContextP ctx,
183                 VAContextID context
184         );
185
186         VAStatus (*vaSyncSurface) (
187                 VADriverContextP ctx,
188                 VASurfaceID render_target
189         );
190
191         VAStatus (*vaQuerySurfaceStatus) (
192                 VADriverContextP ctx,
193                 VASurfaceID render_target,
194                 VASurfaceStatus *status /* out */
195         );
196
197         VAStatus (*vaQuerySurfaceError) (
198                 VADriverContextP ctx,
199                 VASurfaceID render_target,
200                 VAStatus error_status,
201                 void **error_info /*out*/
202         );
203
204         VAStatus (*vaPutSurface) (
205                 VADriverContextP ctx,
206                 VASurfaceID surface,
207                 void* draw, /* Drawable of window system */
208                 short srcx,
209                 short srcy,
210                 unsigned short srcw,
211                 unsigned short srch,
212                 short destx,
213                 short desty,
214                 unsigned short destw,
215                 unsigned short desth,
216                 VARectangle *cliprects, /* client supplied clip list */
217                 unsigned int number_cliprects, /* number of clip rects in the clip list */
218                 unsigned int flags /* de-interlacing flags */
219         );
220
221         VAStatus (*vaQueryImageFormats) (
222                 VADriverContextP ctx,
223                 VAImageFormat *format_list,        /* out */
224                 int *num_formats           /* out */
225         );
226
227         VAStatus (*vaCreateImage) (
228                 VADriverContextP ctx,
229                 VAImageFormat *format,
230                 int width,
231                 int height,
232                 VAImage *image     /* out */
233         );
234
235         VAStatus (*vaDeriveImage) (
236                 VADriverContextP ctx,
237                 VASurfaceID surface,
238                 VAImage *image     /* out */
239         );
240
241         VAStatus (*vaDestroyImage) (
242                 VADriverContextP ctx,
243                 VAImageID image
244         );
245         
246         VAStatus (*vaSetImagePalette) (
247                 VADriverContextP ctx,
248                 VAImageID image,
249                 /*
250                  * pointer to an array holding the palette data.  The size of the array is
251                  * num_palette_entries * entry_bytes in size.  The order of the components
252                  * in the palette is described by the component_order in VAImage struct
253                  */
254                 unsigned char *palette
255         );
256         
257         VAStatus (*vaGetImage) (
258                 VADriverContextP ctx,
259                 VASurfaceID surface,
260                 int x,     /* coordinates of the upper left source pixel */
261                 int y,
262                 unsigned int width, /* width and height of the region */
263                 unsigned int height,
264                 VAImageID image
265         );
266
267         VAStatus (*vaPutImage) (
268                 VADriverContextP ctx,
269                 VASurfaceID surface,
270                 VAImageID image,
271                 int src_x,
272                 int src_y,
273                 unsigned int src_width,
274                 unsigned int src_height,
275                 int dest_x,
276                 int dest_y,
277                 unsigned int dest_width,
278                 unsigned int dest_height
279         );
280
281         VAStatus (*vaQuerySubpictureFormats) (
282                 VADriverContextP ctx,
283                 VAImageFormat *format_list,        /* out */
284                 unsigned int *flags,       /* out */
285                 unsigned int *num_formats  /* out */
286         );
287
288         VAStatus (*vaCreateSubpicture) (
289                 VADriverContextP ctx,
290                 VAImageID image,
291                 VASubpictureID *subpicture   /* out */
292         );
293
294         VAStatus (*vaDestroySubpicture) (
295                 VADriverContextP ctx,
296                 VASubpictureID subpicture
297         );
298
299         VAStatus (*vaSetSubpictureImage) (
300                 VADriverContextP ctx,
301                 VASubpictureID subpicture,
302                 VAImageID image
303         );
304
305         VAStatus (*vaSetSubpictureChromakey) (
306                 VADriverContextP ctx,
307                 VASubpictureID subpicture,
308                 unsigned int chromakey_min,
309                 unsigned int chromakey_max,
310                 unsigned int chromakey_mask
311         );
312
313         VAStatus (*vaSetSubpictureGlobalAlpha) (
314                 VADriverContextP ctx,
315                 VASubpictureID subpicture,
316                 float global_alpha 
317         );
318
319         VAStatus (*vaAssociateSubpicture) (
320                 VADriverContextP ctx,
321                 VASubpictureID subpicture,
322                 VASurfaceID *target_surfaces,
323                 int num_surfaces,
324                 short src_x, /* upper left offset in subpicture */
325                 short src_y,
326                 unsigned short src_width,
327                 unsigned short src_height,
328                 short dest_x, /* upper left offset in surface */
329                 short dest_y,
330                 unsigned short dest_width,
331                 unsigned short dest_height,
332                 /*
333                  * whether to enable chroma-keying or global-alpha
334                  * see VA_SUBPICTURE_XXX values
335                  */
336                 unsigned int flags
337         );
338
339         VAStatus (*vaDeassociateSubpicture) (
340                 VADriverContextP ctx,
341                 VASubpictureID subpicture,
342                 VASurfaceID *target_surfaces,
343                 int num_surfaces
344         );
345
346         VAStatus (*vaQueryDisplayAttributes) (
347                 VADriverContextP ctx,
348                 VADisplayAttribute *attr_list,  /* out */
349                 int *num_attributes             /* out */
350         );
351
352         VAStatus (*vaGetDisplayAttributes) (
353                 VADriverContextP ctx,
354                 VADisplayAttribute *attr_list,  /* in/out */
355                 int num_attributes
356         );
357         
358         VAStatus (*vaSetDisplayAttributes) (
359                 VADriverContextP ctx,
360                 VADisplayAttribute *attr_list,
361                 int num_attributes
362         );
363
364         /* used by va trace */        
365         VAStatus (*vaBufferInfo) (
366                    VADriverContextP ctx,      /* in */
367                    VABufferID buf_id,         /* in */
368                    VABufferType *type,        /* out */
369                    unsigned int *size,        /* out */
370                    unsigned int *num_elements /* out */
371         );
372
373         /* lock/unlock surface for external access */    
374         VAStatus (*vaLockSurface) (
375                 VADriverContextP ctx,
376                 VASurfaceID surface,
377                 unsigned int *fourcc, /* out  for follow argument */
378                 unsigned int *luma_stride,
379                 unsigned int *chroma_u_stride,
380                 unsigned int *chroma_v_stride,
381                 unsigned int *luma_offset,
382                 unsigned int *chroma_u_offset,
383                 unsigned int *chroma_v_offset,
384                 unsigned int *buffer_name, /* if it is not NULL, assign the low lever
385                                             * surface buffer name
386                                             */
387                 void **buffer /* if it is not NULL, map the surface buffer for
388                                 * CPU access
389                                 */
390         );
391     
392         VAStatus (*vaUnlockSurface) (
393                 VADriverContextP ctx,
394                 VASurfaceID surface
395         );
396
397         /* DEPRECATED */
398         VAStatus
399         (*vaGetSurfaceAttributes)(
400             VADriverContextP    dpy,
401             VAConfigID          config,
402             VASurfaceAttrib    *attrib_list,
403             unsigned int        num_attribs
404         );
405
406         VAStatus
407         (*vaCreateSurfaces2)(
408             VADriverContextP    ctx,
409             unsigned int        format,
410             unsigned int        width,
411             unsigned int        height,
412             VASurfaceID        *surfaces,
413             unsigned int        num_surfaces,
414             VASurfaceAttrib    *attrib_list,
415             unsigned int        num_attribs
416         );
417
418         VAStatus
419         (*vaQuerySurfaceAttributes)(
420             VADriverContextP    dpy,
421             VAConfigID          config,
422             VASurfaceAttrib    *attrib_list,
423             unsigned int       *num_attribs
424         );
425
426         VAStatus
427         (*vaAcquireBufferHandle)(
428             VADriverContextP    ctx,
429             VABufferID          buf_id,         /* in */
430             VABufferInfo *      buf_info        /* in/out */
431         );
432
433         VAStatus
434         (*vaReleaseBufferHandle)(
435             VADriverContextP    ctx,
436             VABufferID          buf_id          /* in */
437         );
438
439         VAStatus (*vaCreateMFContext) (
440             VADriverContextP ctx,
441             VAMFContextID *mfe_context    /* out */
442         );
443
444         VAStatus (*vaMFAddContext) (
445             VADriverContextP ctx,
446             VAMFContextID mf_context,
447             VAContextID context
448         );
449
450         VAStatus (*vaMFReleaseContext) (
451             VADriverContextP ctx,
452             VAMFContextID mf_context,
453             VAContextID context
454         );
455
456         VAStatus (*vaMFSubmit) (
457             VADriverContextP ctx,
458             VAMFContextID mf_context,
459             VAContextID *contexts,
460             int num_contexts
461         );
462         VAStatus (*vaCreateBuffer2) (
463             VADriverContextP ctx,
464             VAContextID context,                /* in */
465             VABufferType type,                  /* in */
466             unsigned int width,                 /* in */
467             unsigned int height,                /* in */
468             unsigned int *unit_size,            /* out */
469             unsigned int *pitch,                /* out */
470             VABufferID *buf_id                  /* out */
471         );
472
473         VAStatus (*vaQueryProcessingRate) (
474             VADriverContextP ctx,               /* in */
475             VAConfigID config_id,               /* in */
476             VAProcessingRateParameter *proc_buf,/* in */
477             unsigned int *processing_rate       /* out */
478         );
479         /** \brief Reserved bytes for future use, must be zero */
480         unsigned long reserved[58];
481 };
482
483 struct VADriverContext
484 {
485     void *pDriverData;
486
487     /**
488      * The core VA implementation hooks.
489      *
490      * This structure is allocated from libva with calloc().
491      */
492     struct VADriverVTable *vtable;
493
494     /**
495      * The VA/GLX implementation hooks.
496      *
497      * This structure is intended for drivers that implement the
498      * VA/GLX API. The driver implementation is responsible for the
499      * allocation and deallocation of this structure.
500      */
501     struct VADriverVTableGLX *vtable_glx;
502
503     /**
504      * The VA/EGL implementation hooks.
505      *
506      * This structure is intended for drivers that implement the
507      * VA/EGL API. The driver implementation is responsible for the
508      * allocation and deallocation of this structure.
509      */
510     struct VADriverVTableEGL *vtable_egl;
511
512     /**
513      * The third-party/private implementation hooks.
514      *
515      * This structure is intended for drivers that implement the
516      * private API. The driver implementation is responsible for the
517      * allocation and deallocation of this structure.
518      */
519     void *vtable_tpi;
520
521     void *native_dpy;
522     int x11_screen;
523     int version_major;
524     int version_minor;
525     int max_profiles;
526     int max_entrypoints;
527     int max_attributes;
528     int max_image_formats;
529     int max_subpic_formats;
530     int max_display_attributes;
531     const char *str_vendor;
532
533     void *handle;                       /* dlopen handle */
534
535     /**
536      * \brief DRM state.
537      *
538      * This field holds driver specific data for DRM-based
539      * drivers. This structure is allocated from libva with
540      * calloc(). Do not deallocate from within VA driver
541      * implementations.
542      *
543      * All structures shall be derived from struct drm_state. So, for
544      * instance, this field holds a dri_state structure for VA/X11
545      * drivers that use the DRM protocol.
546      */
547     void *drm_state;
548
549     void *glx;                          /* opaque for GLX code */
550
551     /** \brief VA display type. */
552     unsigned long display_type;
553
554     /**
555      * The VA/Wayland implementation hooks.
556      *
557      * This structure is intended for drivers that implement the
558      * VA/Wayland API. libVA allocates this structure with calloc()
559      * and owns the resulting memory.
560      */
561     struct VADriverVTableWayland *vtable_wayland;
562
563     /**
564      * \brief The VA/VPP implementation hooks.
565      *
566      * This structure is allocated from libva with calloc().
567      */
568     struct VADriverVTableVPP *vtable_vpp;
569
570     char *override_driver_name;
571
572     void *pDisplayContext;
573
574     /**
575      * Error callback.
576      *
577      * This is set by libva when the driver is opened, and will not be
578      * changed thereafter.  The driver can call it with an error message,
579      * which will be propagated to the API user through their error
580      * callbacks, or sent to a default output if no callback is available.
581      *
582      * It is expected that end users will always be able to see these
583      * messages, so it should be called only for serious errors.  For
584      * example, hardware problems or fatal configuration errors.
585      *
586      * @param pDriverContext  Pointer to the driver context structure
587      *                        being used by the current driver.
588      * @param message  Message to send to the API user.  This must be a
589      *                 null-terminated string.
590      */
591     void (*error_callback)(VADriverContextP pDriverContext,
592                            const char *message);
593     /**
594      * Info callback.
595      *
596      * This has the same behaviour as the error callback, but has its
597      * own set of callbacks to the API user.
598      *
599      * It should be used for informational messages which may be useful
600      * for an application programmer or for debugging.  For example, minor
601      * configuration errors, or information about the reason when another
602      * API call generates an error return.  It is not expected that end
603      * users will see these messages.
604      *
605      * @param pDriverContext  Pointer to the driver context structure
606      *                        being used by the current driver.
607      * @param message  Message to send to the API user.  This must be a
608      *                 null-terminated string.
609      */
610     void (*info_callback)(VADriverContextP pDriverContext,
611                           const char *message);
612
613     unsigned long reserved[38];         /* reserve for future add-ins, decrease the subscript accordingly */
614 };
615
616 #define VA_DISPLAY_MAGIC 0x56414430 /* VAD0 */
617 struct VADisplayContext
618 {
619     int vadpy_magic;
620     
621     VADisplayContextP pNext;
622     VADriverContextP pDriverContext;
623
624     int (*vaIsValid) (
625         VADisplayContextP ctx
626     );
627
628     void (*vaDestroy) (
629         VADisplayContextP ctx
630     );
631
632     VAStatus (*vaGetDriverName) (
633         VADisplayContextP ctx,
634         char **driver_name
635     );
636
637     void *opaque; /* opaque for display extensions (e.g. GLX) */
638     void *vatrace; /* opaque for VA trace context */
639     void *vafool; /* opaque for VA fool context */
640
641     VAMessageCallback error_callback;
642     void *error_callback_user_context;
643     VAMessageCallback info_callback;
644     void *info_callback_user_context;
645
646     /** \brief Reserved bytes for future use, must be zero */
647     unsigned long reserved[32];
648 };
649
650 typedef VAStatus (*VADriverInit) (
651     VADriverContextP driver_context
652 );
653
654 #endif /* _VA_BACKEND_H_ */