@desklink/host 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/NOTICE +26 -0
  2. package/README.md +134 -56
  3. package/bin/desklink-host.mjs +13 -5
  4. package/dist/bridge.d.ts +1 -0
  5. package/dist/bridge.d.ts.map +1 -1
  6. package/dist/bridge.js +12 -4
  7. package/dist/bridge.js.map +1 -1
  8. package/dist/engineProcess.d.ts +6 -1
  9. package/dist/engineProcess.d.ts.map +1 -1
  10. package/dist/engineProcess.js +35 -4
  11. package/dist/engineProcess.js.map +1 -1
  12. package/dist/protocol.d.ts +58 -0
  13. package/dist/protocol.d.ts.map +1 -1
  14. package/dist/protocol.js.map +1 -1
  15. package/dist/resolveEngine.d.ts +7 -1
  16. package/dist/resolveEngine.d.ts.map +1 -1
  17. package/dist/resolveEngine.js +66 -14
  18. package/dist/resolveEngine.js.map +1 -1
  19. package/docs/BOUNDARY.md +15 -7
  20. package/docs/PROTOCOL.md +267 -27
  21. package/engine/Cargo.lock +47 -2
  22. package/engine/Cargo.toml +18 -13
  23. package/engine/build.rs +86 -4
  24. package/engine/native/agent_overlay_mac.m +51 -4
  25. package/engine/native/agent_overlay_wayland.c +145 -12
  26. package/engine/native/agent_overlay_x11.c +72 -0
  27. package/engine/native/nvenc_shim.c +453 -0
  28. package/engine/native/vaapi_shim.c +727 -0
  29. package/engine/native/vpx_shim.c +54 -4
  30. package/engine/native/vt_shim.c +448 -0
  31. package/engine/src/capture.rs +167 -58
  32. package/engine/src/capture_mac.rs +24 -14
  33. package/engine/src/capture_win.rs +23 -0
  34. package/engine/src/clipboard_win.rs +8 -0
  35. package/engine/src/convert.rs +286 -61
  36. package/engine/src/cursor.rs +118 -0
  37. package/engine/src/encoder.rs +122 -13
  38. package/engine/src/h264.rs +188 -0
  39. package/engine/src/h264_nvenc.rs +308 -0
  40. package/engine/src/h264_openh264.rs +735 -0
  41. package/engine/src/h264_vaapi.rs +263 -0
  42. package/engine/src/h264_vt.rs +368 -0
  43. package/engine/src/indicator.rs +104 -3
  44. package/engine/src/input_win.rs +91 -0
  45. package/engine/src/keymap_win.rs +39 -0
  46. package/engine/src/mac.rs +34 -9
  47. package/engine/src/main.rs +186 -26
  48. package/engine/src/peer.rs +466 -28
  49. package/engine/src/portal.rs +42 -4
  50. package/engine/src/portal_win.rs +37 -0
  51. package/engine/src/protocol.rs +64 -2
  52. package/engine/src/session.rs +1252 -105
  53. package/engine/src/win.rs +110 -0
  54. package/engine/src/x11.rs +225 -9
  55. package/engine/src/x11_mac.rs +12 -0
  56. package/engine/vendor/libva/COPYING +19 -0
  57. package/engine/vendor/libva/va/va.h +5450 -0
  58. package/engine/vendor/libva/va/va_dec_av1.h +695 -0
  59. package/engine/vendor/libva/va/va_dec_hevc.h +616 -0
  60. package/engine/vendor/libva/va/va_dec_jpeg.h +157 -0
  61. package/engine/vendor/libva/va/va_dec_vp8.h +249 -0
  62. package/engine/vendor/libva/va/va_dec_vp9.h +312 -0
  63. package/engine/vendor/libva/va/va_dec_vvc.h +688 -0
  64. package/engine/vendor/libva/va/va_drm.h +61 -0
  65. package/engine/vendor/libva/va/va_enc_av1.h +1010 -0
  66. package/engine/vendor/libva/va/va_enc_h264.h +659 -0
  67. package/engine/vendor/libva/va/va_enc_hevc.h +958 -0
  68. package/engine/vendor/libva/va/va_enc_jpeg.h +162 -0
  69. package/engine/vendor/libva/va/va_enc_mpeg2.h +308 -0
  70. package/engine/vendor/libva/va/va_enc_vp8.h +350 -0
  71. package/engine/vendor/libva/va/va_enc_vp9.h +639 -0
  72. package/engine/vendor/libva/va/va_fei.h +170 -0
  73. package/engine/vendor/libva/va/va_fei_h264.h +505 -0
  74. package/engine/vendor/libva/va/va_fei_hevc.h +254 -0
  75. package/engine/vendor/libva/va/va_prot.h +525 -0
  76. package/engine/vendor/libva/va/va_version.h +87 -0
  77. package/engine/vendor/libva/va/va_vpp.h +1590 -0
  78. package/engine/vendor/nv-codec-headers/LICENSE +24 -0
  79. package/engine/vendor/nv-codec-headers/README +7 -0
  80. package/engine/vendor/nv-codec-headers/include/ffnvcodec/nvEncodeAPI.h +3825 -0
  81. package/examples/reference-client.html +1 -1
  82. package/package.json +4 -3
