2#include <Media/Libav.hpp>
6#include <libavformat/avformat.h>
7#include <libavutil/pixdesc.h>
8#include <libavutil/version.h>
9#if __has_include(<libavutil/hwcontext.h>)
10#include <libavutil/hwcontext.h>
18inline bool hardwareDecoderIsAvailable(AVPixelFormat p)
noexcept
23 case AV_PIX_FMT_DRM_PRIME: {
24 static const bool ok = avcodec_find_decoder_by_name(
"h264_v4l2m2m");
27 case AV_PIX_FMT_VAAPI: {
28 static const bool ok = avcodec_find_decoder_by_name(
"mjpeg_vaapi");
31 case AV_PIX_FMT_VDPAU: {
32 static const bool ok = avcodec_find_decoder_by_name(
"h264_vdpau");
37 case AV_PIX_FMT_DXVA2_VLD:
39 case AV_PIX_FMT_D3D11:
43 case AV_PIX_FMT_VIDEOTOOLBOX:
47 case AV_PIX_FMT_CUDA: {
48 static const bool ok = avcodec_find_decoder_by_name(
"mjpeg_cuvid")
49 || avcodec_find_decoder_by_name(
"h264_cuvid");
52 case AV_PIX_FMT_QSV: {
53 static const bool ok = avcodec_find_decoder_by_name(
"mjpeg_qsv")
54 || avcodec_find_decoder_by_name(
"h264_qsv");
62inline constexpr bool formatIsHardwareDecoded(AVPixelFormat fmt)
noexcept
64#if LIBAVUTIL_VERSION_MAJOR < 57
69 case AV_PIX_FMT_VAAPI:
70 case AV_PIX_FMT_VDPAU:
71 case AV_PIX_FMT_DXVA2_VLD:
72 case AV_PIX_FMT_D3D11:
75 case AV_PIX_FMT_VIDEOTOOLBOX:
76 case AV_PIX_FMT_DRM_PRIME:
84inline constexpr bool formatNeedsDecoding(AVPixelFormat fmt)
noexcept
87 if(formatIsHardwareDecoded(fmt))
92 case AV_PIX_FMT_YUV420P:
93 case AV_PIX_FMT_RGB24:
94 case AV_PIX_FMT_BGR24:
95 case AV_PIX_FMT_RGB48LE:
96 case AV_PIX_FMT_BGR48LE:
100 case AV_PIX_FMT_P010LE:
101 case AV_PIX_FMT_P016LE:
102 case AV_PIX_FMT_YUVJ420P:
103 case AV_PIX_FMT_YUVJ422P:
104 case AV_PIX_FMT_YUVJ440P:
105 case AV_PIX_FMT_YUV422P:
106 case AV_PIX_FMT_YUV440P:
107 case AV_PIX_FMT_YUV444P:
108 case AV_PIX_FMT_YUVJ444P:
109 case AV_PIX_FMT_YUVA420P:
110 case AV_PIX_FMT_YUVA444P:
111 case AV_PIX_FMT_UYVY422:
112 case AV_PIX_FMT_YUYV422:
113 case AV_PIX_FMT_RGB0:
114 case AV_PIX_FMT_RGBA:
115 case AV_PIX_FMT_BGR0:
116 case AV_PIX_FMT_BGRA:
117 case AV_PIX_FMT_ARGB:
118 case AV_PIX_FMT_ABGR:
119 case AV_PIX_FMT_RGBA64LE:
120 case AV_PIX_FMT_BGRA64LE:
121 case AV_PIX_FMT_X2RGB10LE:
122 case AV_PIX_FMT_GBRP:
123 case AV_PIX_FMT_GBRAP:
125 case AV_PIX_FMT_YA16LE:
127#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(56, 19, 100)
128 case AV_PIX_FMT_YUV420P10LE:
129 case AV_PIX_FMT_YUV420P12LE:
130 case AV_PIX_FMT_YUV422P10LE:
131 case AV_PIX_FMT_YUV422P12LE:
132 case AV_PIX_FMT_YUV444P10LE:
133 case AV_PIX_FMT_YUV444P12LE:
134 case AV_PIX_FMT_YUVA444P10LE:
135 case AV_PIX_FMT_GBRP10LE:
136 case AV_PIX_FMT_GBRP12LE:
137 case AV_PIX_FMT_GBRP16LE:
138 case AV_PIX_FMT_GBRAP10LE:
139 case AV_PIX_FMT_GBRAP12LE:
140 case AV_PIX_FMT_GBRAP16LE:
141 case AV_PIX_FMT_GBRPF32LE:
142 case AV_PIX_FMT_GBRAPF32LE:
143 case AV_PIX_FMT_GRAYF32LE:
144 case AV_PIX_FMT_GRAYF32BE:
145 case AV_PIX_FMT_NV24:
146 case AV_PIX_FMT_NV42:
147 case AV_PIX_FMT_Y210LE:
150#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 17, 100)
151 case AV_PIX_FMT_X2BGR10LE:
152 case AV_PIX_FMT_P210LE:
153 case AV_PIX_FMT_P410LE:
156#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(60, 8, 100)
157 case AV_PIX_FMT_RGBAF32LE:
158 case AV_PIX_FMT_VUYA:
159 case AV_PIX_FMT_VUYX:
160 case AV_PIX_FMT_GRAYF16LE:
161 case AV_PIX_FMT_GRAYF16BE:
164 case AV_PIX_FMT_GRAY8:
165 case AV_PIX_FMT_GRAY16:
174#if LIBAVUTIL_VERSION_MAJOR >= 57
178 AVPixelFormat format{AV_PIX_FMT_NONE};
179 AVHWDeviceType device{AV_HWDEVICE_TYPE_NONE};
182inline constexpr HWAccelFormats ffmpegHardwareDecodingFormats(AVPixelFormat p)
noexcept
186#if defined(__linux__)
187 case AV_PIX_FMT_DRM_PRIME:
188 if(!hardwareDecoderIsAvailable(AV_PIX_FMT_DRM_PRIME))
190 return {AV_PIX_FMT_DRM_PRIME, AV_HWDEVICE_TYPE_DRM};
191 case AV_PIX_FMT_VAAPI:
192 if(!hardwareDecoderIsAvailable(AV_PIX_FMT_VAAPI))
194 return {AV_PIX_FMT_VAAPI, AV_HWDEVICE_TYPE_VAAPI};
195 case AV_PIX_FMT_VDPAU:
196 if(!hardwareDecoderIsAvailable(AV_PIX_FMT_VDPAU))
198 return {AV_PIX_FMT_VDPAU, AV_HWDEVICE_TYPE_VDPAU};
201 case AV_PIX_FMT_DXVA2_VLD:
202 if(!hardwareDecoderIsAvailable(AV_PIX_FMT_DXVA2_VLD))
204 return {AV_PIX_FMT_DXVA2_VLD, AV_HWDEVICE_TYPE_DXVA2};
205 case AV_PIX_FMT_D3D11:
206 if(!hardwareDecoderIsAvailable(AV_PIX_FMT_D3D11))
208 return {AV_PIX_FMT_D3D11, AV_HWDEVICE_TYPE_D3D11VA};
210#if defined(__APPLE__)
211 case AV_PIX_FMT_VIDEOTOOLBOX:
212 if(!hardwareDecoderIsAvailable(AV_PIX_FMT_VIDEOTOOLBOX))
214 return {AV_PIX_FMT_VIDEOTOOLBOX, AV_HWDEVICE_TYPE_VIDEOTOOLBOX};
217 case AV_PIX_FMT_CUDA:
218 if(!hardwareDecoderIsAvailable(AV_PIX_FMT_CUDA))
220 return {AV_PIX_FMT_CUDA, AV_HWDEVICE_TYPE_CUDA};
222 if(!hardwareDecoderIsAvailable(AV_PIX_FMT_QSV))
224 return {AV_PIX_FMT_QSV, AV_HWDEVICE_TYPE_QSV};
234inline constexpr bool ffmpegCanDoHardwareDecoding(AVCodecID
id)
noexcept
238 case AV_CODEC_ID_AV1:
239 case AV_CODEC_ID_H264:
240 case AV_CODEC_ID_HEVC:
241 case AV_CODEC_ID_MJPEG:
242 case AV_CODEC_ID_MPEG1VIDEO:
243 case AV_CODEC_ID_MPEG2VIDEO:
244 case AV_CODEC_ID_MPEG4:
245 case AV_CODEC_ID_VC1:
246 case AV_CODEC_ID_VP8:
247 case AV_CODEC_ID_VP9:
248 case AV_CODEC_ID_WMV1:
249 case AV_CODEC_ID_WMV2:
250 case AV_CODEC_ID_WMV3: