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 surface_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 */ 1591