MFMediaEngineUtils.cpp (7241B)
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/. */ 4 5 #include "MFMediaEngineUtils.h" 6 7 #include "WMFUtils.h" 8 #include "mozilla/UniquePtr.h" 9 10 namespace mozilla { 11 12 #define ENUM_TO_STR(enumVal) \ 13 case enumVal: \ 14 return #enumVal 15 16 #define ENUM_TO_STR2(guid, enumVal) \ 17 if (guid == enumVal) { \ 18 return #enumVal; \ 19 } 20 21 const char* MediaEventTypeToStr(MediaEventType aType) { 22 switch (aType) { 23 ENUM_TO_STR(MESourceUnknown); 24 ENUM_TO_STR(MESourceStarted); 25 ENUM_TO_STR(MEStreamStarted); 26 ENUM_TO_STR(MESourceSeeked); 27 ENUM_TO_STR(MEStreamSeeked); 28 ENUM_TO_STR(MENewStream); 29 ENUM_TO_STR(MEUpdatedStream); 30 ENUM_TO_STR(MESourceStopped); 31 ENUM_TO_STR(MEStreamStopped); 32 ENUM_TO_STR(MESourcePaused); 33 ENUM_TO_STR(MEStreamPaused); 34 ENUM_TO_STR(MEEndOfPresentation); 35 ENUM_TO_STR(MEEndOfStream); 36 ENUM_TO_STR(MEMediaSample); 37 ENUM_TO_STR(MEStreamTick); 38 ENUM_TO_STR(MEStreamThinMode); 39 ENUM_TO_STR(MEStreamFormatChanged); 40 ENUM_TO_STR(MESourceRateChanged); 41 ENUM_TO_STR(MEEndOfPresentationSegment); 42 ENUM_TO_STR(MESourceCharacteristicsChanged); 43 ENUM_TO_STR(MESourceRateChangeRequested); 44 ENUM_TO_STR(MESourceMetadataChanged); 45 ENUM_TO_STR(MESequencerSourceTopologyUpdated); 46 default: 47 return "Unknown MediaEventType"; 48 } 49 } 50 51 const char* MediaEngineEventToStr(MF_MEDIA_ENGINE_EVENT aEvent) { 52 switch (aEvent) { 53 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_LOADSTART); 54 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_PROGRESS); 55 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_SUSPEND); 56 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_ABORT); 57 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_ERROR); 58 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_EMPTIED); 59 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_STALLED); 60 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_PLAY); 61 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_PAUSE); 62 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_LOADEDMETADATA); 63 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_LOADEDDATA); 64 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_WAITING); 65 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_PLAYING); 66 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_CANPLAY); 67 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_CANPLAYTHROUGH); 68 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_SEEKING); 69 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_SEEKED); 70 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_TIMEUPDATE); 71 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_ENDED); 72 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_RATECHANGE); 73 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_DURATIONCHANGE); 74 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_VOLUMECHANGE); 75 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_FORMATCHANGE); 76 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS); 77 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_TIMELINE_MARKER); 78 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_BALANCECHANGE); 79 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_DOWNLOADCOMPLETE); 80 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_BUFFERINGSTARTED); 81 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_BUFFERINGENDED); 82 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_FRAMESTEPCOMPLETED); 83 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_NOTIFYSTABLESTATE); 84 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_FIRSTFRAMEREADY); 85 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_TRACKSCHANGE); 86 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_OPMINFO); 87 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_RESOURCELOST); 88 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_DELAYLOADEVENT_CHANGED); 89 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_STREAMRENDERINGERROR); 90 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_SUPPORTEDRATES_CHANGED); 91 ENUM_TO_STR(MF_MEDIA_ENGINE_EVENT_AUDIOENDPOINTCHANGE); 92 default: 93 return "Unknown MF_MEDIA_ENGINE_EVENT"; 94 } 95 } 96 97 const char* MFMediaEngineErrorToStr(MFMediaEngineError aError) { 98 switch (aError) { 99 ENUM_TO_STR(MF_MEDIA_ENGINE_ERR_NOERROR); 100 ENUM_TO_STR(MF_MEDIA_ENGINE_ERR_ABORTED); 101 ENUM_TO_STR(MF_MEDIA_ENGINE_ERR_NETWORK); 102 ENUM_TO_STR(MF_MEDIA_ENGINE_ERR_DECODE); 103 ENUM_TO_STR(MF_MEDIA_ENGINE_ERR_SRC_NOT_SUPPORTED); 104 ENUM_TO_STR(MF_MEDIA_ENGINE_ERR_ENCRYPTED); 105 default: 106 return "Unknown MFMediaEngineError"; 107 } 108 } 109 110 const char* GUIDToStr(GUID aGUID) { 111 ENUM_TO_STR2(aGUID, MFAudioFormat_MP3) 112 ENUM_TO_STR2(aGUID, MFAudioFormat_AAC) 113 ENUM_TO_STR2(aGUID, MFAudioFormat_Vorbis) 114 ENUM_TO_STR2(aGUID, MFAudioFormat_Opus) 115 ENUM_TO_STR2(aGUID, MFVideoFormat_H264) 116 ENUM_TO_STR2(aGUID, MFVideoFormat_VP80) 117 ENUM_TO_STR2(aGUID, MFVideoFormat_VP90) 118 ENUM_TO_STR2(aGUID, MFVideoFormat_AV1) 119 ENUM_TO_STR2(aGUID, MFVideoFormat_HEVC) 120 ENUM_TO_STR2(aGUID, MFMediaType_Audio) 121 return "Unknown GUID"; 122 } 123 124 const char* MFVideoRotationFormatToStr(MFVideoRotationFormat aFormat) { 125 switch (aFormat) { 126 ENUM_TO_STR(MFVideoRotationFormat_0); 127 ENUM_TO_STR(MFVideoRotationFormat_90); 128 ENUM_TO_STR(MFVideoRotationFormat_180); 129 ENUM_TO_STR(MFVideoRotationFormat_270); 130 default: 131 return "Unknown MFVideoRotationFormat"; 132 } 133 } 134 135 const char* MFVideoTransferFunctionToStr(MFVideoTransferFunction aFunc) { 136 switch (aFunc) { 137 ENUM_TO_STR(MFVideoTransFunc_Unknown); 138 ENUM_TO_STR(MFVideoTransFunc_709); 139 ENUM_TO_STR(MFVideoTransFunc_2020); 140 ENUM_TO_STR(MFVideoTransFunc_sRGB); 141 ENUM_TO_STR(MFVideoTransFunc_2084); 142 default: 143 return "Unsupported MFVideoTransferFunction"; 144 } 145 } 146 147 const char* MFVideoPrimariesToStr(MFVideoPrimaries aPrimaries) { 148 switch (aPrimaries) { 149 ENUM_TO_STR(MFVideoPrimaries_Unknown); 150 ENUM_TO_STR(MFVideoPrimaries_BT709); 151 ENUM_TO_STR(MFVideoPrimaries_BT2020); 152 default: 153 return "Unsupported MFVideoPrimaries"; 154 } 155 } 156 157 void ByteArrayFromGUID(REFGUID aGuidIn, nsTArray<uint8_t>& aByteArrayOut) { 158 aByteArrayOut.SetLength(sizeof(GUID)); 159 // GUID is little endian. The byte array in network order is big endian. 160 GUID* reversedGuid = reinterpret_cast<GUID*>(aByteArrayOut.Elements()); 161 *reversedGuid = aGuidIn; 162 reversedGuid->Data1 = _byteswap_ulong(aGuidIn.Data1); 163 reversedGuid->Data2 = _byteswap_ushort(aGuidIn.Data2); 164 reversedGuid->Data3 = _byteswap_ushort(aGuidIn.Data3); 165 // Data4 is already a byte array so no need to byte swap. 166 } 167 168 void GUIDFromByteArray(const nsTArray<uint8_t>& aByteArrayIn, GUID& aGuidOut) { 169 MOZ_ASSERT(aByteArrayIn.Length() == sizeof(GUID)); 170 GUID* reversedGuid = 171 reinterpret_cast<GUID*>(const_cast<uint8_t*>(aByteArrayIn.Elements())); 172 aGuidOut = *reversedGuid; 173 aGuidOut.Data1 = _byteswap_ulong(reversedGuid->Data1); 174 aGuidOut.Data2 = _byteswap_ushort(reversedGuid->Data2); 175 aGuidOut.Data3 = _byteswap_ushort(reversedGuid->Data3); 176 // Data4 is already a byte array so no need to byte swap. 177 } 178 179 BSTR CreateBSTRFromConstChar(const char* aNarrowStr) { 180 int wideStrSize = MultiByteToWideChar(CP_UTF8, 0, aNarrowStr, -1, nullptr, 0); 181 if (wideStrSize == 0) { 182 NS_WARNING("Failed to get wide str size!"); 183 return nullptr; 184 } 185 186 UniquePtr<wchar_t[]> wideStrBuffer(new wchar_t[wideStrSize]); 187 if (MultiByteToWideChar(CP_UTF8, 0, aNarrowStr, -1, wideStrBuffer.get(), 188 wideStrSize) == 0) { 189 NS_WARNING("Failed to covert to wide str!"); 190 return nullptr; 191 } 192 193 BSTR bstr = SysAllocString(wideStrBuffer.get()); 194 return bstr; 195 } 196 197 #undef ENUM_TO_STR 198 #undef ENUM_TO_STR2 199 200 } // namespace mozilla