1 /* 2 * This file is part of FFmpeg. 3 * 4 * FFmpeg is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * FFmpeg is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with FFmpeg; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19 #ifndef AVUTIL_HWCONTEXT_VAAPI_H 20 #define AVUTIL_HWCONTEXT_VAAPI_H 21 22 #include <va/va.h> 23 24 /** 25 * @file 26 * API-specific header for AV_HWDEVICE_TYPE_VAAPI. 27 * 28 * Dynamic frame pools are supported, but note that any pool used as a render 29 * target is required to be of fixed size in order to be be usable as an 30 * argument to vaCreateContext(). 31 * 32 * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs 33 * with the data pointer set to a VASurfaceID. 34 */ 35 36 enum { 37 /** 38 * The quirks field has been set by the user and should not be detected 39 * automatically by av_hwdevice_ctx_init(). 40 */ 41 AV_VAAPI_DRIVER_QUIRK_USER_SET = (1 << 0), 42 /** 43 * The driver does not destroy parameter buffers when they are used by 44 * vaRenderPicture(). Additional code will be required to destroy them 45 * separately afterwards. 46 */ 47 AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS = (1 << 1), 48 49 /** 50 * The driver does not support the VASurfaceAttribMemoryType attribute, 51 * so the surface allocation code will not try to use it. 52 */ 53 AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE = (1 << 2), 54 55 /** 56 * The driver does not support surface attributes at all. 57 * The surface allocation code will never pass them to surface allocation, 58 * and the results of the vaQuerySurfaceAttributes() call will be faked. 59 */ 60 AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES = (1 << 3), 61 }; 62 63 /** 64 * VAAPI connection details. 65 * 66 * Allocated as AVHWDeviceContext.hwctx 67 */ 68 typedef struct AVVAAPIDeviceContext { 69 /** 70 * The VADisplay handle, to be filled by the user. 71 */ 72 VADisplay display; 73 /** 74 * Driver quirks to apply - this is filled by av_hwdevice_ctx_init(), 75 * with reference to a table of known drivers, unless the 76 * AV_VAAPI_DRIVER_QUIRK_USER_SET bit is already present. The user 77 * may need to refer to this field when performing any later 78 * operations using VAAPI with the same VADisplay. 79 */ 80 unsigned int driver_quirks; 81 } AVVAAPIDeviceContext; 82 83 /** 84 * VAAPI-specific data associated with a frame pool. 85 * 86 * Allocated as AVHWFramesContext.hwctx. 87 */ 88 typedef struct AVVAAPIFramesContext { 89 /** 90 * Set by the user to apply surface attributes to all surfaces in 91 * the frame pool. If null, default settings are used. 92 */ 93 VASurfaceAttrib *attributes; 94 int nb_attributes; 95 /** 96 * The surfaces IDs of all surfaces in the pool after creation. 97 * Only valid if AVHWFramesContext.initial_pool_size was positive. 98 * These are intended to be used as the render_targets arguments to 99 * vaCreateContext(). 100 */ 101 VASurfaceID *surface_ids; 102 int nb_surfaces; 103 } AVVAAPIFramesContext; 104 105 /** 106 * VAAPI hardware pipeline configuration details. 107 * 108 * Allocated with av_hwdevice_hwconfig_alloc(). 109 */ 110 typedef struct AVVAAPIHWConfig { 111 /** 112 * ID of a VAAPI pipeline configuration. 113 */ 114 VAConfigID config_id; 115 } AVVAAPIHWConfig; 116 117 #endif /* AVUTIL_HWCONTEXT_VAAPI_H */ 118