FFmpeg
mf_utils.h
Go to the documentation of this file.
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_MF_UTILS_H
20 #define AVCODEC_MF_UTILS_H
21 
22 #include <windows.h>
23 #include <initguid.h>
24 #ifdef _MSC_VER
25 // The official way of including codecapi (via dshow.h) makes the ICodecAPI
26 // interface unavailable in UWP mode, but including icodecapi.h + codecapi.h
27 // seems to be equivalent. (These headers conflict with the official way
28 // of including it though, through strmif.h via dshow.h. And on mingw, the
29 // mf*.h headers below indirectly include strmif.h.)
30 #include <icodecapi.h>
31 #else
32 #define NO_DSHOW_STRSAFE
33 #include <dshow.h>
34 // Older versions of mingw-w64 need codecapi.h explicitly included, while newer
35 // ones include it implicitly from dshow.h (via uuids.h).
36 #include <codecapi.h>
37 #endif
38 #include <mfapi.h>
39 #include <mferror.h>
40 #include <mfobjects.h>
41 #include <mftransform.h>
42 
43 #include "avcodec.h"
44 
45 // Windows N editions does not provide MediaFoundation by default.
46 // So to avoid DLL loading error, MediaFoundation will be dynamically loaded
47 // except on UWP build since LoadLibrary is not available on it.
48 typedef struct MFFunctions {
49  HRESULT (WINAPI *MFStartup) (ULONG Version, DWORD dwFlags);
50  HRESULT (WINAPI *MFShutdown) (void);
51  HRESULT (WINAPI *MFCreateAlignedMemoryBuffer) (DWORD cbMaxLength,
52  DWORD cbAligment,
53  IMFMediaBuffer **ppBuffer);
54  HRESULT (WINAPI *MFCreateSample) (IMFSample **ppIMFSample);
55  HRESULT (WINAPI *MFCreateMediaType) (IMFMediaType **ppMFType);
56  // MFTEnumEx is missing in Windows Vista's mfplat.dll.
57  HRESULT (WINAPI *MFTEnumEx)(GUID guidCategory, UINT32 Flags,
58  const MFT_REGISTER_TYPE_INFO *pInputType,
59  const MFT_REGISTER_TYPE_INFO *pOutputType,
60  IMFActivate ***pppMFTActivate,
61  UINT32 *pnumMFTActivate);
62 } MFFunctions;
63 
64 // These functions do exist in mfapi.h, but are only available within
65 // __cplusplus ifdefs.
66 HRESULT ff_MFGetAttributeSize(IMFAttributes *pattr, REFGUID guid,
67  UINT32 *pw, UINT32 *ph);
68 HRESULT ff_MFSetAttributeSize(IMFAttributes *pattr, REFGUID guid,
69  UINT32 uw, UINT32 uh);
70 #define ff_MFSetAttributeRatio ff_MFSetAttributeSize
71 #define ff_MFGetAttributeRatio ff_MFGetAttributeSize
72 
73 // These do exist in mingw-w64's codecapi.h, but they aren't properly defined
74 // by the header until after mingw-w64 v7.0.0.
75 DEFINE_GUID(ff_CODECAPI_AVDecVideoThumbnailGenerationMode, 0x2efd8eee,0x1150,0x4328,0x9c,0xf5,0x66,0xdc,0xe9,0x33,0xfc,0xf4);
76 DEFINE_GUID(ff_CODECAPI_AVDecVideoDropPicWithMissingRef, 0xf8226383,0x14c2,0x4567,0x97,0x34,0x50,0x04,0xe9,0x6f,0xf8,0x87);
77 DEFINE_GUID(ff_CODECAPI_AVDecVideoSoftwareDeinterlaceMode, 0x0c08d1ce,0x9ced,0x4540,0xba,0xe3,0xce,0xb3,0x80,0x14,0x11,0x09);
78 DEFINE_GUID(ff_CODECAPI_AVDecVideoFastDecodeMode, 0x6b529f7d,0xd3b1,0x49c6,0xa9,0x99,0x9e,0xc6,0x91,0x1b,0xed,0xbf);
79 DEFINE_GUID(ff_CODECAPI_AVLowLatencyMode, 0x9c27891a,0xed7a,0x40e1,0x88,0xe8,0xb2,0x27,0x27,0xa0,0x24,0xee);
80 DEFINE_GUID(ff_CODECAPI_AVDecVideoH264ErrorConcealment, 0xececace8,0x3436,0x462c,0x92,0x94,0xcd,0x7b,0xac,0xd7,0x58,0xa9);
81 DEFINE_GUID(ff_CODECAPI_AVDecVideoMPEG2ErrorConcealment, 0x9d2bfe18,0x728d,0x48d2,0xb3,0x58,0xbc,0x7e,0x43,0x6c,0x66,0x74);
82 DEFINE_GUID(ff_CODECAPI_AVDecVideoCodecType, 0x434528e5,0x21f0,0x46b6,0xb6,0x2c,0x9b,0x1b,0x6b,0x65,0x8c,0xd1);
83 DEFINE_GUID(ff_CODECAPI_AVDecVideoDXVAMode, 0xf758f09e,0x7337,0x4ae7,0x83,0x87,0x73,0xdc,0x2d,0x54,0xe6,0x7d);
84 DEFINE_GUID(ff_CODECAPI_AVDecVideoDXVABusEncryption, 0x42153c8b,0xfd0b,0x4765,0xa4,0x62,0xdd,0xd9,0xe8,0xbc,0xc3,0x88);
85 DEFINE_GUID(ff_CODECAPI_AVDecVideoSWPowerLevel, 0xfb5d2347,0x4dd8,0x4509,0xae,0xd0,0xdb,0x5f,0xa9,0xaa,0x93,0xf4);
86 DEFINE_GUID(ff_CODECAPI_AVDecVideoMaxCodedWidth, 0x5ae557b8,0x77af,0x41f5,0x9f,0xa6,0x4d,0xb2,0xfe,0x1d,0x4b,0xca);
87 DEFINE_GUID(ff_CODECAPI_AVDecVideoMaxCodedHeight, 0x7262a16a,0xd2dc,0x4e75,0x9b,0xa8,0x65,0xc0,0xc6,0xd3,0x2b,0x13);
88 DEFINE_GUID(ff_CODECAPI_AVDecNumWorkerThreads, 0x9561c3e8,0xea9e,0x4435,0x9b,0x1e,0xa9,0x3e,0x69,0x18,0x94,0xd8);
89 DEFINE_GUID(ff_CODECAPI_AVDecSoftwareDynamicFormatChange, 0x862e2f0a,0x507b,0x47ff,0xaf,0x47,0x01,0xe2,0x62,0x42,0x98,0xb7);
90 DEFINE_GUID(ff_CODECAPI_AVDecDisableVideoPostProcessing, 0xf8749193,0x667a,0x4f2c,0xa9,0xe8,0x5d,0x4a,0xf9,0x24,0xf0,0x8f);
91 
92 // These are missing from mingw-w64's headers until after mingw-w64 v7.0.0.
93 DEFINE_GUID(ff_CODECAPI_AVEncCommonRateControlMode, 0x1c0608e9, 0x370c, 0x4710, 0x8a, 0x58, 0xcb, 0x61, 0x81, 0xc4, 0x24, 0x23);
94 DEFINE_GUID(ff_CODECAPI_AVEncCommonQuality, 0xfcbf57a3, 0x7ea5, 0x4b0c, 0x96, 0x44, 0x69, 0xb4, 0x0c, 0x39, 0xc3, 0x91);
95 DEFINE_GUID(ff_CODECAPI_AVEncCommonMeanBitRate, 0xf7222374, 0x2144, 0x4815, 0xb5, 0x50, 0xa3, 0x7f, 0x8e, 0x12, 0xee, 0x52);
96 DEFINE_GUID(ff_CODECAPI_AVEncH264CABACEnable, 0xee6cad62, 0xd305, 0x4248, 0xa5, 0xe, 0xe1, 0xb2, 0x55, 0xf7, 0xca, 0xf8);
97 DEFINE_GUID(ff_CODECAPI_AVEncVideoForceKeyFrame, 0x398c1b98, 0x8353, 0x475a, 0x9e, 0xf2, 0x8f, 0x26, 0x5d, 0x26, 0x3, 0x45);
98 DEFINE_GUID(ff_CODECAPI_AVEncMPVDefaultBPictureCount, 0x8d390aac, 0xdc5c, 0x4200, 0xb5, 0x7f, 0x81, 0x4d, 0x04, 0xba, 0xba, 0xb2);
99 DEFINE_GUID(ff_CODECAPI_AVScenarioInfo, 0xb28a6e64,0x3ff9,0x446a,0x8a,0x4b,0x0d,0x7a,0x53,0x41,0x32,0x36);
100 DEFINE_GUID(ff_CODECAPI_AVEncCommonBufferSize, 0x0db96574, 0xb6a4, 0x4c8b, 0x81, 0x06, 0x37, 0x73, 0xde, 0x03, 0x10, 0xcd);
101 DEFINE_GUID(ff_CODECAPI_AVEncCommonMaxBitRate, 0x9651eae4, 0x39b9, 0x4ebf, 0x85, 0xef, 0xd7, 0xf4, 0x44, 0xec, 0x74, 0x65);
102 DEFINE_GUID(ff_CODECAPI_AVEncCommonQualityVsSpeed, 0x98332df8, 0x03cd, 0x476b, 0x89, 0xfa, 0x3f, 0x9e, 0x44, 0x2d, 0xec, 0x9f);
103 DEFINE_GUID(ff_CODECAPI_AVEncMPVGOPSize, 0x95f31b26, 0x95a4, 0x41aa, 0x93, 0x03, 0x24, 0x6a, 0x7f, 0xc6, 0xee, 0xf1);
104 DEFINE_GUID(ff_CODECAPI_AVEncVideoEncodeQP, 0x2cb5696b, 0x23fb, 0x4ce1, 0xa0, 0xf9, 0xef, 0x5b, 0x90, 0xfd, 0x55, 0xca);
105 
106 DEFINE_GUID(ff_MF_SA_D3D11_BINDFLAGS, 0xeacf97ad, 0x065c, 0x4408, 0xbe, 0xe3, 0xfd, 0xcb, 0xfd, 0x12, 0x8b, 0xe2);
107 DEFINE_GUID(ff_MF_SA_D3D11_USAGE, 0xe85fe442, 0x2ca3, 0x486e, 0xa9, 0xc7, 0x10, 0x9d, 0xda, 0x60, 0x98, 0x80);
108 DEFINE_GUID(ff_MF_SA_D3D11_AWARE, 0x206b4fc8, 0xfcf9, 0x4c51, 0xaf, 0xe3, 0x97, 0x64, 0x36, 0x9e, 0x33, 0xa0);
109 DEFINE_GUID(ff_MF_SA_D3D11_SHARED, 0x7b8f32c3, 0x6d96, 0x4b89, 0x92, 0x3, 0xdd, 0x38, 0xb6, 0x14, 0x14, 0xf3);
110 DEFINE_GUID(ff_MF_SA_D3D11_SHARED_WITHOUT_MUTEX, 0x39dbd44d, 0x2e44, 0x4931, 0xa4, 0xc8, 0x35, 0x2d, 0x3d, 0xc4, 0x21, 0x15);
111 DEFINE_GUID(ff_MF_SA_MINIMUM_OUTPUT_SAMPLE_COUNT, 0x851745d5, 0xc3d6, 0x476d, 0x95, 0x27, 0x49, 0x8e, 0xf2, 0xd1, 0xd, 0x18);
112 DEFINE_GUID(ff_MF_SA_MINIMUM_OUTPUT_SAMPLE_COUNT_PROGRESSIVE, 0xf5523a5, 0x1cb2, 0x47c5, 0xa5, 0x50, 0x2e, 0xeb, 0x84, 0xb4, 0xd1, 0x4a);
113 
114 DEFINE_MEDIATYPE_GUID(ff_MFVideoFormat_HEVC, 0x43564548); // FCC('HEVC')
115 DEFINE_MEDIATYPE_GUID(ff_MFVideoFormat_HEVC_ES, 0x53564548); // FCC('HEVS')
116 DEFINE_MEDIATYPE_GUID(ff_MFVideoFormat_AV1, 0x31305641); // FCC('AV01')
117 
118 
119 // This enum is missing from mingw-w64's codecapi.h by v7.0.0.
128 };
129 
138 };
139 
140 // These do exist in mingw-w64's mfobjects.idl, but are missing from
141 // mfobjects.h that is generated from the former, due to incorrect use of
142 // ifdefs in the IDL file.
143 enum {
149 };
150 
151 // These do exist in all supported headers, but are manually defined here
152 // to avoid having to include codecapi.h, as there's problems including that
153 // header when targeting UWP (where including it with MSVC seems to work,
154 // but fails when built with clang in MSVC mode).
159 };
160 
161 char *ff_hr_str_buf(char *buf, size_t size, HRESULT hr);
162 #define ff_hr_str(hr) ff_hr_str_buf((char[80]){0}, 80, hr)
163 
164 // Possibly compiler-dependent; the MS/MinGW definition for this is just crazy.
165 #define FF_VARIANT_VALUE(type, contents) &(VARIANT){ .vt = (type), contents }
166 
167 #define FF_VAL_VT_UI4(v) FF_VARIANT_VALUE(VT_UI4, .ulVal = (v))
168 #define FF_VAL_VT_BOOL(v) FF_VARIANT_VALUE(VT_BOOL, .boolVal = (v))
169 
170 IMFSample *ff_create_memory_sample(MFFunctions *f, void *fill_data,
171  size_t size, size_t align);
172 enum AVSampleFormat ff_media_type_to_sample_fmt(IMFAttributes *type);
173 enum AVPixelFormat ff_media_type_to_pix_fmt(IMFAttributes *type);
174 const GUID *ff_pix_fmt_to_guid(enum AVPixelFormat pix_fmt);
175 int ff_fourcc_from_guid(const GUID *guid, uint32_t *out_fourcc);
176 char *ff_guid_str_buf(char *buf, size_t buf_size, const GUID *guid);
177 #define ff_guid_str(guid) ff_guid_str_buf((char[80]){0}, 80, guid)
178 void ff_attributes_dump(void *log, IMFAttributes *attrs);
179 void ff_media_type_dump(void *log, IMFMediaType *type);
180 const CLSID *ff_codec_to_mf_subtype(enum AVCodecID codec);
181 int ff_instantiate_mf(void *log, MFFunctions *f, GUID category,
182  MFT_REGISTER_TYPE_INFO *in_type,
183  MFT_REGISTER_TYPE_INFO *out_type,
184  int use_hw, IMFTransform **res);
185 void ff_free_mf(MFFunctions *f, IMFTransform **mft);
186 
187 #endif
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
ff_METransformUnknown
@ ff_METransformUnknown
Definition: mf_utils.h:144
ff_media_type_to_pix_fmt
enum AVPixelFormat ff_media_type_to_pix_fmt(IMFAttributes *type)
Definition: mf_utils.c:158
normalize.log
log
Definition: normalize.py:21
ph
static int FUNC() ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
Definition: cbs_h266_syntax_template.c:3042
ff_guid_str_buf
char * ff_guid_str_buf(char *buf, size_t buf_size, const GUID *guid)
Definition: mf_utils.c:333
ff_eAVEncCommonRateControlMode_Quality
@ ff_eAVEncCommonRateControlMode_Quality
Definition: mf_utils.h:124
ff_eAVScenarioInfo_Unknown
@ ff_eAVScenarioInfo_Unknown
Definition: mf_utils.h:131
ff_eAVEncCommonRateControlMode_CBR
@ ff_eAVEncCommonRateControlMode_CBR
Definition: mf_utils.h:121
category
category
Definition: openal-dec.c:249
ff_eAVEncH264VProfile_High
@ ff_eAVEncH264VProfile_High
Definition: mf_utils.h:158
ff_attributes_dump
void ff_attributes_dump(void *log, IMFAttributes *attrs)
Definition: mf_utils.c:359
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
MFFunctions::cbAligment
DWORD cbAligment
Definition: mf_utils.h:52
ff_hr_str_buf
char * ff_hr_str_buf(char *buf, size_t size, HRESULT hr)
Definition: mf_utils.c:50
ff_METransformMarker
@ ff_METransformMarker
Definition: mf_utils.h:148
ff_eAVEncCommonRateControlMode_GlobalVBR
@ ff_eAVEncCommonRateControlMode_GlobalVBR
Definition: mf_utils.h:126
Version
@ Version
Definition: cfhd.h:86
ff_eAVEncCommonRateControlMode
ff_eAVEncCommonRateControlMode
Definition: mf_utils.h:120
pix_fmt
static enum AVPixelFormat pix_fmt
Definition: demux_decode.c:41
DEFINE_GUID
DEFINE_GUID(ff_CODECAPI_AVDecVideoThumbnailGenerationMode, 0x2efd8eee, 0x1150, 0x4328, 0x9c, 0xf5, 0x66, 0xdc, 0xe9, 0x33, 0xfc, 0xf4)
ff_media_type_dump
void ff_media_type_dump(void *log, IMFMediaType *type)
Definition: mf_utils.c:503
MFFunctions::pOutputType
UINT32 const MFT_REGISTER_TYPE_INFO const MFT_REGISTER_TYPE_INFO * pOutputType
Definition: mf_utils.h:59
ff_eAVScenarioInfo_LiveStreaming
@ ff_eAVScenarioInfo_LiveStreaming
Definition: mf_utils.h:135
ff_eAVScenarioInfo
ff_eAVScenarioInfo
Definition: mf_utils.h:130
ff_eAVEncCommonRateControlMode_PeakConstrainedVBR
@ ff_eAVEncCommonRateControlMode_PeakConstrainedVBR
Definition: mf_utils.h:122
DEFINE_MEDIATYPE_GUID
DEFINE_MEDIATYPE_GUID(ff_MFVideoFormat_HEVC, 0x43564548)
ff_fourcc_from_guid
int ff_fourcc_from_guid(const GUID *guid, uint32_t *out_fourcc)
Definition: mf_utils.c:190
ff_instantiate_mf
int ff_instantiate_mf(void *log, MFFunctions *f, GUID category, MFT_REGISTER_TYPE_INFO *in_type, MFT_REGISTER_TYPE_INFO *out_type, int use_hw, IMFTransform **res)
Definition: mf_utils.c:552
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
MFFunctions
Definition: mf_utils.h:48
f
f
Definition: af_crystalizer.c:122
ff_eAVScenarioInfo_Archive
@ ff_eAVScenarioInfo_Archive
Definition: mf_utils.h:134
MFFunctions::pnumMFTActivate
UINT32 const MFT_REGISTER_TYPE_INFO const MFT_REGISTER_TYPE_INFO IMFActivate UINT32 * pnumMFTActivate
Definition: mf_utils.h:61
ff_MFGetAttributeSize
HRESULT ff_MFGetAttributeSize(IMFAttributes *pattr, REFGUID guid, UINT32 *pw, UINT32 *ph)
Definition: mf_utils.c:28
size
int size
Definition: twinvq_data.h:10344
ff_eAVEncH264VProfile_Base
@ ff_eAVEncH264VProfile_Base
Definition: mf_utils.h:156
ff_eAVScenarioInfo_DisplayRemoting
@ ff_eAVScenarioInfo_DisplayRemoting
Definition: mf_utils.h:132
MFFunctions::dwFlags
DWORD dwFlags
Definition: mf_utils.h:49
align
static const uint8_t *BS_FUNC() align(BSCTX *bc)
Skip bits to a byte boundary.
Definition: bitstream_template.h:411
ff_eAVEncCommonRateControlMode_UnconstrainedVBR
@ ff_eAVEncCommonRateControlMode_UnconstrainedVBR
Definition: mf_utils.h:123
ff_eAVScenarioInfo_DisplayRemotingWithFeatureMap
@ ff_eAVScenarioInfo_DisplayRemotingWithFeatureMap
Definition: mf_utils.h:137
ff_pix_fmt_to_guid
const GUID * ff_pix_fmt_to_guid(enum AVPixelFormat pix_fmt)
Definition: mf_utils.c:176
ff_METransformNeedInput
@ ff_METransformNeedInput
Definition: mf_utils.h:145
ff_METransformDrainComplete
@ ff_METransformDrainComplete
Definition: mf_utils.h:147
MFFunctions::pInputType
UINT32 const MFT_REGISTER_TYPE_INFO * pInputType
Definition: mf_utils.h:58
AVSampleFormat
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:55
MFFunctions::ppBuffer
DWORD IMFMediaBuffer ** ppBuffer
Definition: mf_utils.h:53
avcodec.h
ff_media_type_to_sample_fmt
enum AVSampleFormat ff_media_type_to_sample_fmt(IMFAttributes *type)
Definition: mf_utils.c:114
ff_codec_to_mf_subtype
const CLSID * ff_codec_to_mf_subtype(enum AVCodecID codec)
Definition: mf_utils.c:508
ff_free_mf
void ff_free_mf(MFFunctions *f, IMFTransform **mft)
Definition: mf_utils.c:645
ff_MFSetAttributeSize
HRESULT ff_MFSetAttributeSize(IMFAttributes *pattr, REFGUID guid, UINT32 uw, UINT32 uh)
Definition: mf_utils.c:40
ff_eAVScenarioInfo_CameraRecord
@ ff_eAVScenarioInfo_CameraRecord
Definition: mf_utils.h:136
ff_eAVScenarioInfo_VideoConference
@ ff_eAVScenarioInfo_VideoConference
Definition: mf_utils.h:133
MFFunctions::Flags
UINT32 Flags
Definition: mf_utils.h:57
MFFunctions::pppMFTActivate
UINT32 const MFT_REGISTER_TYPE_INFO const MFT_REGISTER_TYPE_INFO IMFActivate *** pppMFTActivate
Definition: mf_utils.h:60
ff_eAVEncH264VProfile
ff_eAVEncH264VProfile
Definition: mf_utils.h:155
ff_METransformHaveOutput
@ ff_METransformHaveOutput
Definition: mf_utils.h:146
ff_create_memory_sample
IMFSample * ff_create_memory_sample(MFFunctions *f, void *fill_data, size_t size, size_t align)
Definition: mf_utils.c:76
ff_eAVEncCommonRateControlMode_GlobalLowDelayVBR
@ ff_eAVEncCommonRateControlMode_GlobalLowDelayVBR
Definition: mf_utils.h:127
MFFunctions::HRESULT
HRESULT(WINAPI *MFStartup)(ULONG Version
ff_eAVEncH264VProfile_Main
@ ff_eAVEncH264VProfile_Main
Definition: mf_utils.h:157
ff_eAVEncCommonRateControlMode_LowDelayVBR
@ ff_eAVEncCommonRateControlMode_LowDelayVBR
Definition: mf_utils.h:125