tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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