@@ -0,0 +1,1590 @@
1
+ /*
2
+ * Copyright (c) 2007-2011 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 INTEL 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
+ * \file va_vpp.h
27
+ * \brief The video processing API
28
+ *
29
+ * This file contains the \ref api_vpp "Video processing API".
30
+ */
31
+
32
+ #ifndef VA_VPP_H
33
+ #define VA_VPP_H
34
+
35
+ #ifdef __cplusplus
36
+ extern "C" {
37
+ #endif
38
+
39
+ /**
40
+ * \defgroup api_vpp Video processing API
41
+ *
42
+ * @{
43
+ *
44
+ * The video processing API uses the same paradigm as for decoding:
45
+ * - Query for supported filters;
46
+ * - Set up a video processing pipeline;
47
+ * - Send video processing parameters through VA buffers.
48
+ *
49
+ * \section api_vpp_caps Query for supported filters
50
+ *
51
+ * Checking whether video processing is supported can be performed
52
+ * with vaQueryConfigEntrypoints() and the profile argument set to
53
+ * #VAProfileNone. If video processing is supported, then the list of
54
+ * returned entry-points will include #VAEntrypointVideoProc.
55
+ *
56
+ * \code
57
+ * VAEntrypoint *entrypoints;
58
+ * int i, num_entrypoints, supportsVideoProcessing = 0;
59
+ *
60
+ * num_entrypoints = vaMaxNumEntrypoints();
61
+ * entrypoints = malloc(num_entrypoints * sizeof(entrypoints[0]);
62
+ * vaQueryConfigEntrypoints(va_dpy, VAProfileNone,
63
+ * entrypoints, &num_entrypoints);
64
+ *
65
+ * for (i = 0; !supportsVideoProcessing && i < num_entrypoints; i++) {
66
+ * if (entrypoints[i] == VAEntrypointVideoProc)
67
+ * supportsVideoProcessing = 1;
68
+ * }
69
+ * \endcode
70
+ *
71
+ * Then, the vaQueryVideoProcFilters() function is used to query the
72
+ * list of video processing filters.
73
+ *
74
+ * \code
75
+ * VAProcFilterType filters[VAProcFilterCount];
76
+ * unsigned int num_filters = VAProcFilterCount;
77
+ *
78
+ * // num_filters shall be initialized to the length of the array
79
+ * vaQueryVideoProcFilters(va_dpy, vpp_ctx, &filters, &num_filters);
80
+ * \endcode
81
+ *
82
+ * Finally, individual filter capabilities can be checked with
83
+ * vaQueryVideoProcFilterCaps().
84
+ *
85
+ * \code
86
+ * VAProcFilterCap denoise_caps;
87
+ * unsigned int num_denoise_caps = 1;
88
+ * vaQueryVideoProcFilterCaps(va_dpy, vpp_ctx,
89
+ * VAProcFilterNoiseReduction,
90
+ * &denoise_caps, &num_denoise_caps
91
+ * );
92
+ *
93
+ * VAProcFilterCapDeinterlacing deinterlacing_caps[VAProcDeinterlacingCount];
94
+ * unsigned int num_deinterlacing_caps = VAProcDeinterlacingCount;
95
+ * vaQueryVideoProcFilterCaps(va_dpy, vpp_ctx,
96
+ * VAProcFilterDeinterlacing,
97
+ * &deinterlacing_caps, &num_deinterlacing_caps
98
+ * );
99
+ * \endcode
100
+ *
101
+ * \section api_vpp_setup Set up a video processing pipeline
102
+ *
103
+ * A video processing pipeline buffer is created for each source
104
+ * surface we want to process. However, buffers holding filter
105
+ * parameters can be created once and for all. Rationale is to avoid
106
+ * multiple creation/destruction chains of filter buffers and also
107
+ * because filter parameters generally won't change frame after
108
+ * frame. e.g. this makes it possible to implement a checkerboard of
109
+ * videos where the same filters are applied to each video source.
110
+ *
111
+ * The general control flow is demonstrated by the following pseudo-code:
112
+ * \code
113
+ * // Create filters
114
+ * VABufferID denoise_filter, deint_filter;
115
+ * VABufferID filter_bufs[VAProcFilterCount];
116
+ * unsigned int num_filter_bufs;
117
+ *
118
+ * for (i = 0; i < num_filters; i++) {
119
+ * switch (filters[i]) {
120
+ * case VAProcFilterNoiseReduction: { // Noise reduction filter
121
+ * VAProcFilterParameterBuffer denoise;
122
+ * denoise.type = VAProcFilterNoiseReduction;
123
+ * denoise.value = 0.5;
124
+ * vaCreateBuffer(va_dpy, vpp_ctx,
125
+ * VAProcFilterParameterBufferType, sizeof(denoise), 1,
126
+ * &denoise, &denoise_filter
127
+ * );
128
+ * filter_bufs[num_filter_bufs++] = denoise_filter;
129
+ * break;
130
+ * }
131
+ *
132
+ * case VAProcFilterDeinterlacing: // Motion-adaptive deinterlacing
133
+ * for (j = 0; j < num_deinterlacing_caps; j++) {
134
+ * VAProcFilterCapDeinterlacing * const cap = &deinterlacing_caps[j];
135
+ * if (cap->type != VAProcDeinterlacingMotionAdaptive)
136
+ * continue;
137
+ *
138
+ * VAProcFilterParameterBufferDeinterlacing deint;
139
+ * deint.type = VAProcFilterDeinterlacing;
140
+ * deint.algorithm = VAProcDeinterlacingMotionAdaptive;
141
+ * vaCreateBuffer(va_dpy, vpp_ctx,
142
+ * VAProcFilterParameterBufferType, sizeof(deint), 1,
143
+ * &deint, &deint_filter
144
+ * );
145
+ * filter_bufs[num_filter_bufs++] = deint_filter;
146
+ * }
147
+ * }
148
+ * }
149
+ * \endcode
150
+ *
151
+ * Once the video processing pipeline is set up, the caller shall check the
152
+ * implied capabilities and requirements with vaQueryVideoProcPipelineCaps().
153
+ * This function can be used to validate the number of reference frames are
154
+ * needed by the specified deinterlacing algorithm, the supported color
155
+ * primaries, etc.
156
+ * \code
157
+ * // Create filters
158
+ * VAProcPipelineCaps pipeline_caps;
159
+ * VASurfaceID *forward_references;
160
+ * unsigned int num_forward_references;
161
+ * VASurfaceID *backward_references;
162
+ * unsigned int num_backward_references;
163
+ * VAProcColorStandardType in_color_standards[VAProcColorStandardCount];
164
+ * VAProcColorStandardType out_color_standards[VAProcColorStandardCount];
165
+ *
166
+ * pipeline_caps.input_color_standards = NULL;
167
+ * pipeline_caps.num_input_color_standards = ARRAY_ELEMS(in_color_standards);
168
+ * pipeline_caps.output_color_standards = NULL;
169
+ * pipeline_caps.num_output_color_standards = ARRAY_ELEMS(out_color_standards);
170
+ * vaQueryVideoProcPipelineCaps(va_dpy, vpp_ctx,
171
+ * filter_bufs, num_filter_bufs,
172
+ * &pipeline_caps
173
+ * );
174
+ *
175
+ * num_forward_references = pipeline_caps.num_forward_references;
176
+ * forward_references =
177
+ * malloc(num__forward_references * sizeof(VASurfaceID));
178
+ * num_backward_references = pipeline_caps.num_backward_references;
179
+ * backward_references =
180
+ * malloc(num_backward_references * sizeof(VASurfaceID));
181
+ * \endcode
182
+ *
183
+ * \section api_vpp_submit Send video processing parameters through VA buffers
184
+ *
185
+ * Video processing pipeline parameters are submitted for each source
186
+ * surface to process. Video filter parameters can also change, per-surface.
187
+ * e.g. the list of reference frames used for deinterlacing.
188
+ *
189
+ * \code
190
+ * foreach (iteration) {
191
+ * vaBeginPicture(va_dpy, vpp_ctx, vpp_surface);
192
+ * foreach (surface) {
193
+ * VARectangle output_region;
194
+ * VABufferID pipeline_buf;
195
+ * VAProcPipelineParameterBuffer *pipeline_param;
196
+ *
197
+ * vaCreateBuffer(va_dpy, vpp_ctx,
198
+ * VAProcPipelineParameterBuffer, sizeof(*pipeline_param), 1,
199
+ * NULL, &pipeline_buf
200
+ * );
201
+ *
202
+ * // Setup output region for this surface
203
+ * // e.g. upper left corner for the first surface
204
+ * output_region.x = BORDER;
205
+ * output_region.y = BORDER;
206
+ * output_region.width =
207
+ * (vpp_surface_width - (Nx_surfaces + 1) * BORDER) / Nx_surfaces;
208
+ * output_region.height =
209
+ * (vpp_surface_height - (Ny_surfaces + 1) * BORDER) / Ny_surfaces;
210
+ *
211
+ * vaMapBuffer(va_dpy, pipeline_buf, &pipeline_param);
212
+ * pipeline_param->surface = surface;
213
+ * pipeline_param->surface_region = NULL;
214
+ * pipeline_param->output_region = &output_region;
215
+ * pipeline_param->output_background_color = 0;
216
+ * if (first surface to render)
217
+ * pipeline_param->output_background_color = 0xff000000; // black
218
+ * pipeline_param->filter_flags = VA_FILTER_SCALING_HQ;
219
+ * pipeline_param->filters = filter_bufs;
220
+ * pipeline_param->num_filters = num_filter_bufs;
221
+ * vaUnmapBuffer(va_dpy, pipeline_buf);
222
+ *
223
+ * // Update reference frames for deinterlacing, if necessary
224
+ * pipeline_param->forward_references = forward_references;
225
+ * pipeline_param->num_forward_references = num_forward_references_used;
226
+ * pipeline_param->backward_references = backward_references;
227
+ * pipeline_param->num_backward_references = num_bacward_references_used;
228
+ *
229
+ * // Apply filters
230
+ * vaRenderPicture(va_dpy, vpp_ctx, &pipeline_buf, 1);
231
+ * }
232
+ * vaEndPicture(va_dpy, vpp_ctx);
233
+ * }
234
+ * \endcode
235
+ */
236
+
237
+ /** \brief Video filter types. */
238
+ typedef enum _VAProcFilterType {
239
+ VAProcFilterNone = 0,
240
+ /** \brief Noise reduction filter. */
241
+ VAProcFilterNoiseReduction,
242
+ /** \brief Deinterlacing filter. */
243
+ VAProcFilterDeinterlacing,
244
+ /** \brief Sharpening filter. */
245
+ VAProcFilterSharpening,
246
+ /** \brief Color balance parameters. */
247
+ VAProcFilterColorBalance,
248
+ /** \brief Skin Tone Enhancement. */
249
+ VAProcFilterSkinToneEnhancement,
250
+ /** \brief Total Color Correction. */
251
+ VAProcFilterTotalColorCorrection,
252
+ /** \brief Human Vision System(HVS) Noise reduction filter. */
253
+ VAProcFilterHVSNoiseReduction,
254
+ /** \brief High Dynamic Range Tone Mapping. */
255
+ VAProcFilterHighDynamicRangeToneMapping,
256
+ /** \brief Three-Dimensional Look Up Table (3DLUT). */
257
+ VAProcFilter3DLUT,
258
+ /** \brief Number of video filters. */
259
+ VAProcFilterCount
260
+ } VAProcFilterType;
261
+
262
+ /** \brief Deinterlacing types. */
263
+ typedef enum _VAProcDeinterlacingType {
264
+ VAProcDeinterlacingNone = 0,
265
+ /** \brief Bob deinterlacing algorithm. */
266
+ VAProcDeinterlacingBob,
267
+ /** \brief Weave deinterlacing algorithm. */
268
+ VAProcDeinterlacingWeave,
269
+ /** \brief Motion adaptive deinterlacing algorithm. */
270
+ VAProcDeinterlacingMotionAdaptive,
271
+ /** \brief Motion compensated deinterlacing algorithm. */
272
+ VAProcDeinterlacingMotionCompensated,
273
+ /** \brief Number of deinterlacing algorithms. */
274
+ VAProcDeinterlacingCount
275
+ } VAProcDeinterlacingType;
276
+
277
+ /** \brief Color balance types. */
278
+ typedef enum _VAProcColorBalanceType {
279
+ VAProcColorBalanceNone = 0,
280
+ /** \brief Hue. */
281
+ VAProcColorBalanceHue,
282
+ /** \brief Saturation. */
283
+ VAProcColorBalanceSaturation,
284
+ /** \brief Brightness. */
285
+ VAProcColorBalanceBrightness,
286
+ /** \brief Contrast. */
287
+ VAProcColorBalanceContrast,
288
+ /** \brief Automatically adjusted saturation. */
289
+ VAProcColorBalanceAutoSaturation,
290
+ /** \brief Automatically adjusted brightness. */
291
+ VAProcColorBalanceAutoBrightness,
292
+ /** \brief Automatically adjusted contrast. */
293
+ VAProcColorBalanceAutoContrast,
294
+ /** \brief Number of color balance attributes. */
295
+ VAProcColorBalanceCount
296
+ } VAProcColorBalanceType;
297
+
298
+ /** \brief Color standard types.
299
+ *
300
+ * These define a set of color properties corresponding to particular
301
+ * video standards.
302
+ *
303
+ * Where matrix_coefficients is specified, it applies only to YUV data -
304
+ * RGB data always use the identity matrix (matrix_coefficients = 0).
305
+ */
306
+ typedef enum _VAProcColorStandardType {
307
+ VAProcColorStandardNone = 0,
308
+ /** \brief ITU-R BT.601.
309
+ *
310
+ * It is unspecified whether this will use 525-line or 625-line values;
311
+ * specify the colour primaries and matrix coefficients explicitly if
312
+ * it is known which one is required.
313
+ *
314
+ * Equivalent to:
315
+ * colour_primaries = 5 or 6
316
+ * transfer_characteristics = 6
317
+ * matrix_coefficients = 5 or 6
318
+ */
319
+ VAProcColorStandardBT601,
320
+ /** \brief ITU-R BT.709.
321
+ *
322
+ * Equivalent to:
323
+ * colour_primaries = 1
324
+ * transfer_characteristics = 1
325
+ * matrix_coefficients = 1
326
+ */
327
+ VAProcColorStandardBT709,
328
+ /** \brief ITU-R BT.470-2 System M.
329
+ *
330
+ * Equivalent to:
331
+ * colour_primaries = 4
332
+ * transfer_characteristics = 4
333
+ * matrix_coefficients = 4
334
+ */
335
+ VAProcColorStandardBT470M,
336
+ /** \brief ITU-R BT.470-2 System B, G.
337
+ *
338
+ * Equivalent to:
339
+ * colour_primaries = 5
340
+ * transfer_characteristics = 5
341
+ * matrix_coefficients = 5
342
+ */
343
+ VAProcColorStandardBT470BG,
344
+ /** \brief SMPTE-170M.
345
+ *
346
+ * Equivalent to:
347
+ * colour_primaries = 6
348
+ * transfer_characteristics = 6
349
+ * matrix_coefficients = 6
350
+ */
351
+ VAProcColorStandardSMPTE170M,
352
+ /** \brief SMPTE-240M.
353
+ *
354
+ * Equivalent to:
355
+ * colour_primaries = 7
356
+ * transfer_characteristics = 7
357
+ * matrix_coefficients = 7
358
+ */
359
+ VAProcColorStandardSMPTE240M,
360
+ /** \brief Generic film.
361
+ *
362
+ * Equivalent to:
363
+ * colour_primaries = 8
364
+ * transfer_characteristics = 1
365
+ * matrix_coefficients = 1
366
+ */
367
+ VAProcColorStandardGenericFilm,
368
+ /** \brief sRGB.
369
+ *
370
+ * Equivalent to:
371
+ * colour_primaries = 1
372
+ * transfer_characteristics = 13
373
+ * matrix_coefficients = 0
374
+ */
375
+ VAProcColorStandardSRGB,
376
+ /** \brief stRGB.
377
+ *
378
+ * ???
379
+ */
380
+ VAProcColorStandardSTRGB,
381
+ /** \brief xvYCC601.
382
+ *
383
+ * Equivalent to:
384
+ * colour_primaries = 1
385
+ * transfer_characteristics = 11
386
+ * matrix_coefficients = 5
387
+ */
388
+ VAProcColorStandardXVYCC601,
389
+ /** \brief xvYCC709.
390
+ *
391
+ * Equivalent to:
392
+ * colour_primaries = 1
393
+ * transfer_characteristics = 11
394
+ * matrix_coefficients = 1
395
+ */
396
+ VAProcColorStandardXVYCC709,
397
+ /** \brief ITU-R BT.2020.
398
+ *
399
+ * Equivalent to:
400
+ * colour_primaries = 9
401
+ * transfer_characteristics = 14
402
+ * matrix_coefficients = 9
403
+ */
404
+ VAProcColorStandardBT2020,
405
+ /** \brief Explicitly specified color properties.
406
+ *
407
+ * Use corresponding color properties section.
408
+ * For example, HDR10 content:
409
+ * colour_primaries = 9 (BT2020)
410
+ * transfer_characteristics = 16 (SMPTE ST2084)
411
+ * matrix_coefficients = 9
412
+ */
413
+ VAProcColorStandardExplicit,
414
+ /** \brief Number of color standards. */
415
+ VAProcColorStandardCount
416
+ } VAProcColorStandardType;
417
+
418
+ /** \brief Total color correction types. */
419
+ typedef enum _VAProcTotalColorCorrectionType {
420
+ VAProcTotalColorCorrectionNone = 0,
421
+ /** \brief Red Saturation. */
422
+ VAProcTotalColorCorrectionRed,
423
+ /** \brief Green Saturation. */
424
+ VAProcTotalColorCorrectionGreen,
425
+ /** \brief Blue Saturation. */
426
+ VAProcTotalColorCorrectionBlue,
427
+ /** \brief Cyan Saturation. */
428
+ VAProcTotalColorCorrectionCyan,
429
+ /** \brief Magenta Saturation. */
430
+ VAProcTotalColorCorrectionMagenta,
431
+ /** \brief Yellow Saturation. */
432
+ VAProcTotalColorCorrectionYellow,
433
+ /** \brief Number of color correction attributes. */
434
+ VAProcTotalColorCorrectionCount
435
+ } VAProcTotalColorCorrectionType;
436
+
437
+ /** \brief High Dynamic Range Metadata types. */
438
+ typedef enum _VAProcHighDynamicRangeMetadataType {
439
+ VAProcHighDynamicRangeMetadataNone = 0,
440
+ /** \brief Metadata type for HDR10. */
441
+ VAProcHighDynamicRangeMetadataHDR10,
442
+ /** \brief Number of Metadata type. */
443
+ VAProcHighDynamicRangeMetadataTypeCount
444
+ } VAProcHighDynamicRangeMetadataType;
445
+
446
+ /** \brief Video Processing Mode. */
447
+ typedef enum _VAProcMode {
448
+ /**
449
+ * \brief Default Mode.
450
+ * In this mode, pipeline is decided in driver to the appropriate mode.
451
+ * e.g. a mode that's a balance between power and performance.
452
+ */
453
+ VAProcDefaultMode = 0,
454
+ /**
455
+ * \brief Power Saving Mode.
456
+ * In this mode, pipeline is optimized for power saving.
457
+ */
458
+ VAProcPowerSavingMode,
459
+ /**
460
+ * \brief Performance Mode.
461
+ * In this mode, pipeline is optimized for performance.
462
+ */
463
+ VAProcPerformanceMode
464
+ } VAProcMode;
465
+
466
+ /** @name Video blending flags */
467
+ /**@{*/
468
+ /** \brief Global alpha blending. */
469
+ #define VA_BLEND_GLOBAL_ALPHA 0x0001
470
+ /** \brief Premultiplied alpha blending (RGBA surfaces only). */
471
+ #define VA_BLEND_PREMULTIPLIED_ALPHA 0x0002
472
+ /** \brief Luma color key (YUV surfaces only). */
473
+ #define VA_BLEND_LUMA_KEY 0x0010
474
+ /**@}*/
475
+
476
+ /** \brief Video blending state definition. */
477
+ typedef struct _VABlendState {
478
+ /** \brief Video blending flags. */
479
+ unsigned int flags;
480
+ /**
481
+ * \brief Global alpha value.
482
+ *
483
+ * Valid if \ref flags has VA_BLEND_GLOBAL_ALPHA.
484
+ * Valid range is 0.0 to 1.0 inclusive.
485
+ */
486
+ float global_alpha;
487
+ /**
488
+ * \brief Minimum luma value.
489
+ *
490
+ * Valid if \ref flags has VA_BLEND_LUMA_KEY.
491
+ * Valid range is 0.0 to 1.0 inclusive.
492
+ * \ref min_luma shall be set to a sensible value lower than \ref max_luma.
493
+ */
494
+ float min_luma;
495
+ /**
496
+ * \brief Maximum luma value.
497
+ *
498
+ * Valid if \ref flags has VA_BLEND_LUMA_KEY.
499
+ * Valid range is 0.0 to 1.0 inclusive.
500
+ * \ref max_luma shall be set to a sensible value larger than \ref min_luma.
501
+ */
502
+ float max_luma;
503
+ } VABlendState;
504
+
505
+ /** @name Video pipeline flags */
506
+ /**@{*/
507
+ /** \brief Specifies whether to apply subpictures when processing a surface. */
508
+ #define VA_PROC_PIPELINE_SUBPICTURES 0x00000001
509
+ /**
510
+ * \brief Specifies whether to apply power or performance
511
+ * optimizations to a pipeline.
512
+ *
513
+ * When processing several surfaces, it may be necessary to prioritize
514
+ * more certain pipelines than others. This flag is only a hint to the
515
+ * video processor so that it can omit certain filters to save power
516
+ * for example. Typically, this flag could be used with video surfaces
517
+ * decoded from a secondary bitstream.
518
+ */
519
+ #define VA_PROC_PIPELINE_FAST 0x00000002
520
+ /**@}*/
521
+
522
+ /** @name Video filter flags */
523
+ /**@{*/
524
+ /** \brief Specifies whether the filter shall be present in the pipeline. */
525
+ #define VA_PROC_FILTER_MANDATORY 0x00000001
526
+ /**@}*/
527
+
528
+ /** @name Pipeline end flags */
529
+ /**@{*/
530
+ /** \brief Specifies the pipeline is the last. */
531
+ #define VA_PIPELINE_FLAG_END 0x00000004
532
+ /**@}*/
533
+
534
+ /** @name Chroma Siting flag */
535
+ /**@{*/
536
+ /** vertical chroma sitting take bit 0-1, horizontal chroma sitting take bit 2-3
537
+ * vertical chromma siting | horizontal chroma sitting to be chroma sitting */
538
+ #define VA_CHROMA_SITING_UNKNOWN 0x00
539
+ /** \brief Chroma samples are co-sited vertically on the top with the luma samples. */
540
+ #define VA_CHROMA_SITING_VERTICAL_TOP 0x01
541
+ /** \brief Chroma samples are not co-sited vertically with the luma samples. */
542
+ #define VA_CHROMA_SITING_VERTICAL_CENTER 0x02
543
+ /** \brief Chroma samples are co-sited vertically on the bottom with the luma samples. */
544
+ #define VA_CHROMA_SITING_VERTICAL_BOTTOM 0x03
545
+ /** \brief Chroma samples are co-sited horizontally on the left with the luma samples. */
546
+ #define VA_CHROMA_SITING_HORIZONTAL_LEFT 0x04
547
+ /** \brief Chroma samples are not co-sited horizontally with the luma samples. */
548
+ #define VA_CHROMA_SITING_HORIZONTAL_CENTER 0x08
549
+ /**@}*/
550
+
551
+ /**
552
+ * This is to indicate that the color-space conversion uses full range or reduced range.
553
+ * VA_SOURCE_RANGE_FULL(Full range): Y/Cb/Cr is in [0, 255]. It is mainly used
554
+ * for JPEG/JFIF formats. The combination with the BT601 flag means that
555
+ * JPEG/JFIF color-space conversion matrix is used.
556
+ * VA_SOURCE_RANGE_REDUCED(Reduced range): Y is in [16, 235] and Cb/Cr is in [16, 240].
557
+ * It is mainly used for the YUV->RGB color-space conversion in SDTV/HDTV/UHDTV.
558
+ */
559
+ #define VA_SOURCE_RANGE_UNKNOWN 0
560
+ #define VA_SOURCE_RANGE_REDUCED 1
561
+ #define VA_SOURCE_RANGE_FULL 2
562
+
563
+ /** @name Tone Mapping flags multiple HDR mode*/
564
+ /**@{*/
565
+ /** \brief Tone Mapping from HDR content to HDR display. */
566
+ #define VA_TONE_MAPPING_HDR_TO_HDR 0x0001
567
+ /** \brief Tone Mapping from HDR content to SDR display. */
568
+ #define VA_TONE_MAPPING_HDR_TO_SDR 0x0002
569
+ /** \brief Tone Mapping from HDR content to EDR display. */
570
+ #define VA_TONE_MAPPING_HDR_TO_EDR 0x0004
571
+ /** \brief Tone Mapping from SDR content to HDR display. */
572
+ #define VA_TONE_MAPPING_SDR_TO_HDR 0x0008
573
+ /**@}*/
574
+
575
+ /** \brief Video processing pipeline capabilities. */
576
+ typedef struct _VAProcPipelineCaps {
577
+ /** \brief Pipeline flags. See VAProcPipelineParameterBuffer::pipeline_flags. */
578
+ uint32_t pipeline_flags;
579
+ /** \brief Extra filter flags. See VAProcPipelineParameterBuffer::filter_flags. */
580
+ uint32_t filter_flags;
581
+ /** \brief Number of forward reference frames that are needed. */
582
+ uint32_t num_forward_references;
583
+ /** \brief Number of backward reference frames that are needed. */
584
+ uint32_t num_backward_references;
585
+ /** \brief List of color standards supported on input. */
586
+ VAProcColorStandardType *input_color_standards;
587
+ /** \brief Number of elements in \ref input_color_standards array. */
588
+ uint32_t num_input_color_standards;
589
+ /** \brief List of color standards supported on output. */
590
+ VAProcColorStandardType *output_color_standards;
591
+ /** \brief Number of elements in \ref output_color_standards array. */
592
+ uint32_t num_output_color_standards;
593
+
594
+ /**
595
+ * \brief Rotation flags.
596
+ *
597
+ * For each rotation angle supported by the underlying hardware,
598
+ * the corresponding bit is set in \ref rotation_flags. See
599
+ * "Rotation angles" for a description of rotation angles.
600
+ *
601
+ * A value of 0 means the underlying hardware does not support any
602
+ * rotation. Otherwise, a check for a specific rotation angle can be
603
+ * performed as follows:
604
+ *
605
+ * \code
606
+ * VAProcPipelineCaps pipeline_caps;
607
+ * ...
608
+ * vaQueryVideoProcPipelineCaps(va_dpy, vpp_ctx,
609
+ * filter_bufs, num_filter_bufs,
610
+ * &pipeline_caps
611
+ * );
612
+ * ...
613
+ * if (pipeline_caps.rotation_flags & (1 << VA_ROTATION_xxx)) {
614
+ * // Clockwise rotation by xxx degrees is supported
615
+ * ...
616
+ * }
617
+ * \endcode
618
+ */
619
+ uint32_t rotation_flags;
620
+ /** \brief Blend flags. See "Video blending flags". */
621
+ uint32_t blend_flags;
622
+ /**
623
+ * \brief Mirroring flags.
624
+ *
625
+ * For each mirroring direction supported by the underlying hardware,
626
+ * the corresponding bit is set in \ref mirror_flags. See
627
+ * "Mirroring directions" for a description of mirroring directions.
628
+ *
629
+ */
630
+ uint32_t mirror_flags;
631
+ /** \brief Number of additional output surfaces supported by the pipeline */
632
+ uint32_t num_additional_outputs;
633
+
634
+ /** \brief Number of elements in \ref input_pixel_format array. */
635
+ uint32_t num_input_pixel_formats;
636
+ /** \brief List of input pixel formats in fourcc. */
637
+ uint32_t *input_pixel_format;
638
+ /** \brief Number of elements in \ref output_pixel_format array. */
639
+ uint32_t num_output_pixel_formats;
640
+ /** \brief List of output pixel formats in fourcc. */
641
+ uint32_t *output_pixel_format;
642
+
643
+ /** \brief Max supported input width in pixels. */
644
+ uint32_t max_input_width;
645
+ /** \brief Max supported input height in pixels. */
646
+ uint32_t max_input_height;
647
+ /** \brief Min supported input width in pixels. */
648
+ uint32_t min_input_width;
649
+ /** \brief Min supported input height in pixels. */
650
+ uint32_t min_input_height;
651
+
652
+ /** \brief Max supported output width in pixels. */
653
+ uint32_t max_output_width;
654
+ /** \brief Max supported output height in pixels. */
655
+ uint32_t max_output_height;
656
+ /** \brief Min supported output width in pixels. */
657
+ uint32_t min_output_width;
658
+ /** \brief Min supported output height in pixels. */
659
+ uint32_t min_output_height;
660
+ /** \brief Reserved bytes for future use, must be zero */
661
+ #if defined(__AMD64__) || defined(__x86_64__) || defined(__amd64__) || defined(__LP64__)
662
+ uint32_t va_reserved[VA_PADDING_HIGH - 2];
663
+ #else
664
+ uint32_t va_reserved[VA_PADDING_HIGH];
665
+ #endif
666
+ } VAProcPipelineCaps;
667
+
668
+ /** \brief Specification of values supported by the filter. */
669
+ typedef struct _VAProcFilterValueRange {
670
+ /** \brief Minimum value supported, inclusive. */
671
+ float min_value;
672
+ /** \brief Maximum value supported, inclusive. */
673
+ float max_value;
674
+ /** \brief Default value. */
675
+ float default_value;
676
+ /** \brief Step value that alters the filter behaviour in a sensible way. */
677
+ float step;
678
+
679
+ /** \brief Reserved bytes for future use, must be zero */
680
+ uint32_t va_reserved[VA_PADDING_LOW];
681
+ } VAProcFilterValueRange;
682
+
683
+ typedef struct _VAProcColorProperties {
684
+ /** Chroma sample location.\c VA_CHROMA_SITING_VERTICAL_XXX | VA_CHROMA_SITING_HORIZONTAL_XXX */
685
+ uint8_t chroma_sample_location;
686
+ /** Color range. \c VA_SOURCE_RANGE_XXX*/
687
+ uint8_t color_range;
688
+ /** Colour primaries.
689
+ *
690
+ * See ISO/IEC 23001-8 or ITU H.273, section 8.1 and table 2.
691
+ * Only used if the color standard in use is \c VAColorStandardExplicit.
692
+ * Below list the typical colour primaries for the reference.
693
+ * ---------------------------------------------------------------------------------
694
+ * | Value | Primaries | Informative Remark |
695
+ * --------------------------------------------------------------------------------
696
+ * | 1 |primary x y |Rec.ITU-R BT.709-5 |
697
+ * | |green 0.300 0.600 |IEC 61966-2-1(sRGB or sYCC) |
698
+ * | |blue 0.150 0.060 | |
699
+ * | |red 0.640 0.330 | |
700
+ * | |whiteD65 0.3127 0.3290 | |
701
+ * ---------------------------------------------------------------------------------
702
+ * | 6 |primary x y |Rec.ITU-R BT.601-6 525 |
703
+ * | |green 0.310 0.595 | |
704
+ * | |blue 0.155 0.070 | |
705
+ * | |red 0.630 0.340 | |
706
+ * | |whiteD65 0.3127 0.3290 | |
707
+ * ---------------------------------------------------------------------------------
708
+ * | 9 |primary x y |Rec.ITU-R BT.2020 |
709
+ * | |green 0.170 0.797 | |
710
+ * | |blue 0.131 0.046 | |
711
+ * | |red 0.708 0.292 | |
712
+ * | |whiteD65 0.3127 0.3290 | |
713
+ * ---------------------------------------------------------------------------------
714
+ */
715
+ uint8_t colour_primaries;
716
+ /** Transfer characteristics.
717
+ *
718
+ * See ISO/IEC 23001-8 or ITU H.273, section 8.2 and table 3.
719
+ * Only used if the color standard in use is \c VAColorStandardExplicit.
720
+ * Below list the typical transfer characteristics for the reference.
721
+ * -----------------------------------------------------------
722
+ * | Value | Informative Remark |
723
+ * -----------------------------------------------------------
724
+ * | 1 |Rec.ITU-R BT.709-5 |
725
+ * | |colour gamut system |
726
+ * -----------------------------------------------------------
727
+ * | 4 |Assumed display gamma 2.2 |
728
+ * -----------------------------------------------------------
729
+ * | 6 |Rec.ITU-R BT.601-6 525 or 625 |
730
+ * -----------------------------------------------------------
731
+ * | 8 |Linear transfer characteristics |
732
+ * -----------------------------------------------------------
733
+ * | 13 |IEC 61966-2-1(sRGB or sYCC) |
734
+ * -----------------------------------------------------------
735
+ * | 14,15 |Rec.ITU-R BT.2020 |
736
+ * -----------------------------------------------------------
737
+ * | 16 |SMPTE ST 2084 for 10,12,14 and 16bit system |
738
+ * -----------------------------------------------------------
739
+ */
740
+ uint8_t transfer_characteristics;
741
+ /** Matrix coefficients.
742
+ *
743
+ * See ISO/IEC 23001-8 or ITU H.273, section 8.3 and table 4.
744
+ * Only used if the color standard in use is \c VAColorStandardExplicit.
745
+ */
746
+ uint8_t matrix_coefficients;
747
+ /** Reserved bytes for future use, must be zero. */
748
+ uint8_t reserved[3];
749
+ } VAProcColorProperties;
750
+
751
+ /** \brief Describes High Dynamic Range Meta Data for HDR10.
752
+ *
753
+ * Specifies the colour volume(the colour primaries, white point and luminance range) of
754
+ * a display considered to be the mastering display for the associated video content -e.g.,
755
+ * the colour volume of a display that was used for viewing while authoring the video content.
756
+ * See ITU-T H.265 D.3.27 Mastering display colour volume SEI message semantics.
757
+ *
758
+ * Specifies upper bounds for the nominal light level of the content. See ITU-T H.265 D.3.35
759
+ * Content light level information SEI message semantics.
760
+ *
761
+ * This structure can be used to indicate the HDR10 metadata for 1) the content which was authored;
762
+ * 2) the display on which the content will be presented. If it is for display, max_content_light_level
763
+ * and max_pic_average_light_level are ignored.
764
+ */
765
+ typedef struct _VAHdrMetaDataHDR10 {
766
+ /**
767
+ * \brief X chromaticity coordinate of the mastering display.
768
+ *
769
+ * Index value c equal to 0 should correspond to the green primary.
770
+ * Index value c equal to 1 should correspond to the blue primary.
771
+ * Index value c equal to 2 should correspond to the red primary.
772
+ * The value for display_primaries_x shall be in the range of 0 to 50000 inclusive.
773
+ */
774
+ uint16_t display_primaries_x[3];
775
+ /**
776
+ * \brief Y chromaticity coordinate of the mastering display.
777
+ *
778
+ * Index value c equal to 0 should correspond to the green primary.
779
+ * Index value c equal to 1 should correspond to the blue primary.
780
+ * Index value c equal to 2 should correspond to the red primary.
781
+ * The value for display_primaries_y shall be in the range of 0 to 50000 inclusive.
782
+ */
783
+ uint16_t display_primaries_y[3];
784
+ /**
785
+ * \brief X chromaticity coordinate of the white point of the mastering display.
786
+ *
787
+ * The value for white_point_x shall be in the range of 0 to 50000 inclusive.
788
+ */
789
+ uint16_t white_point_x;
790
+ /**
791
+ * \brief Y chromaticity coordinate of the white point of the mastering display.
792
+ *
793
+ * The value for white_point_y shall be in the range of 0 to 50000 inclusive.
794
+ */
795
+ uint16_t white_point_y;
796
+ /**
797
+ * \brief The maximum display luminance of the mastering display.
798
+ *
799
+ * The value is in units of 0.0001 candelas per square metre.
800
+ */
801
+ uint32_t max_display_mastering_luminance;
802
+ /**
803
+ * \brief The minumum display luminance of the mastering display.
804
+ *
805
+ * The value is in units of 0.0001 candelas per square metre.
806
+ */
807
+ uint32_t min_display_mastering_luminance;
808
+ /**
809
+ * \brief The maximum content light level (MaxCLL).
810
+ *
811
+ * The value is in units of 1 candelas per square metre.
812
+ */
813
+ uint16_t max_content_light_level;
814
+ /**
815
+ * \brief The maximum picture average light level (MaxFALL).
816
+ *
817
+ * The value is in units of 1 candelas per square metre.
818
+ */
819
+ uint16_t max_pic_average_light_level;
820
+ /** Resevered */
821
+ uint16_t reserved[VA_PADDING_HIGH];
822
+ } VAHdrMetaDataHDR10;
823
+
824
+ /** \brief Capabilities specification for the High Dynamic Range filter. */
825
+ typedef struct _VAProcFilterCapHighDynamicRange {
826
+ /** \brief high dynamic range type. */
827
+ VAProcHighDynamicRangeMetadataType metadata_type;
828
+ /**
829
+ * \brief flag for high dynamic range tone mapping
830
+ *
831
+ * The flag is the combination of VA_TONE_MAPPING_XXX_TO_XXX.
832
+ * It could be VA_TONE_MAPPING_HDR_TO_HDR | VA_TONE_MAPPING_HDR_TO_SDR.
833
+ * SDR content to SDR display is always supported by default since it is legacy path.
834
+ */
835
+ uint16_t caps_flag;
836
+ /** \brief Reserved bytes for future use, must be zero */
837
+ uint16_t va_reserved[VA_PADDING_HIGH];
838
+ } VAProcFilterCapHighDynamicRange;
839
+
840
+ /** \brief High Dynamic Range Meta Data. */
841
+ typedef struct _VAHdrMetaData {
842
+ /** \brief high dynamic range metadata type, HDR10 etc. */
843
+ VAProcHighDynamicRangeMetadataType metadata_type;
844
+ /**
845
+ * \brief Pointer to high dynamic range metadata.
846
+ *
847
+ * The pointer could point to VAHdrMetaDataHDR10 or other HDR meta data.
848
+ */
849
+ void* metadata;
850
+ /**
851
+ * \brief Size of high dynamic range metadata.
852
+ */
853
+ uint32_t metadata_size;
854
+ /** \brief Reserved bytes for future use, must be zero */
855
+ uint32_t reserved[VA_PADDING_LOW];
856
+ } VAHdrMetaData;
857
+
858
+ /**
859
+ * \brief Video processing pipeline configuration.
860
+ *
861
+ * This buffer defines a video processing pipeline. The actual filters to
862
+ * be applied are provided in the \c filters field, they can be re-used
863
+ * in other processing pipelines.
864
+ *
865
+ * The target surface is specified by the \c render_target argument of
866
+ * \c vaBeginPicture(). The general usage model is described as follows:
867
+ * - \c vaBeginPicture(): specify the target surface that receives the
868
+ * processed output;
869
+ * - \c vaRenderPicture(): specify a surface to be processed and composed
870
+ * into the \c render_target. Use as many \c vaRenderPicture() calls as
871
+ * necessary surfaces to compose ;
872
+ * - \c vaEndPicture(): tell the driver to start processing the surfaces
873
+ * with the requested filters.
874
+ *
875
+ * If a filter (e.g. noise reduction) needs to be applied with different
876
+ * values for multiple surfaces, the application needs to create as many
877
+ * filter parameter buffers as necessary. i.e. the filter parameters shall
878
+ * not change between two calls to \c vaRenderPicture().
879
+ *
880
+ * For composition usage models, the first surface to process will generally
881
+ * use an opaque background color, i.e. \c output_background_color set with
882
+ * the most significant byte set to \c 0xff. For instance, \c 0xff000000 for
883
+ * a black background. Then, subsequent surfaces would use a transparent
884
+ * background color.
885
+ */
886
+ typedef struct _VAProcPipelineParameterBuffer {
887
+ /**
888
+ * \brief Source surface ID.
889
+ *
890
+ * ID of the source surface to process. If subpictures are associated
891
+ * with the video surfaces then they shall be rendered to the target
892
+ * surface, if the #VA_PROC_PIPELINE_SUBPICTURES pipeline flag is set.
893
+ */
894
+ VASurfaceID surface;
895
+ /**
896
+ * \brief Region within the source surface to be processed.
897
+ *
898
+ * Pointer to a #VARectangle defining the region within the source
899
+ * surface to be processed. If NULL, \c surface_region implies the
900
+ * whole surface.
901
+ */
902
+ const VARectangle *surface_region;
903
+ /**
904
+ * \brief Requested input color standard.
905
+ *
906
+ * Color properties are implicitly converted throughout the processing
907
+ * pipeline. The video processor chooses the best moment to apply
908
+ * this conversion. The set of supported color standards for input shall
909
+ * be queried with vaQueryVideoProcPipelineCaps().
910
+ *
911
+ * If this is set to VAProcColorStandardExplicit, the color properties
912
+ * are specified explicitly in input_color_properties instead.
913
+ */
914
+ VAProcColorStandardType surface_color_standard;
915
+ /**
916
+ * \brief Region within the output surface.
917
+ *
918
+ * Pointer to a #VARectangle defining the region within the output
919
+ * surface that receives the processed pixels. If NULL, \c output_region
920
+ * implies the whole surface.
921
+ *
922
+ * Note that any pixels residing outside the specified region will
923
+ * be filled in with the \ref output_background_color.
924
+ */
925
+ const VARectangle *output_region;
926
+ /**
927
+ * \brief Background color.
928
+ *
929
+ * Background color used to fill in pixels that reside outside of the
930
+ * specified \ref output_region. The color is specified in ARGB format:
931
+ * [31:24] alpha, [23:16] red, [15:8] green, [7:0] blue.
932
+ *
933
+ * Unless the alpha value is zero or the \ref output_region represents
934
+ * the whole target surface size, implementations shall not render the
935
+ * source surface to the target surface directly. Rather, in order to
936
+ * maintain the exact semantics of \ref output_background_color, the
937
+ * driver shall use a temporary surface and fill it in with the
938
+ * appropriate background color. Next, the driver will blend this
939
+ * temporary surface into the target surface.
940
+ */
941
+ uint32_t output_background_color;
942
+ /**
943
+ * \brief Requested output color standard.
944
+ *
945
+ * If this is set to VAProcColorStandardExplicit, the color properties
946
+ * are specified explicitly in output_color_properties instead.
947
+ */
948
+ VAProcColorStandardType output_color_standard;
949
+ /**
950
+ * \brief Pipeline filters. See video pipeline flags.
951
+ *
952
+ * Flags to control the pipeline, like whether to apply subpictures
953
+ * or not, notify the driver that it can opt for power optimizations,
954
+ * should this be needed.
955
+ */
956
+ uint32_t pipeline_flags;
957
+ /**
958
+ * \brief Extra filter flags. See vaPutSurface() flags.
959
+ *
960
+ * Filter flags are used as a fast path, wherever possible, to use
961
+ * vaPutSurface() flags instead of explicit filter parameter buffers.
962
+ *
963
+ * Allowed filter flags API-wise. Use vaQueryVideoProcPipelineCaps()
964
+ * to check for implementation details:
965
+ * - Bob-deinterlacing: \c VA_FRAME_PICTURE, \c VA_TOP_FIELD,
966
+ * \c VA_BOTTOM_FIELD. Note that any deinterlacing filter
967
+ * (#VAProcFilterDeinterlacing) will override those flags.
968
+ * - Color space conversion: \c VA_SRC_BT601, \c VA_SRC_BT709,
969
+ * \c VA_SRC_SMPTE_240.
970
+ * - Scaling: \c VA_FILTER_SCALING_DEFAULT, \c VA_FILTER_SCALING_FAST,
971
+ * \c VA_FILTER_SCALING_HQ, \c VA_FILTER_SCALING_NL_ANAMORPHIC.
972
+ * - Interpolation Method: \c VA_FILTER_INTERPOLATION_DEFAULT,
973
+ * \c VA_FILTER_INTERPOLATION_NEAREST_NEIGHBOR,
974
+ * \c VA_FILTER_INTERPOLATION_BILINEAR, \c VA_FILTER_INTERPOLATION_ADVANCED.
975
+ */
976
+ uint32_t filter_flags;
977
+ /**
978
+ * \brief Array of filters to apply to the surface.
979
+ *
980
+ * The list of filters shall be ordered in the same way the driver expects
981
+ * them. i.e. as was returned from vaQueryVideoProcFilters().
982
+ * Otherwise, a #VA_STATUS_ERROR_INVALID_FILTER_CHAIN is returned
983
+ * from vaRenderPicture() with this buffer.
984
+ *
985
+ * #VA_STATUS_ERROR_UNSUPPORTED_FILTER is returned if the list
986
+ * contains an unsupported filter.
987
+ *
988
+ */
989
+ VABufferID *filters;
990
+ /** \brief Actual number of filters. */
991
+ uint32_t num_filters;
992
+ /** \brief Array of forward reference frames (past frames). */
993
+ VASurfaceID *forward_references;
994
+ /** \brief Number of forward reference frames that were supplied. */
995
+ uint32_t num_forward_references;
996
+ /** \brief Array of backward reference frames (future frames). */
997
+ VASurfaceID *backward_references;
998
+ /** \brief Number of backward reference frames that were supplied. */
999
+ uint32_t num_backward_references;
1000
+ /**
1001
+ * \brief Rotation state. See rotation angles.
1002
+ *
1003
+ * The rotation angle is clockwise. There is no specific rotation
1004
+ * center for this operation. Rather, The source \ref surface is
1005
+ * first rotated by the specified angle and then scaled to fit the
1006
+ * \ref output_region.
1007
+ *
1008
+ * This means that the top-left hand corner (0,0) of the output
1009
+ * (rotated) surface is expressed as follows:
1010
+ * - \ref VA_ROTATION_NONE: (0,0) is the top left corner of the
1011
+ * source surface -- no rotation is performed ;
1012
+ * - \ref VA_ROTATION_90: (0,0) is the bottom-left corner of the
1013
+ * source surface ;
1014
+ * - \ref VA_ROTATION_180: (0,0) is the bottom-right corner of the
1015
+ * source surface -- the surface is flipped around the X axis ;
1016
+ * - \ref VA_ROTATION_270: (0,0) is the top-right corner of the
1017
+ * source surface.
1018
+ *
1019
+ * Check VAProcPipelineCaps::rotation_flags first prior to
1020
+ * defining a specific rotation angle. Otherwise, the hardware can
1021
+ * perfectly ignore this variable if it does not support any
1022
+ * rotation.
1023
+ */
1024
+ uint32_t rotation_state;
1025
+ /**
1026
+ * \brief blending state. See "Video blending state definition".
1027
+ *
1028
+ * If \ref blend_state is NULL, then default operation mode depends
1029
+ * on the source \ref surface format:
1030
+ * - RGB: per-pixel alpha blending ;
1031
+ * - YUV: no blending, i.e override the underlying pixels.
1032
+ *
1033
+ * Otherwise, \ref blend_state is a pointer to a #VABlendState
1034
+ * structure that shall be live until vaEndPicture().
1035
+ *
1036
+ * Implementation note: the driver is responsible for checking the
1037
+ * blend state flags against the actual source \ref surface format.
1038
+ * e.g. premultiplied alpha blending is only applicable to RGB
1039
+ * surfaces, and luma keying is only applicable to YUV surfaces.
1040
+ * If a mismatch occurs, then #VA_STATUS_ERROR_INVALID_BLEND_STATE
1041
+ * is returned.
1042
+ */
1043
+ const VABlendState *blend_state;
1044
+ /**
1045
+ * \brief mirroring state. See "Mirroring directions".
1046
+ *
1047
+ * Mirroring of an image can be performed either along the
1048
+ * horizontal or vertical axis. It is assumed that the rotation
1049
+ * operation is always performed before the mirroring operation.
1050
+ */
1051
+ uint32_t mirror_state;
1052
+ /** \brief Array of additional output surfaces. */
1053
+ VASurfaceID *additional_outputs;
1054
+ /** \brief Number of additional output surfaces. */
1055
+ uint32_t num_additional_outputs;
1056
+ /**
1057
+ * \brief Flag to indicate the input surface flag
1058
+ *
1059
+ * bit0~3: Surface sample type
1060
+ * - 0000: Progressive --> VA_FRAME_PICTURE
1061
+ * - 0001: Single Top Field --> VA_TOP_FIELD
1062
+ * - 0010: Single Bottom Field --> VA_BOTTOM_FIELD
1063
+ * - 0100: Interleaved Top Field First --> VA_TOP_FIELD_FIRST
1064
+ * - 1000: Interleaved Bottom Field First --> VA_BOTTOM_FIELD_FIRST
1065
+ *
1066
+ * For interlaced scaling, examples as follow:
1067
+ * - 1. Interleaved to Interleaved (Suppose input is top field first)
1068
+ * -- set input_surface_flag as VA_TOP_FIELD_FIRST
1069
+ * -- set output_surface_flag as VA_TOP_FIELD_FIRST
1070
+ * - 2. Interleaved to Field (Suppose input is top field first)
1071
+ * An interleaved frame need to be passed twice.
1072
+ * First cycle to get the first field:
1073
+ * -- set input_surface_flag as VA_TOP_FIELD_FIRST
1074
+ * -- set output_surface_flag as VA_TOP_FIELD
1075
+ * Second cycle to get the second field:
1076
+ * -- set input_surface_flag as VA_TOP_FIELD_FIRST
1077
+ * -- set output_surface_flag as VA_BOTTOM_FIELD
1078
+ * - 3. Field to Interleaved (Suppose first field is top field)
1079
+ * -- create two surfaces, one for top field, the other for bottom field
1080
+ * -- set surface with the first field surface id
1081
+ * -- set backward_reference with the second field surface id
1082
+ * -- set input_surface_flag as VA_TOP_FIELD
1083
+ * -- set output_surface_flag as VA_TOP_FIELD_FIRST
1084
+ * - 4. Field to Field:
1085
+ * -- set flag according to each frame.
1086
+ *
1087
+ * bit31: Surface encryption
1088
+ * - 0: non-protected
1089
+ * - 1: protected
1090
+ *
1091
+ * bit4~30 for future
1092
+ */
1093
+ uint32_t input_surface_flag;
1094
+ /**
1095
+ * \brief Flag to indicate the output surface flag
1096
+ *
1097
+ * bit0~3: Surface sample type
1098
+ * - 0000: Progressive --> VA_FRAME_PICTURE
1099
+ * - 0001: Top Field --> VA_TOP_FIELD
1100
+ * - 0010: Bottom Field --> VA_BOTTOM_FIELD
1101
+ * - 0100: Top Field First --> VA_TOP_FIELD_FIRST
1102
+ * - 1000: Bottom Field First --> VA_BOTTOM_FIELD_FIRST
1103
+ *
1104
+ * bit31: Surface encryption
1105
+ * - 0: non-protected
1106
+ * - 1: protected
1107
+ *
1108
+ * bit4~30 for future
1109
+ */
1110
+ uint32_t output_surface_flag;
1111
+ /**
1112
+ * \brief Input Color Properties. See "VAProcColorProperties".
1113
+ */
1114
+ VAProcColorProperties input_color_properties;
1115
+ /**
1116
+ * \brief Output Color Properties. See "VAProcColorProperties".
1117
+ */
1118
+ VAProcColorProperties output_color_properties;
1119
+ /**
1120
+ * \brief Processing mode. See "VAProcMode".
1121
+ */
1122
+ VAProcMode processing_mode;
1123
+ /**
1124
+ * \brief Output High Dynamic Metadata.
1125
+ *
1126
+ * If output_metadata is NULL, then output default to SDR.
1127
+ */
1128
+ VAHdrMetaData *output_hdr_metadata;
1129
+
1130
+ /** \brief Reserved bytes for future use, must be zero */
1131
+ #if defined(__AMD64__) || defined(__x86_64__) || defined(__amd64__)|| defined(__LP64__)
1132
+ uint32_t va_reserved[VA_PADDING_LARGE - 16];
1133
+ #else
1134
+ uint32_t va_reserved[VA_PADDING_LARGE - 13];
1135
+ #endif
1136
+ } VAProcPipelineParameterBuffer;
1137
+
1138
+ /**
1139
+ * \brief Filter parameter buffer base.
1140
+ *
1141
+ * This is a helper structure used by driver implementations only.
1142
+ * Users are not supposed to allocate filter parameter buffers of this
1143
+ * type.
1144
+ */
1145
+ typedef struct _VAProcFilterParameterBufferBase {
1146
+ /** \brief Filter type. */
1147
+ VAProcFilterType type;
1148
+ } VAProcFilterParameterBufferBase;
1149
+
1150
+ /**
1151
+ * \brief Default filter parametrization.
1152
+ *
1153
+ * Unless there is a filter-specific parameter buffer,
1154
+ * #VAProcFilterParameterBuffer is the default type to use.
1155
+ */
1156
+ typedef struct _VAProcFilterParameterBuffer {
1157
+ /** \brief Filter type. */
1158
+ VAProcFilterType type;
1159
+ /** \brief Value. */
1160
+ float value;
1161
+
1162
+ /** \brief Reserved bytes for future use, must be zero */
1163
+ uint32_t va_reserved[VA_PADDING_LOW];
1164
+ } VAProcFilterParameterBuffer;
1165
+
1166
+ /** @name De-interlacing flags */
1167
+ /**@{*/
1168
+ /**
1169
+ * \brief Bottom field first in the input frame.
1170
+ * if this is not set then assumes top field first.
1171
+ */
1172
+ #define VA_DEINTERLACING_BOTTOM_FIELD_FIRST 0x0001
1173
+ /**
1174
+ * \brief Bottom field used in deinterlacing.
1175
+ * if this is not set then assumes top field is used.
1176
+ */
1177
+ #define VA_DEINTERLACING_BOTTOM_FIELD 0x0002
1178
+ /**
1179
+ * \brief A single field is stored in the input frame.
1180
+ * if this is not set then assumes the frame contains two interleaved fields.
1181
+ */
1182
+ #define VA_DEINTERLACING_ONE_FIELD 0x0004
1183
+ /**
1184
+ * \brief Film Mode Detection is enabled. If enabled, driver performs inverse
1185
+ * of various pulldowns, such as 3:2 pulldown.
1186
+ * if this is not set then assumes FMD is disabled.
1187
+ */
1188
+ #define VA_DEINTERLACING_FMD_ENABLE 0x0008
1189
+
1190
+ //Scene change parameter for ADI on Linux, if enabled, driver use spatial DI(Bob), instead of ADI. if not, use old behavior for ADI
1191
+ //Input stream is TFF(set flags = 0), SRC0,1,2,3 are interlaced frame (top +bottom fields), DSTs are progressive frames
1192
+ //30i->30p
1193
+ //SRC0 -> BOBDI, no reference, set flag = 0, output DST0
1194
+ //SRC1 -> ADI, reference frame=SRC0, set flags = 0, call VP, output DST1
1195
+ //SRC2 -> ADI, reference frame=SRC1, set flags = 0x0010(decimal 16), call VP, output DST2(T4)
1196
+ //SRC3 -> ADI, reference frame=SRC2, set flags = 0, call VP, output DST3
1197
+ //30i->60p
1198
+ //SRC0 -> BOBDI, no reference, set flag = 0, output DST0
1199
+ //SRC0 -> BOBDI, no reference, set flag =0x0002, output DST1
1200
+
1201
+ //SRC1 -> ADI, reference frame =SRC0, set flags = 0, call VP, output DST2
1202
+ //SRC1 -> ADI, reference frame =SRC0, set flags = 0x0012(decimal18), call VP, output DST3(B3)
1203
+
1204
+ //SRC2 -> ADI, reference frame =SRC1, set flags = 0x0010(decimal 16), call VP, output DST4(T4)
1205
+ //SRC2 -> ADI, reference frame =SRC1, set flags = 0x0002, call VP, output DST5
1206
+
1207
+ //SRC3 -> ADI, reference frame =SRC2, set flags = 0, call VP, output DST6
1208
+ //SRC3 -> ADI, reference frame =SRC1, set flags = 0x0002, call VP, output DST7
1209
+
1210
+ #define VA_DEINTERLACING_SCD_ENABLE 0x0010
1211
+
1212
+ /**@}*/
1213
+
1214
+ /** \brief Deinterlacing filter parametrization. */
1215
+ typedef struct _VAProcFilterParameterBufferDeinterlacing {
1216
+ /** \brief Filter type. Shall be set to #VAProcFilterDeinterlacing. */
1217
+ VAProcFilterType type;
1218
+ /** \brief Deinterlacing algorithm. */
1219
+ VAProcDeinterlacingType algorithm;
1220
+ /** \brief Deinterlacing flags. */
1221
+ uint32_t flags;
1222
+
1223
+ /** \brief Reserved bytes for future use, must be zero */
1224
+ uint32_t va_reserved[VA_PADDING_LOW];
1225
+ } VAProcFilterParameterBufferDeinterlacing;
1226
+
1227
+ /**
1228
+ * \brief Color balance filter parametrization.
1229
+ *
1230
+ * This buffer defines color balance attributes. A VA buffer can hold
1231
+ * several color balance attributes by creating a VA buffer of desired
1232
+ * number of elements. This can be achieved by the following pseudo-code:
1233
+ *
1234
+ * \code
1235
+ * enum { kHue, kSaturation, kBrightness, kContrast };
1236
+ *
1237
+ * // Initial color balance parameters
1238
+ * static const VAProcFilterParameterBufferColorBalance colorBalanceParams[4] =
1239
+ * {
1240
+ * [kHue] =
1241
+ * { VAProcFilterColorBalance, VAProcColorBalanceHue, 0.5 },
1242
+ * [kSaturation] =
1243
+ * { VAProcFilterColorBalance, VAProcColorBalanceSaturation, 0.5 },
1244
+ * [kBrightness] =
1245
+ * { VAProcFilterColorBalance, VAProcColorBalanceBrightness, 0.5 },
1246
+ * [kSaturation] =
1247
+ * { VAProcFilterColorBalance, VAProcColorBalanceSaturation, 0.5 }
1248
+ * };
1249
+ *
1250
+ * // Create buffer
1251
+ * VABufferID colorBalanceBuffer;
1252
+ * vaCreateBuffer(va_dpy, vpp_ctx,
1253
+ * VAProcFilterParameterBufferType, sizeof(*pColorBalanceParam), 4,
1254
+ * colorBalanceParams,
1255
+ * &colorBalanceBuffer
1256
+ * );
1257
+ *
1258
+ * VAProcFilterParameterBufferColorBalance *pColorBalanceParam;
1259
+ * vaMapBuffer(va_dpy, colorBalanceBuffer, &pColorBalanceParam);
1260
+ * {
1261
+ * // Change brightness only
1262
+ * pColorBalanceBuffer[kBrightness].value = 0.75;
1263
+ * }
1264
+ * vaUnmapBuffer(va_dpy, colorBalanceBuffer);
1265
+ * \endcode
1266
+ */
1267
+ typedef struct _VAProcFilterParameterBufferColorBalance {
1268
+ /** \brief Filter type. Shall be set to #VAProcFilterColorBalance. */
1269
+ VAProcFilterType type;
1270
+ /** \brief Color balance attribute. */
1271
+ VAProcColorBalanceType attrib;
1272
+ /**
1273
+ * \brief Color balance value.
1274
+ *
1275
+ * Special case for automatically adjusted attributes. e.g.
1276
+ * #VAProcColorBalanceAutoSaturation,
1277
+ * #VAProcColorBalanceAutoBrightness,
1278
+ * #VAProcColorBalanceAutoContrast.
1279
+ * - If \ref value is \c 1.0 +/- \c FLT_EPSILON, the attribute is
1280
+ * automatically adjusted and overrides any other attribute of
1281
+ * the same type that would have been set explicitly;
1282
+ * - If \ref value is \c 0.0 +/- \c FLT_EPSILON, the attribute is
1283
+ * disabled and other attribute of the same type is used instead.
1284
+ */
1285
+ float value;
1286
+
1287
+ /** \brief Reserved bytes for future use, must be zero */
1288
+ uint32_t va_reserved[VA_PADDING_LOW];
1289
+ } VAProcFilterParameterBufferColorBalance;
1290
+
1291
+ /** \brief Total color correction filter parametrization. */
1292
+ typedef struct _VAProcFilterParameterBufferTotalColorCorrection {
1293
+ /** \brief Filter type. Shall be set to #VAProcFilterTotalColorCorrection. */
1294
+ VAProcFilterType type;
1295
+ /** \brief Color to correct. */
1296
+ VAProcTotalColorCorrectionType attrib;
1297
+ /** \brief Color correction value. */
1298
+ float value;
1299
+ } VAProcFilterParameterBufferTotalColorCorrection;
1300
+
1301
+ /** @name Video Processing Human Vision System (HVS) Denoise Mode.*/
1302
+ /**@{*/
1303
+ /**
1304
+ * \brief Default Mode.
1305
+ * This mode is decided in driver to the appropriate mode.
1306
+ */
1307
+ #define VA_PROC_HVS_DENOISE_DEFAULT 0x0000
1308
+ /**
1309
+ * \brief Auto BDRate Mode.
1310
+ * Indicates auto BD rate improvement in pre-processing (such as before video encoding), ignore Strength.
1311
+ */
1312
+ #define VA_PROC_HVS_DENOISE_AUTO_BDRATE 0x0001
1313
+ /**
1314
+ * \brief Auto Subjective Mode.
1315
+ * Indicates auto subjective quality improvement in pre-processing (such as before video encoding), ignore Strength.
1316
+ */
1317
+ #define VA_PROC_HVS_DENOISE_AUTO_SUBJECTIVE 0x0002
1318
+ /**
1319
+ * \brief Manual Mode.
1320
+ * Indicates manual mode, allow to adjust the denoise strength manually (need to set Strength explicitly).
1321
+ */
1322
+ #define VA_PROC_HVS_DENOISE_MANUAL 0x0003
1323
+ /**@}*/
1324
+
1325
+ /** \brief Human Vision System(HVS) Noise reduction filter parametrization. */
1326
+ typedef struct _VAProcFilterParameterBufferHVSNoiseReduction {
1327
+ /** \brief Filter type. Shall be set to #VAProcFilterHVSNoiseReduction. */
1328
+ VAProcFilterType type;
1329
+ /** \brief QP for encoding, used for HVS Denoise */
1330
+ uint16_t qp;
1331
+ /**
1332
+ * \brief QP to Noise Reduction Strength Mode, used for Human Vision System Based Noise Reduction.
1333
+ * Controls Noise Reduction strength of conservative and aggressive mode.
1334
+ * It is an integer from [0-16].
1335
+ * Value 0 means completely turn off Noise Reduction;
1336
+ * Value 16 means the most aggressive mode of Noise Reduction;
1337
+ * Value 10 is the default value.
1338
+ */
1339
+ uint16_t strength;
1340
+ /**
1341
+ * \brief HVS Denoise Mode which controls denoise method.
1342
+ * It is a value of VA_PROC_HVS_DENOISE_xxx.
1343
+ * Please see the definition of VA_PROC_HVS_DENOISE_xxx.
1344
+ */
1345
+ uint16_t mode;
1346
+ /** \brief Reserved bytes for future use, must be zero */
1347
+ uint16_t va_reserved[VA_PADDING_HIGH - 1];
1348
+ } VAProcFilterParameterBufferHVSNoiseReduction;
1349
+
1350
+ /** \brief High Dynamic Range(HDR) Tone Mapping filter parametrization. */
1351
+ typedef struct _VAProcFilterParameterBufferHDRToneMapping {
1352
+ /** \brief Filter type. Shall be set to #VAProcFilterHighDynamicRangeToneMapping.*/
1353
+ VAProcFilterType type;
1354
+ /**
1355
+ * \brief High Dynamic Range metadata, could be HDR10 etc.
1356
+ *
1357
+ * This metadata is mainly for the input surface. Given that dynamic metadata is changing
1358
+ * on frame-by-frame or scene-by-scene basis for HDR10 plus, differentiate the metadata
1359
+ * for the input and output.
1360
+ */
1361
+ VAHdrMetaData data;
1362
+ /** \brief Reserved bytes for future use, must be zero */
1363
+ uint32_t va_reserved[VA_PADDING_HIGH];
1364
+ } VAProcFilterParameterBufferHDRToneMapping;
1365
+
1366
+ /** @name 3DLUT Channel Layout and Mapping */
1367
+ /**@{*/
1368
+ /** \brief 3DLUT Channel Layout is unknown. */
1369
+ #define VA_3DLUT_CHANNEL_UNKNOWN 0x00000000
1370
+ /** \brief 3DLUT Channel Layout is R, G, B, the default layout. Map RGB to RGB. */
1371
+ #define VA_3DLUT_CHANNEL_RGB_RGB 0x00000001
1372
+ /** \brief 3DLUT Channel Layout is Y, U, V. Map YUV to RGB. */
1373
+ #define VA_3DLUT_CHANNEL_YUV_RGB 0x00000002
1374
+ /** \brief 3DLUT Channel Layout is V, U, Y. Map VUY to RGB. */
1375
+ #define VA_3DLUT_CHANNEL_VUY_RGB 0x00000004
1376
+ /**@}*/
1377
+
1378
+ /**
1379
+ * \brief 3DLUT filter parametrization.
1380
+ *
1381
+ * 3DLUT (Three Dimensional Look Up Table) is often used when converting an image or a video frame
1382
+ * from one color representation to another, for example, when converting log and gamma encodings,
1383
+ * changing the color space, applying a color correction, changing the dynamic range, gamut mapping etc.
1384
+ *
1385
+ * This buffer defines 3DLUT attributes and memory layout. The typical 3DLUT has fixed number(lut_size)
1386
+ * per dimension and memory layout is 3 dimensional array as 3dlut[stride_0][stride_1][stride_2] (lut_size
1387
+ * shall be smaller than stride_0/1/2).
1388
+ *
1389
+ * API user should query hardware capability by using the VAProcFilterCap3DLUT to get the 3DLUT attributes
1390
+ * which hardware supports, and use these attributes. For example, if the user queries hardware, the API user
1391
+ * could get caps with 3dlut[33][33][64] (lut_size = 33, lut_stride[0/1/2] = 33/33/64). API user shall not
1392
+ * use the attributes which hardware can not support.
1393
+ *
1394
+ * 3DLUT is usually used to transform input RGB/YUV values in one color space to output RGB values in another
1395
+ * color space. Based on 1) the format and color space of VPP input and output and 2) 3DLUT memory layout and
1396
+ * channel mapping, driver will enable some color space conversion implicitly if needed. For example, the input of
1397
+ * VPP is P010 format in BT2020 color space, the output of VPP is NV12 in BT709 color space and the 3DLUT channel
1398
+ * mapping is VA_3DLUT_CHANNEL_RGB_RGB, driver could build the data pipeline as P010(BT2020)->RGB(BT2020)
1399
+ * ->3DULT(BT709)->NV12(BT709). Please note, the limitation of 3DLUT filter color space is that the color space of
1400
+ * 3DLUT filter input data needs to be same as the input data of VPP; the color space of 3DLUT filter output data
1401
+ * needs to be same as the output data of VPP; format does not have such limitation.
1402
+ */
1403
+ typedef struct _VAProcFilterParameterBuffer3DLUT {
1404
+ /** \brief Filter type. Shall be set to #VAProcFilter3DLUT.*/
1405
+ VAProcFilterType type;
1406
+
1407
+ /** \brief lut_surface contains 3DLUT data in the 3DLUT memory layout, must be linear */
1408
+ VASurfaceID lut_surface;
1409
+ /**
1410
+ * \brief lut_size is the number of valid points on every dimension of the three dimensional look up table.
1411
+ * The size of LUT (lut_size) shall be same among every dimension of the three dimensional look up table.
1412
+ * The size of LUT (lut_size) shall be smaller than lut_stride[0/1/2].
1413
+ */
1414
+ uint16_t lut_size;
1415
+ /**
1416
+ * \brief lut_stride are the number of points on every dimension of the three dimensional look up table.
1417
+ * Three dimension can has 3 different stride, lut3d[lut_stride[0]][lut_stride[1]][lut_stride[2]].
1418
+ * But the valid point shall start from 0, the range of valid point is [0, lut_size-1] for every dimension.
1419
+ */
1420
+ uint16_t lut_stride[3];
1421
+ /** \brief bit_depth is the number of bits for every channel R, G or B (or Y, U, V) */
1422
+ uint16_t bit_depth;
1423
+ /** \brief num_channel is the number of channels */
1424
+ uint16_t num_channel;
1425
+
1426
+ /** \brief channel_mapping defines the mapping of input and output channels, could be one of VA_3DLUT_CHANNEL_XXX*/
1427
+ uint32_t channel_mapping;
1428
+
1429
+ /** \brief reserved bytes for future use, must be zero */
1430
+ uint32_t va_reserved[VA_PADDING_HIGH];
1431
+ } VAProcFilterParameterBuffer3DLUT;
1432
+
1433
+ /** \brief Capabilities specification for the 3DLUT filter. */
1434
+ typedef struct _VAProcFilterCap3DLUT {
1435
+ /** \brief lut_size is the number of valid points on every dimension of the three dimensional look up table. */
1436
+ uint16_t lut_size;
1437
+ /** \brief lut_stride are the number of points on every dimension of the three dimensional look up table. lut3d[lut_stride[0]][lut_stride[1]][lut_stride[2]]*/
1438
+ uint16_t lut_stride[3];
1439
+ /** \brief bit_depth is the number of bits for every channel R, G or B (or Y, U, V) */
1440
+ uint16_t bit_depth;
1441
+ /** \brief num_channel is the number of channels */
1442
+ uint16_t num_channel;
1443
+ /** \brief channel_mapping defines the mapping of channels, could be some combination of VA_3DLUT_CHANNEL_XXX*/
1444
+ uint32_t channel_mapping;
1445
+
1446
+ /** \brief Reserved bytes for future use, must be zero */
1447
+ uint32_t va_reserved[VA_PADDING_HIGH];
1448
+ } VAProcFilterCap3DLUT;
1449
+
1450
+ /**
1451
+ * \brief Default filter cap specification (single range value).
1452
+ *
1453
+ * Unless there is a filter-specific cap structure, #VAProcFilterCap is the
1454
+ * default type to use for output caps from vaQueryVideoProcFilterCaps().
1455
+ */
1456
+ typedef struct _VAProcFilterCap {
1457
+ /** \brief Range of supported values for the filter. */
1458
+ VAProcFilterValueRange range;
1459
+
1460
+ /** \brief Reserved bytes for future use, must be zero */
1461
+ uint32_t va_reserved[VA_PADDING_LOW];
1462
+ } VAProcFilterCap;
1463
+
1464
+ /** \brief Capabilities specification for the deinterlacing filter. */
1465
+ typedef struct _VAProcFilterCapDeinterlacing {
1466
+ /** \brief Deinterlacing algorithm. */
1467
+ VAProcDeinterlacingType type;
1468
+
1469
+ /** \brief Reserved bytes for future use, must be zero */
1470
+ uint32_t va_reserved[VA_PADDING_LOW];
1471
+ } VAProcFilterCapDeinterlacing;
1472
+
1473
+ /** \brief Capabilities specification for the color balance filter. */
1474
+ typedef struct _VAProcFilterCapColorBalance {
1475
+ /** \brief Color balance operation. */
1476
+ VAProcColorBalanceType type;
1477
+ /** \brief Range of supported values for the specified operation. */
1478
+ VAProcFilterValueRange range;
1479
+
1480
+ /** \brief Reserved bytes for future use, must be zero */
1481
+ uint32_t va_reserved[VA_PADDING_LOW];
1482
+ } VAProcFilterCapColorBalance;
1483
+
1484
+ /** \brief Capabilities specification for the Total Color Correction filter. */
1485
+ typedef struct _VAProcFilterCapTotalColorCorrection {
1486
+ /** \brief Color to correct. */
1487
+ VAProcTotalColorCorrectionType type;
1488
+ /** \brief Range of supported values for the specified color. */
1489
+ VAProcFilterValueRange range;
1490
+ } VAProcFilterCapTotalColorCorrection;
1491
+
1492
+ /**
1493
+ * \brief Queries video processing filters.
1494
+ *
1495
+ * This function returns the list of video processing filters supported
1496
+ * by the driver. The \c filters array is allocated by the user and
1497
+ * \c num_filters shall be initialized to the number of allocated
1498
+ * elements in that array. Upon successful return, the actual number
1499
+ * of filters will be overwritten into \c num_filters. Otherwise,
1500
+ * \c VA_STATUS_ERROR_MAX_NUM_EXCEEDED is returned and \c num_filters
1501
+ * is adjusted to the number of elements that would be returned if enough
1502
+ * space was available.
1503
+ *
1504
+ * The list of video processing filters supported by the driver shall
1505
+ * be ordered in the way they can be iteratively applied. This is needed
1506
+ * for both correctness, i.e. some filters would not mean anything if
1507
+ * applied at the beginning of the pipeline; but also for performance
1508
+ * since some filters can be applied in a single pass (e.g. noise
1509
+ * reduction + deinterlacing).
1510
+ *
1511
+ * @param[in] dpy the VA display
1512
+ * @param[in] context the video processing context
1513
+ * @param[out] filters the output array of #VAProcFilterType elements
1514
+ * @param[in,out] num_filters the number of elements allocated on input,
1515
+ * the number of elements actually filled in on output
1516
+ */
1517
+ VAStatus
1518
+ vaQueryVideoProcFilters(
1519
+ VADisplay dpy,
1520
+ VAContextID context,
1521
+ VAProcFilterType *filters,
1522
+ unsigned int *num_filters
1523
+ );
1524
+
1525
+ /**
1526
+ * \brief Queries video filter capabilities.
1527
+ *
1528
+ * This function returns the list of capabilities supported by the driver
1529
+ * for a specific video filter. The \c filter_caps array is allocated by
1530
+ * the user and \c num_filter_caps shall be initialized to the number
1531
+ * of allocated elements in that array. Upon successful return, the
1532
+ * actual number of filters will be overwritten into \c num_filter_caps.
1533
+ * Otherwise, \c VA_STATUS_ERROR_MAX_NUM_EXCEEDED is returned and
1534
+ * \c num_filter_caps is adjusted to the number of elements that would be
1535
+ * returned if enough space was available.
1536
+ *
1537
+ * @param[in] dpy the VA display
1538
+ * @param[in] context the video processing context
1539
+ * @param[in] type the video filter type
1540
+ * @param[out] filter_caps the output array of #VAProcFilterCap elements
1541
+ * @param[in,out] num_filter_caps the number of elements allocated on input,
1542
+ * the number of elements actually filled in output
1543
+ */
1544
+ VAStatus
1545
+ vaQueryVideoProcFilterCaps(
1546
+ VADisplay dpy,
1547
+ VAContextID context,
1548
+ VAProcFilterType type,
1549
+ void *filter_caps,
1550
+ unsigned int *num_filter_caps
1551
+ );
1552
+
1553
+ /**
1554
+ * \brief Queries video processing pipeline capabilities.
1555
+ *
1556
+ * This function returns the video processing pipeline capabilities. The
1557
+ * \c filters array defines the video processing pipeline and is an array
1558
+ * of buffers holding filter parameters.
1559
+ *
1560
+ * Note: the #VAProcPipelineCaps structure contains user-provided arrays.
1561
+ * If non-NULL, the corresponding \c num_* fields shall be filled in on
1562
+ * input with the number of elements allocated. Upon successful return,
1563
+ * the actual number of elements will be overwritten into the \c num_*
1564
+ * fields. Otherwise, \c VA_STATUS_ERROR_MAX_NUM_EXCEEDED is returned
1565
+ * and \c num_* fields are adjusted to the number of elements that would
1566
+ * be returned if enough space was available.
1567
+ *
1568
+ * @param[in] dpy the VA display
1569
+ * @param[in] context the video processing context
1570
+ * @param[in] filters the array of VA buffers defining the video
1571
+ * processing pipeline
1572
+ * @param[in] num_filters the number of elements in filters
1573
+ * @param[in,out] pipeline_caps the video processing pipeline capabilities
1574
+ */
1575
+ VAStatus
1576
+ vaQueryVideoProcPipelineCaps(
1577
+ VADisplay dpy,
1578
+ VAContextID context,
1579
+ VABufferID *filters,
1580
+ unsigned int num_filters,
1581
+ VAProcPipelineCaps *pipeline_caps
1582
+ );
1583
+
1584
+ /**@}*/
1585
+
1586
+ #ifdef __cplusplus
1587
+ }
1588
+ #endif
1589
+
1590
+ #endif /* VA_VPP_H */