1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #ifndef DOM_MEDIA_IPC_MFMEDIAENGINEUTILS_H_
6 #define DOM_MEDIA_IPC_MFMEDIAENGINEUTILS_H_
8 #include "MFMediaEngineExtra.h"
9 #include "ipc/EnumSerializer.h"
10 #include "mozilla/Logging.h"
11 #include "mozilla/ProfilerMarkerTypes.h"
12 #include "nsPrintfCString.h"
16 inline LazyLogModule gMFMediaEngineLog
{"MFMediaEngine"};
18 // https://docs.microsoft.com/en-us/windows/win32/api/mfmediaengine/ne-mfmediaengine-mf_media_engine_event
19 using MFMediaEngineEvent
= MF_MEDIA_ENGINE_EVENT
;
21 // https://docs.microsoft.com/en-us/windows/win32/api/mfmediaengine/ne-mfmediaengine-mf_media_engine_err
22 using MFMediaEngineError
= MF_MEDIA_ENGINE_ERR
;
24 #define LOG_AND_WARNING(msg, ...) \
26 NS_WARNING(nsPrintfCString(msg, rv).get()); \
27 MOZ_LOG(gMFMediaEngineLog, LogLevel::Debug, \
28 ("%s:%d, " msg, __FILE__, __LINE__, ##__VA_ARGS__)); \
32 # define LOG_IF_FAILED(x) \
35 if (MOZ_UNLIKELY(FAILED(rv))) { \
36 LOG_AND_WARNING("(" #x ") failed, rv=%lx", rv); \
41 #ifndef RETURN_IF_FAILED
42 # define RETURN_IF_FAILED(x) \
45 if (MOZ_UNLIKELY(FAILED(rv))) { \
46 LOG_AND_WARNING("(" #x ") failed, rv=%lx", rv); \
52 #ifndef RETURN_VOID_IF_FAILED
53 # define RETURN_VOID_IF_FAILED(x) \
56 if (MOZ_UNLIKELY(FAILED(rv))) { \
57 LOG_AND_WARNING("(" #x ") failed, rv=%lx", rv); \
63 #ifndef RETURN_PARAM_IF_FAILED
64 # define RETURN_PARAM_IF_FAILED(x, defaultOut) \
67 if (MOZ_UNLIKELY(FAILED(rv))) { \
68 LOG_AND_WARNING("(" #x ") failed, rv=%lx", rv); \
74 #ifndef SHUTDOWN_IF_POSSIBLE
75 # define SHUTDOWN_IF_POSSIBLE(class) \
77 IMFShutdown* pShutdown = nullptr; \
78 HRESULT rv = class->QueryInterface(IID_PPV_ARGS(&pShutdown)); \
79 if (SUCCEEDED(rv)) { \
80 rv = pShutdown->Shutdown(); \
82 LOG_AND_WARNING(#class " failed to shutdown, rv=%lx", rv); \
84 MOZ_LOG(gMFMediaEngineLog, LogLevel::Verbose, \
85 ((#class " shutdowned successfully"))); \
87 pShutdown->Release(); \
89 LOG_AND_WARNING(#class " doesn't support IMFShutdown?, rv=%lx", rv); \
94 #define ENGINE_MARKER(markerName) \
95 PROFILER_MARKER(markerName, MEDIA_PLAYBACK, {}, MediaEngineMarker, Id())
97 #define ENGINE_MARKER_TEXT(markerName, text) \
98 PROFILER_MARKER(markerName, MEDIA_PLAYBACK, {}, MediaEngineTextMarker, Id(), \
101 const char* MediaEventTypeToStr(MediaEventType aType
);
102 const char* MediaEngineEventToStr(MF_MEDIA_ENGINE_EVENT aEvent
);
103 const char* MFMediaEngineErrorToStr(MFMediaEngineError aError
);
104 const char* GUIDToStr(GUID aGUID
);
105 const char* MFVideoRotationFormatToStr(MFVideoRotationFormat aFormat
);
106 const char* MFVideoTransferFunctionToStr(MFVideoTransferFunction aFunc
);
107 const char* MFVideoPrimariesToStr(MFVideoPrimaries aPrimaries
);
108 void ByteArrayFromGUID(REFGUID aGuidIn
, nsTArray
<uint8_t>& aByteArrayOut
);
109 void GUIDFromByteArray(const nsTArray
<uint8_t>& aByteArrayIn
, GUID
& aGuidOut
);
110 BSTR
CreateBSTRFromConstChar(const char* aNarrowStr
);
112 // See cdm::SubsampleEntry
113 struct MediaFoundationSubsampleEntry
{
114 uint32_t mClearBytes
;
115 uint32_t mCipherBytes
;
118 template <typename T
>
121 ScopedCoMem() : mPtr(nullptr) {}
123 ~ScopedCoMem() { Reset(nullptr); }
125 ScopedCoMem(const ScopedCoMem
&) = delete;
126 ScopedCoMem
& operator=(const ScopedCoMem
&) = delete;
128 T
** operator&() { // NOLINT
129 MOZ_ASSERT(mPtr
== nullptr); // To catch memory leaks.
133 operator T
*() { return mPtr
; }
136 MOZ_ASSERT(mPtr
!= nullptr);
140 const T
* operator->() const {
141 MOZ_ASSERT(mPtr
!= nullptr);
145 explicit operator bool() const { return mPtr
; }
147 friend bool operator==(const ScopedCoMem
& lhs
, std::nullptr_t
) {
148 return lhs
.Get() == nullptr;
151 friend bool operator==(std::nullptr_t
, const ScopedCoMem
& rhs
) {
152 return rhs
.Get() == nullptr;
155 friend bool operator!=(const ScopedCoMem
& lhs
, std::nullptr_t
) {
156 return lhs
.Get() != nullptr;
159 friend bool operator!=(std::nullptr_t
, const ScopedCoMem
& rhs
) {
160 return rhs
.Get() != nullptr;
164 if (mPtr
) CoTaskMemFree(mPtr
);
168 T
* Get() const { return mPtr
; }
174 } // namespace mozilla
179 struct ParamTraits
<mozilla::MFMediaEngineError
>
180 : public ContiguousEnumSerializerInclusive
<
181 mozilla::MFMediaEngineError
,
182 mozilla::MFMediaEngineError::MF_MEDIA_ENGINE_ERR_ABORTED
,
183 mozilla::MFMediaEngineError::MF_MEDIA_ENGINE_ERR_ENCRYPTED
> {};
186 struct ParamTraits
<mozilla::MFMediaEngineEvent
>
187 : public ContiguousEnumSerializerInclusive
<
188 mozilla::MFMediaEngineEvent
,
189 mozilla::MFMediaEngineEvent::MF_MEDIA_ENGINE_EVENT_LOADSTART
,
190 mozilla::MFMediaEngineEvent::
191 MF_MEDIA_ENGINE_EVENT_AUDIOENDPOINTCHANGE
> {};
195 #endif // DOM_MEDIA_IPC_MFMEDIAENGINECHILD_H_