• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************
2  *
3  * Copyright 2010 Thomas Balling Sørensen & Orasanu Lucian.
4  * Copyright 2014 Advanced Micro Devices, Inc.
5  * All Rights Reserved.
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the
9  * "Software"), to deal in the Software without restriction, including
10  * without limitation the rights to use, copy, modify, merge, publish,
11  * distribute, sub license, and/or sell copies of the Software, and to
12  * permit persons to whom the Software is furnished to do so, subject to
13  * the following conditions:
14  *
15  * The above copyright notice and this permission notice (including the
16  * next paragraph) shall be included in all copies or substantial portions
17  * of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22  * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
23  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26  *
27  **************************************************************************/
28 
29 #ifndef VA_PRIVATE_H
30 #define VA_PRIVATE_H
31 
32 #include <assert.h>
33 
34 #include <va/va.h>
35 #include <va/va_backend.h>
36 #include <va/va_backend_vpp.h>
37 #include <va/va_drmcommon.h>
38 
39 #include "pipe/p_video_enums.h"
40 #include "pipe/p_video_codec.h"
41 #include "pipe/p_video_state.h"
42 
43 #include "vl/vl_compositor.h"
44 #include "vl/vl_csc.h"
45 
46 #include "util/u_dynarray.h"
47 #include "util/u_thread.h"
48 #include "util/detect_os.h"
49 
50 #if DETECT_OS_WINDOWS
51 #define VA_PUBLIC_API
52 #else
53 #define VA_PUBLIC_API PUBLIC
54 #endif
55 
56 #ifndef VA_RT_FORMAT_YUV420_10
57 #define VA_RT_FORMAT_YUV420_10  VA_RT_FORMAT_YUV420_10BPP
58 #endif
59 
60 #define VL_VA_DRIVER(ctx) ((vlVaDriver *)ctx->pDriverData)
61 #define VL_VA_PSCREEN(ctx) (VL_VA_DRIVER(ctx)->vscreen->pscreen)
62 
63 #define VL_VA_MAX_IMAGE_FORMATS 16
64 #define VL_VA_ENC_GOP_COEFF 16
65 
66 #define UINT_TO_PTR(x) ((void*)(uintptr_t)(x))
67 #define PTR_TO_UINT(x) ((unsigned)((intptr_t)(x)))
68 
69 #define SOI 2
70 #define DQT (4 + 4 * 65)
71 #define DHT (4 + 2 * 29 + 2 * 179)
72 #define DRI 6
73 #define SOF (10 + 255 * 3)
74 #define SOS (8 + 4 * 2)
75 #define MAX_MJPEG_SLICE_HEADER_SIZE (SOI + DQT + DHT + DRI + SOF + SOS)
76 
77 #define PRESET_MODE_SPEED   (0)
78 #define PRESET_MODE_BALANCE (1)
79 #define PRESET_MODE_QUALITY (2)
80 #define PRESET_MODE_HIGH_QUALITY (3)
81 
82 #define PREENCODING_MODE_DISABLE (0)
83 #define PREENCODING_MODE_DEFAULT (1)
84 
85 #define VBAQ_DISABLE (0)
86 #define VBAQ_AUTO    (1)
87 
88 static inline enum pipe_video_chroma_format
ChromaToPipe(int format)89 ChromaToPipe(int format)
90 {
91    switch (format) {
92    case VA_RT_FORMAT_YUV420:
93    case VA_RT_FORMAT_YUV420_10BPP:
94       return PIPE_VIDEO_CHROMA_FORMAT_420;
95    case VA_RT_FORMAT_YUV422:
96       return PIPE_VIDEO_CHROMA_FORMAT_422;
97    case VA_RT_FORMAT_YUV444:
98       return PIPE_VIDEO_CHROMA_FORMAT_444;
99    case VA_RT_FORMAT_YUV400:
100       return PIPE_VIDEO_CHROMA_FORMAT_400;
101    default:
102       return PIPE_VIDEO_CHROMA_FORMAT_NONE;
103    }
104 }
105 
106 static inline enum pipe_format
VaFourccToPipeFormat(unsigned format)107 VaFourccToPipeFormat(unsigned format)
108 {
109    switch(format) {
110    case VA_FOURCC('N','V','1','2'):
111       return PIPE_FORMAT_NV12;
112    case VA_FOURCC('P','0','1','0'):
113       return PIPE_FORMAT_P010;
114    case VA_FOURCC('P','0','1','6'):
115       return PIPE_FORMAT_P016;
116    case VA_FOURCC('I','4','2','0'):
117       return PIPE_FORMAT_IYUV;
118    case VA_FOURCC('Y','V','1','2'):
119       return PIPE_FORMAT_YV12;
120    case VA_FOURCC('Y','U','Y','V'):
121    case VA_FOURCC('Y','U','Y','2'):
122       return PIPE_FORMAT_YUYV;
123    case VA_FOURCC('U','Y','V','Y'):
124       return PIPE_FORMAT_UYVY;
125    case VA_FOURCC('B','G','R','A'):
126       return PIPE_FORMAT_B8G8R8A8_UNORM;
127    case VA_FOURCC('A','R','G','B'):
128       return PIPE_FORMAT_A8R8G8B8_UNORM;
129    case VA_FOURCC('R','G','B','A'):
130       return PIPE_FORMAT_R8G8B8A8_UNORM;
131    case VA_FOURCC('B','G','R','X'):
132       return PIPE_FORMAT_B8G8R8X8_UNORM;
133    case VA_FOURCC('R','G','B','X'):
134       return PIPE_FORMAT_R8G8B8X8_UNORM;
135    case VA_FOURCC('R','G','B','P'):
136       return PIPE_FORMAT_R8_G8_B8_UNORM;
137    case VA_FOURCC('Y','8','0','0'):
138       return PIPE_FORMAT_Y8_400_UNORM;
139    case VA_FOURCC('4','4','4','P'):
140       return PIPE_FORMAT_Y8_U8_V8_444_UNORM;
141    default:
142       assert(0);
143       return PIPE_FORMAT_NONE;
144    }
145 }
146 
147 static inline unsigned
PipeFormatToVaFourcc(enum pipe_format p_format)148 PipeFormatToVaFourcc(enum pipe_format p_format)
149 {
150    switch (p_format) {
151    case PIPE_FORMAT_NV12:
152       return VA_FOURCC('N','V','1','2');
153    case PIPE_FORMAT_P010:
154       return VA_FOURCC('P','0','1','0');
155    case PIPE_FORMAT_P016:
156       return VA_FOURCC('P','0','1','6');
157    case PIPE_FORMAT_IYUV:
158       return VA_FOURCC('I','4','2','0');
159    case PIPE_FORMAT_YV12:
160       return VA_FOURCC('Y','V','1','2');
161    case PIPE_FORMAT_UYVY:
162       return VA_FOURCC('U','Y','V','Y');
163    case PIPE_FORMAT_YUYV:
164       return VA_FOURCC('Y','U','Y','V');
165    case PIPE_FORMAT_B8G8R8A8_UNORM:
166       return VA_FOURCC('B','G','R','A');
167    case PIPE_FORMAT_R8G8B8A8_UNORM:
168       return VA_FOURCC('R','G','B','A');
169    case PIPE_FORMAT_A8R8G8B8_UNORM:
170       return VA_FOURCC('A','R','G','B');
171    case PIPE_FORMAT_B8G8R8X8_UNORM:
172       return VA_FOURCC('B','G','R','X');
173    case PIPE_FORMAT_R8G8B8X8_UNORM:
174       return VA_FOURCC('R','G','B','X');
175     case PIPE_FORMAT_R8_G8_B8_UNORM:
176       return VA_FOURCC('R','G','B','P');
177    case PIPE_FORMAT_Y8_400_UNORM:
178       return VA_FOURCC('Y','8','0','0');
179    case PIPE_FORMAT_Y8_U8_V8_444_UNORM:
180       return VA_FOURCC('4','4','4','P');
181    default:
182       assert(0);
183       return -1;
184    }
185 }
186 
187 static inline VAProfile
PipeToProfile(enum pipe_video_profile profile)188 PipeToProfile(enum pipe_video_profile profile)
189 {
190    switch (profile) {
191    case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
192       return VAProfileMPEG2Simple;
193    case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
194       return VAProfileMPEG2Main;
195    case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE:
196       return VAProfileMPEG4Simple;
197    case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE:
198       return VAProfileMPEG4AdvancedSimple;
199    case PIPE_VIDEO_PROFILE_VC1_SIMPLE:
200       return VAProfileVC1Simple;
201    case PIPE_VIDEO_PROFILE_VC1_MAIN:
202       return VAProfileVC1Main;
203    case PIPE_VIDEO_PROFILE_VC1_ADVANCED:
204       return VAProfileVC1Advanced;
205    case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
206       return VAProfileH264ConstrainedBaseline;
207    case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
208       return VAProfileH264Main;
209    case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
210       return VAProfileH264High;
211    case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10:
212 #if VA_CHECK_VERSION(1, 18, 0)
213       return VAProfileH264High10;
214 #else
215       return VAProfileNone;
216 #endif
217    case PIPE_VIDEO_PROFILE_HEVC_MAIN:
218       return VAProfileHEVCMain;
219    case PIPE_VIDEO_PROFILE_HEVC_MAIN_10:
220       return VAProfileHEVCMain10;
221    case PIPE_VIDEO_PROFILE_JPEG_BASELINE:
222       return VAProfileJPEGBaseline;
223    case PIPE_VIDEO_PROFILE_VP9_PROFILE0:
224       return VAProfileVP9Profile0;
225    case PIPE_VIDEO_PROFILE_VP9_PROFILE2:
226       return VAProfileVP9Profile2;
227    case PIPE_VIDEO_PROFILE_AV1_MAIN:
228       return VAProfileAV1Profile0;
229    case PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED:
230    case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH422:
231    case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH444:
232    case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE:
233    case PIPE_VIDEO_PROFILE_HEVC_MAIN_12:
234    case PIPE_VIDEO_PROFILE_HEVC_MAIN_STILL:
235    case PIPE_VIDEO_PROFILE_HEVC_MAIN_444:
236    case PIPE_VIDEO_PROFILE_UNKNOWN:
237       return VAProfileNone;
238    default:
239       assert(0);
240       return -1;
241    }
242 }
243 
244 static inline enum pipe_video_profile
ProfileToPipe(VAProfile profile)245 ProfileToPipe(VAProfile profile)
246 {
247    switch (profile) {
248    case VAProfileMPEG2Simple:
249       return PIPE_VIDEO_PROFILE_MPEG2_SIMPLE;
250    case VAProfileMPEG2Main:
251       return PIPE_VIDEO_PROFILE_MPEG2_MAIN;
252    case VAProfileMPEG4Simple:
253       return PIPE_VIDEO_PROFILE_MPEG4_SIMPLE;
254    case VAProfileMPEG4AdvancedSimple:
255       return PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE;
256    case VAProfileVC1Simple:
257       return PIPE_VIDEO_PROFILE_VC1_SIMPLE;
258    case VAProfileVC1Main:
259       return PIPE_VIDEO_PROFILE_VC1_MAIN;
260    case VAProfileVC1Advanced:
261       return PIPE_VIDEO_PROFILE_VC1_ADVANCED;
262    case VAProfileH264ConstrainedBaseline:
263       return PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE;
264    case VAProfileH264Main:
265       return PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN;
266    case VAProfileH264High:
267       return PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH;
268 #if VA_CHECK_VERSION(1, 18, 0)
269    case VAProfileH264High10:
270       return PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10;
271 #endif
272    case VAProfileHEVCMain:
273       return PIPE_VIDEO_PROFILE_HEVC_MAIN;
274    case VAProfileHEVCMain10:
275       return PIPE_VIDEO_PROFILE_HEVC_MAIN_10;
276    case VAProfileJPEGBaseline:
277       return PIPE_VIDEO_PROFILE_JPEG_BASELINE;
278    case VAProfileVP9Profile0:
279       return PIPE_VIDEO_PROFILE_VP9_PROFILE0;
280    case VAProfileVP9Profile2:
281       return PIPE_VIDEO_PROFILE_VP9_PROFILE2;
282    case VAProfileAV1Profile0:
283       return PIPE_VIDEO_PROFILE_AV1_MAIN;
284    case VAProfileNone:
285        return PIPE_VIDEO_PROFILE_UNKNOWN;
286    default:
287       return PIPE_VIDEO_PROFILE_UNKNOWN;
288    }
289 }
290 
291 typedef struct {
292    struct vl_screen *vscreen;
293    struct pipe_context *pipe;
294    struct handle_table *htab;
295    struct vl_compositor compositor;
296    struct vl_compositor_state cstate;
297    vl_csc_matrix csc;
298    mtx_t mutex;
299    char vendor_string[256];
300 } vlVaDriver;
301 
302 typedef struct {
303    VAImage *image;
304 
305    struct u_rect src_rect;
306    struct u_rect dst_rect;
307 
308    struct pipe_sampler_view *sampler;
309 } vlVaSubpicture;
310 
311 typedef struct {
312    VABufferType type;
313    unsigned int size;
314    unsigned int num_elements;
315    void *data;
316    struct {
317       struct pipe_resource *resource;
318       struct pipe_transfer *transfer;
319       enum pipe_video_entrypoint entrypoint;
320    } derived_surface;
321    unsigned int export_refcount;
322    VABufferInfo export_state;
323    unsigned int coded_size;
324    struct pipe_enc_feedback_metadata extended_metadata;
325    struct pipe_video_buffer *derived_image_buffer;
326    void *feedback;
327    VASurfaceID associated_encode_input_surf;
328    VAContextID ctx;
329 } vlVaBuffer;
330 
331 typedef struct {
332    struct pipe_video_codec templat, *decoder;
333    struct pipe_video_buffer *target;
334    union {
335       struct pipe_picture_desc base;
336       struct pipe_mpeg12_picture_desc mpeg12;
337       struct pipe_mpeg4_picture_desc mpeg4;
338       struct pipe_vc1_picture_desc vc1;
339       struct pipe_h264_picture_desc h264;
340       struct pipe_h265_picture_desc h265;
341       struct pipe_mjpeg_picture_desc mjpeg;
342       struct pipe_vp9_picture_desc vp9;
343       struct pipe_av1_picture_desc av1;
344       struct pipe_h264_enc_picture_desc h264enc;
345       struct pipe_h265_enc_picture_desc h265enc;
346       struct pipe_av1_enc_picture_desc av1enc;
347       struct pipe_vpp_desc vidproc;
348    } desc;
349 
350    struct {
351       unsigned long long int frame_num;
352       unsigned int start_code_size;
353       unsigned int vti_bits;
354       unsigned int quant_scale;
355       VAPictureParameterBufferMPEG4 pps;
356       uint8_t start_code[32];
357    } mpeg4;
358 
359    struct {
360       unsigned sampling_factor;
361       #define MJPEG_SAMPLING_FACTOR_NV12   (0x221111)
362       #define MJPEG_SAMPLING_FACTOR_YUY2   (0x221212)
363       #define MJPEG_SAMPLING_FACTOR_YUV422 (0x211111)
364       #define MJPEG_SAMPLING_FACTOR_YUV444 (0x111111)
365       #define MJPEG_SAMPLING_FACTOR_YUV400 (0x11)
366       uint8_t slice_header[MAX_MJPEG_SLICE_HEADER_SIZE];
367       unsigned int slice_header_size;
368    } mjpeg;
369 
370    struct vl_deint_filter *deint;
371    vlVaBuffer *coded_buf;
372    int target_id;
373    bool first_single_submitted;
374    int gop_coeff;
375    bool needs_begin_frame;
376    void *blit_cs;
377    int packed_header_type;
378    bool packed_header_emulation_bytes;
379    struct set *surfaces;
380 } vlVaContext;
381 
382 typedef struct {
383    enum pipe_video_profile profile;
384    enum pipe_video_entrypoint entrypoint;
385    enum pipe_h2645_enc_rate_control_method rc;
386    unsigned int rt_format;
387 } vlVaConfig;
388 
389 typedef struct {
390    struct pipe_video_buffer templat, *buffer;
391    struct util_dynarray subpics; /* vlVaSubpicture */
392    vlVaContext *ctx;
393    vlVaBuffer *coded_buf;
394    void *feedback;
395    unsigned int frame_num_cnt;
396    bool force_flushed;
397    struct pipe_video_buffer *obsolete_buf;
398    enum pipe_format encoder_format;
399    bool full_range;
400    struct pipe_fence_handle *fence;
401 } vlVaSurface;
402 
403 typedef struct {
404    union {
405       unsigned int quality;
406       struct {
407          unsigned int valid_setting: 1;
408          unsigned int preset_mode: 2;
409          unsigned int pre_encode_mode: 1;
410          unsigned int vbaq_mode: 1;
411          unsigned int reservered: 27;
412       };
413    };
414 } vlVaQualityBits;
415 
416 // Public functions:
417 VAStatus VA_DRIVER_INIT_FUNC(VADriverContextP ctx);
418 
419 // vtable functions:
420 VAStatus vlVaTerminate(VADriverContextP ctx);
421 VAStatus vlVaQueryConfigProfiles(VADriverContextP ctx, VAProfile *profile_list,int *num_profiles);
422 VAStatus vlVaQueryConfigEntrypoints(VADriverContextP ctx, VAProfile profile,
423                                     VAEntrypoint  *entrypoint_list, int *num_entrypoints);
424 VAStatus vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint,
425                                  VAConfigAttrib *attrib_list, int num_attribs);
426 VAStatus vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint,
427                           VAConfigAttrib *attrib_list, int num_attribs, VAConfigID *config_id);
428 VAStatus vlVaDestroyConfig(VADriverContextP ctx, VAConfigID config_id);
429 VAStatus vlVaQueryConfigAttributes(VADriverContextP ctx, VAConfigID config_id, VAProfile *profile,
430                                    VAEntrypoint *entrypoint, VAConfigAttrib *attrib_list, int *num_attribs);
431 VAStatus vlVaCreateSurfaces(VADriverContextP ctx, int width, int height, int format,
432                             int num_surfaces, VASurfaceID *surfaces);
433 VAStatus vlVaDestroySurfaces(VADriverContextP ctx, VASurfaceID *surface_list, int num_surfaces);
434 VAStatus vlVaCreateContext(VADriverContextP ctx, VAConfigID config_id, int picture_width, int picture_height,
435                            int flag, VASurfaceID *render_targets, int num_render_targets, VAContextID *context);
436 VAStatus vlVaDestroyContext(VADriverContextP ctx, VAContextID context);
437 VAStatus vlVaCreateBuffer(VADriverContextP ctx, VAContextID context, VABufferType type, unsigned int size,
438                           unsigned int num_elements, void *data, VABufferID *buf_id);
439 VAStatus vlVaBufferSetNumElements(VADriverContextP ctx, VABufferID buf_id, unsigned int num_elements);
440 VAStatus vlVaMapBuffer(VADriverContextP ctx, VABufferID buf_id, void **pbuf);
441 VAStatus vlVaUnmapBuffer(VADriverContextP ctx, VABufferID buf_id);
442 VAStatus vlVaDestroyBuffer(VADriverContextP ctx, VABufferID buffer_id);
443 VAStatus vlVaBeginPicture(VADriverContextP ctx, VAContextID context, VASurfaceID render_target);
444 VAStatus vlVaRenderPicture(VADriverContextP ctx, VAContextID context, VABufferID *buffers, int num_buffers);
445 VAStatus vlVaEndPicture(VADriverContextP ctx, VAContextID context);
446 VAStatus vlVaSyncSurface(VADriverContextP ctx, VASurfaceID render_target);
447 #if VA_CHECK_VERSION(1, 15, 0)
448 VAStatus vlVaSyncSurface2(VADriverContextP ctx, VASurfaceID surface, uint64_t timeout_ns);
449 #endif
450 VAStatus vlVaQuerySurfaceStatus(VADriverContextP ctx, VASurfaceID render_target, VASurfaceStatus *status);
451 VAStatus vlVaQuerySurfaceError(VADriverContextP ctx, VASurfaceID render_target,
452                                VAStatus error_status, void **error_info);
453 VAStatus vlVaPutSurface(VADriverContextP ctx, VASurfaceID surface, void* draw, short srcx, short srcy,
454                         unsigned short srcw, unsigned short srch, short destx, short desty, unsigned short destw,
455                         unsigned short desth, VARectangle *cliprects, unsigned int number_cliprects,
456                         unsigned int flags);
457 VAStatus vlVaQueryImageFormats(VADriverContextP ctx, VAImageFormat *format_list, int *num_formats);
458 VAStatus vlVaQuerySubpictureFormats(VADriverContextP ctx, VAImageFormat *format_list,
459                                     unsigned int *flags, unsigned int *num_formats);
460 VAStatus vlVaCreateImage(VADriverContextP ctx, VAImageFormat *format, int width, int height, VAImage *image);
461 VAStatus vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image);
462 VAStatus vlVaDestroyImage(VADriverContextP ctx, VAImageID image);
463 VAStatus vlVaSetImagePalette(VADriverContextP ctx, VAImageID image, unsigned char *palette);
464 VAStatus vlVaGetImage(VADriverContextP ctx, VASurfaceID surface, int x, int y,
465                       unsigned int width, unsigned int height, VAImageID image);
466 VAStatus vlVaPutImage(VADriverContextP ctx, VASurfaceID surface, VAImageID image, int src_x, int src_y,
467                       unsigned int src_width, unsigned int src_height, int dest_x, int dest_y,
468                       unsigned int dest_width, unsigned int dest_height);
469 VAStatus vlVaQuerySubpictureFormats(VADriverContextP ctx, VAImageFormat *format_list,
470                                     unsigned int *flags, unsigned int *num_formats);
471 VAStatus vlVaCreateSubpicture(VADriverContextP ctx, VAImageID image, VASubpictureID *subpicture);
472 VAStatus vlVaDestroySubpicture(VADriverContextP ctx, VASubpictureID subpicture);
473 VAStatus vlVaSubpictureImage(VADriverContextP ctx, VASubpictureID subpicture, VAImageID image);
474 VAStatus vlVaSetSubpictureChromakey(VADriverContextP ctx, VASubpictureID subpicture,
475                                     unsigned int chromakey_min, unsigned int chromakey_max,
476                                     unsigned int chromakey_mask);
477 VAStatus vlVaSetSubpictureGlobalAlpha(VADriverContextP ctx, VASubpictureID subpicture, float global_alpha);
478 VAStatus vlVaAssociateSubpicture(VADriverContextP ctx, VASubpictureID subpicture, VASurfaceID *target_surfaces,
479                                  int num_surfaces, short src_x, short src_y,
480                                  unsigned short src_width, unsigned short src_height,
481                                  short dest_x, short dest_y, unsigned short dest_width, unsigned short dest_height,
482                                  unsigned int flags);
483 VAStatus vlVaDeassociateSubpicture(VADriverContextP ctx, VASubpictureID subpicture,
484                                    VASurfaceID *target_surfaces, int num_surfaces);
485 VAStatus vlVaQueryDisplayAttributes(VADriverContextP ctx, VADisplayAttribute *attr_list, int *num_attributes);
486 VAStatus vlVaGetDisplayAttributes(VADriverContextP ctx, VADisplayAttribute *attr_list, int num_attributes);
487 VAStatus vlVaSetDisplayAttributes(VADriverContextP ctx, VADisplayAttribute *attr_list, int num_attributes);
488 VAStatus vlVaBufferInfo(VADriverContextP ctx, VABufferID buf_id, VABufferType *type,
489                         unsigned int *size, unsigned int *num_elements);
490 VAStatus vlVaLockSurface(VADriverContextP ctx, VASurfaceID surface, unsigned int *fourcc,
491                          unsigned int *luma_stride, unsigned int *chroma_u_stride, unsigned int *chroma_v_stride,
492                          unsigned int *luma_offset, unsigned int *chroma_u_offset, unsigned int *chroma_v_offset,
493                          unsigned int *buffer_name, void **buffer);
494 VAStatus vlVaUnlockSurface(VADriverContextP ctx, VASurfaceID surface);
495 VAStatus vlVaCreateSurfaces2(VADriverContextP ctx, unsigned int format, unsigned int width, unsigned int height,
496                              VASurfaceID *surfaces, unsigned int num_surfaces, VASurfaceAttrib *attrib_list,
497                              unsigned int num_attribs);
498 VAStatus vlVaQuerySurfaceAttributes(VADriverContextP ctx, VAConfigID config, VASurfaceAttrib *attrib_list,
499                                     unsigned int *num_attribs);
500 
501 VAStatus vlVaAcquireBufferHandle(VADriverContextP ctx, VABufferID buf_id, VABufferInfo *out_buf_info);
502 VAStatus vlVaReleaseBufferHandle(VADriverContextP ctx, VABufferID buf_id);
503 VAStatus vlVaExportSurfaceHandle(VADriverContextP ctx, VASurfaceID surface_id, uint32_t mem_type, uint32_t flags, void *descriptor);
504 
505 VAStatus vlVaQueryVideoProcFilters(VADriverContextP ctx, VAContextID context, VAProcFilterType *filters,
506                                    unsigned int *num_filters);
507 VAStatus vlVaQueryVideoProcFilterCaps(VADriverContextP ctx, VAContextID context, VAProcFilterType type,
508                                       void *filter_caps, unsigned int *num_filter_caps);
509 VAStatus vlVaQueryVideoProcPipelineCaps(VADriverContextP ctx, VAContextID context, VABufferID *filters,
510                                         unsigned int num_filters, VAProcPipelineCaps *pipeline_cap);
511 VAStatus vlVaSyncBuffer(VADriverContextP ctx, VABufferID buf_id, uint64_t timeout_ns);
512 VAStatus vlVaMapBuffer2(VADriverContextP ctx, VABufferID buf_id, void **pbuf, uint32_t flags);
513 
514 // internal functions
515 VAStatus vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
516 VAStatus vlVaHandleSurfaceAllocate(vlVaDriver *drv, vlVaSurface *surface, struct pipe_video_buffer *templat,
517                                    const uint64_t *modifiers, unsigned int modifiers_count);
518 void vlVaGetReferenceFrame(vlVaDriver *drv, VASurfaceID surface_id, struct pipe_video_buffer **ref_frame);
519 void vlVaHandlePictureParameterBufferMPEG12(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
520 void vlVaHandleIQMatrixBufferMPEG12(vlVaContext *context, vlVaBuffer *buf);
521 void vlVaHandleSliceParameterBufferMPEG12(vlVaContext *context, vlVaBuffer *buf);
522 void vlVaHandlePictureParameterBufferH264(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
523 void vlVaHandleIQMatrixBufferH264(vlVaContext *context, vlVaBuffer *buf);
524 void vlVaHandleSliceParameterBufferH264(vlVaContext *context, vlVaBuffer *buf);
525 void vlVaHandlePictureParameterBufferVC1(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
526 void vlVaHandleSliceParameterBufferVC1(vlVaContext *context, vlVaBuffer *buf);
527 void vlVaHandlePictureParameterBufferMPEG4(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
528 void vlVaHandleIQMatrixBufferMPEG4(vlVaContext *context, vlVaBuffer *buf);
529 void vlVaHandleSliceParameterBufferMPEG4(vlVaContext *context, vlVaBuffer *buf);
530 void vlVaDecoderFixMPEG4Startcode(vlVaContext *context);
531 void vlVaGetJpegSliceHeader(vlVaContext *context);
532 void vlVaHandlePictureParameterBufferHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
533 void vlVaHandleIQMatrixBufferHEVC(vlVaContext *context, vlVaBuffer *buf);
534 void vlVaHandleSliceParameterBufferHEVC(vlVaContext *context, vlVaBuffer *buf);
535 void vlVaHandlePictureParameterBufferMJPEG(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
536 void vlVaHandleIQMatrixBufferMJPEG(vlVaContext *context, vlVaBuffer *buf);
537 void vlVaHandleHuffmanTableBufferType(vlVaContext *context, vlVaBuffer *buf);
538 void vlVaHandleSliceParameterBufferMJPEG(vlVaContext *context, vlVaBuffer *buf);
539 void vlVaHandlePictureParameterBufferVP9(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
540 void vlVaHandleSliceParameterBufferVP9(vlVaContext *context, vlVaBuffer *buf);
541 void vlVaDecoderVP9BitstreamHeader(vlVaContext *context, vlVaBuffer *buf);
542 void vlVaHandlePictureParameterBufferAV1(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
543 void vlVaHandleSliceParameterBufferAV1(vlVaContext *context, vlVaBuffer *buf, unsigned num_slices);
544 void getEncParamPresetH264(vlVaContext *context);
545 void getEncParamPresetH265(vlVaContext *context);
546 void getEncParamPresetAV1(vlVaContext *context);
547 void vlVaHandleVAEncMiscParameterTypeQualityLevel(struct pipe_enc_quality_modes *p, vlVaQualityBits *in);
548 VAStatus vlVaHandleVAEncPictureParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
549 VAStatus vlVaHandleVAEncSliceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
550 VAStatus vlVaHandleVAEncSequenceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
551 VAStatus vlVaHandleVAEncMiscParameterTypeRateControlH264(vlVaContext *context, VAEncMiscParameterBuffer *buf);
552 VAStatus vlVaHandleVAEncMiscParameterTypeFrameRateH264(vlVaContext *context, VAEncMiscParameterBuffer *buf);
553 VAStatus vlVaHandleVAEncPackedHeaderDataBufferTypeH264(vlVaContext *context, vlVaBuffer *buf);
554 VAStatus vlVaHandleVAEncMiscParameterTypeTemporalLayerH264(vlVaContext *context, VAEncMiscParameterBuffer *buf);
555 VAStatus vlVaHandleVAEncMiscParameterTypeQualityLevelH264(vlVaContext *context, VAEncMiscParameterBuffer *buf);
556 VAStatus vlVaHandleVAEncMiscParameterTypeMaxFrameSizeH264(vlVaContext *context, VAEncMiscParameterBuffer *buf);
557 VAStatus vlVaHandleVAEncMiscParameterTypeHRDH264(vlVaContext *context, VAEncMiscParameterBuffer *buf);
558 VAStatus vlVaHandleVAEncPictureParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
559 VAStatus vlVaHandleVAEncSliceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
560 VAStatus vlVaHandleVAEncSequenceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
561 VAStatus vlVaHandleVAEncMiscParameterTypeRateControlHEVC(vlVaContext *context, VAEncMiscParameterBuffer *buf);
562 VAStatus vlVaHandleVAEncMiscParameterTypeFrameRateHEVC(vlVaContext *context, VAEncMiscParameterBuffer *buf);
563 VAStatus vlVaHandleVAEncPackedHeaderDataBufferTypeHEVC(vlVaContext *context, vlVaBuffer *buf);
564 VAStatus vlVaHandleVAEncMiscParameterTypeQualityLevelHEVC(vlVaContext *context, VAEncMiscParameterBuffer *buf);
565 VAStatus vlVaHandleVAEncMiscParameterTypeMaxFrameSizeHEVC(vlVaContext *context, VAEncMiscParameterBuffer *buf);
566 VAStatus vlVaHandleVAEncMiscParameterTypeHRDHEVC(vlVaContext *context, VAEncMiscParameterBuffer *buf);
567 
568 #if VA_CHECK_VERSION(1, 16, 0)
569 VAStatus vlVaHandleVAEncSequenceParameterBufferTypeAV1(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
570 VAStatus vlVaHandleVAEncPictureParameterBufferTypeAV1(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
571 VAStatus vlVaHandleVAEncMiscParameterTypeRateControlAV1(vlVaContext *context, VAEncMiscParameterBuffer *buf);
572 VAStatus vlVaHandleVAEncPackedHeaderDataBufferTypeAV1(vlVaContext *context, vlVaBuffer *buf);
573 VAStatus vlVaHandleVAEncMiscParameterTypeFrameRateAV1(vlVaContext *context, VAEncMiscParameterBuffer *buf);
574 VAStatus vlVaHandleVAEncMiscParameterTypeQualityLevelAV1(vlVaContext *context, VAEncMiscParameterBuffer *buf);
575 VAStatus vlVaHandleVAEncMiscParameterTypeMaxFrameSizeAV1(vlVaContext *context, VAEncMiscParameterBuffer *buf);
576 VAStatus vlVaHandleVAEncMiscParameterTypeHRDAV1(vlVaContext *context, VAEncMiscParameterBuffer *buf);
577 VAStatus vlVaHandleVAEncSliceParameterBufferTypeAV1(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
578 #endif
579 #endif //VA_PRIVATE_H
580