hwconfig.h (4207B)
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 AVCODEC_HWCONFIG_H 20 #define AVCODEC_HWCONFIG_H 21 22 #include "avcodec.h" 23 #include "hwaccels.h" 24 25 typedef struct AVCodecHWConfigInternal { 26 /** 27 * This is the structure which will be returned to the user by 28 * avcodec_get_hw_config(). 29 */ 30 AVCodecHWConfig public; 31 /** 32 * If this configuration uses a hwaccel, a pointer to it. 33 * If not, NULL. 34 */ 35 const struct FFHWAccel *hwaccel; 36 } AVCodecHWConfigInternal; 37 38 void ff_hwaccel_uninit(AVCodecContext *avctx); 39 40 // These macros are used to simplify AVCodecHWConfigInternal definitions. 41 42 #define HW_CONFIG_HWACCEL(device, frames, ad_hoc, format, device_type_, name) \ 43 &(const AVCodecHWConfigInternal) { \ 44 .public = { \ 45 .pix_fmt = AV_PIX_FMT_ ## format, \ 46 .methods = (device ? AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX : 0) | \ 47 (frames ? AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX : 0) | \ 48 (ad_hoc ? AV_CODEC_HW_CONFIG_METHOD_AD_HOC : 0), \ 49 .device_type = AV_HWDEVICE_TYPE_ ## device_type_, \ 50 }, \ 51 .hwaccel = &name, \ 52 } 53 54 #define HW_CONFIG_INTERNAL(format) \ 55 &(const AVCodecHWConfigInternal) { \ 56 .public = { \ 57 .pix_fmt = AV_PIX_FMT_ ## format, \ 58 .methods = AV_CODEC_HW_CONFIG_METHOD_INTERNAL, \ 59 .device_type = AV_HWDEVICE_TYPE_NONE, \ 60 }, \ 61 .hwaccel = NULL, \ 62 } 63 64 #define HWACCEL_DXVA2(codec) \ 65 HW_CONFIG_HWACCEL(1, 1, 1, DXVA2_VLD, DXVA2, ff_ ## codec ## _dxva2_hwaccel) 66 #define HWACCEL_D3D11VA2(codec) \ 67 HW_CONFIG_HWACCEL(1, 1, 0, D3D11, D3D11VA, ff_ ## codec ## _d3d11va2_hwaccel) 68 #define HWACCEL_NVDEC(codec) \ 69 HW_CONFIG_HWACCEL(1, 1, 0, CUDA, CUDA, ff_ ## codec ## _nvdec_hwaccel) 70 #define HWACCEL_VAAPI(codec) \ 71 HW_CONFIG_HWACCEL(1, 1, 1, VAAPI, VAAPI, ff_ ## codec ## _vaapi_hwaccel) 72 #define HWACCEL_VDPAU(codec) \ 73 HW_CONFIG_HWACCEL(1, 1, 1, VDPAU, VDPAU, ff_ ## codec ## _vdpau_hwaccel) 74 #define HWACCEL_VIDEOTOOLBOX(codec) \ 75 HW_CONFIG_HWACCEL(1, 1, 1, VIDEOTOOLBOX, VIDEOTOOLBOX, ff_ ## codec ## _videotoolbox_hwaccel) 76 #define HWACCEL_VULKAN(codec) \ 77 HW_CONFIG_HWACCEL(1, 1, 1, VULKAN, VULKAN, ff_ ## codec ## _vulkan_hwaccel) 78 #define HWACCEL_D3D11VA(codec) \ 79 HW_CONFIG_HWACCEL(0, 0, 1, D3D11VA_VLD, NONE, ff_ ## codec ## _d3d11va_hwaccel) 80 #define HWACCEL_D3D12VA(codec) \ 81 HW_CONFIG_HWACCEL(1, 1, 0, D3D12, D3D12VA, ff_ ## codec ## _d3d12va_hwaccel) 82 83 #define HW_CONFIG_ENCODER(device, frames, ad_hoc, format, device_type_) \ 84 &(const AVCodecHWConfigInternal) { \ 85 .public = { \ 86 .pix_fmt = AV_PIX_FMT_ ## format, \ 87 .methods = (device ? AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX : 0) | \ 88 (frames ? AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX : 0) | \ 89 (ad_hoc ? AV_CODEC_HW_CONFIG_METHOD_AD_HOC : 0), \ 90 .device_type = AV_HWDEVICE_TYPE_ ## device_type_, \ 91 }, \ 92 .hwaccel = NULL, \ 93 } 94 95 #define HW_CONFIG_ENCODER_DEVICE(format, device_type_) \ 96 HW_CONFIG_ENCODER(1, 0, 0, format, device_type_) 97 98 #define HW_CONFIG_ENCODER_FRAMES(format, device_type_) \ 99 HW_CONFIG_ENCODER(0, 1, 0, format, device_type_) 100 101 #endif /* AVCODEC_HWCONFIG_H */