tor-browser

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

GMPMessageUtils.h (8185B)


      1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 #ifndef GMPMessageUtils_h_
      7 #define GMPMessageUtils_h_
      8 
      9 #include "GMPNativeTypes.h"
     10 #include "GMPSanitizedExports.h"
     11 #include "gmp-video-codec.h"
     12 #include "gmp-video-frame-encoded.h"
     13 #include "ipc/EnumSerializer.h"
     14 #include "ipc/IPCMessageUtilsSpecializations.h"
     15 
     16 namespace IPC {
     17 
     18 template <>
     19 struct ParamTraits<GMPPluginType>
     20    : public ContiguousEnumSerializerInclusive<
     21          GMPPluginType, GMPPluginType::Unknown, GMPPluginType::WidevineL1> {};
     22 
     23 template <>
     24 struct ParamTraits<GMPErr>
     25    : public ContiguousEnumSerializer<GMPErr, GMPNoErr, GMPLastErr> {};
     26 
     27 template <>
     28 struct ParamTraits<GMPVideoFrameType>
     29    : public ContiguousEnumSerializer<GMPVideoFrameType, kGMPKeyFrame,
     30                                      kGMPVideoFrameInvalid> {};
     31 
     32 template <>
     33 struct ParamTraits<GMPVideoCodecComplexity>
     34    : public ContiguousEnumSerializer<GMPVideoCodecComplexity,
     35                                      kGMPComplexityNormal,
     36                                      kGMPComplexityInvalid> {};
     37 
     38 template <>
     39 struct ParamTraits<GMPVP8ResilienceMode>
     40    : public ContiguousEnumSerializer<GMPVP8ResilienceMode, kResilienceOff,
     41                                      kResilienceInvalid> {};
     42 
     43 template <>
     44 struct ParamTraits<GMPVideoCodecType>
     45    : public ContiguousEnumSerializer<GMPVideoCodecType, kGMPVideoCodecVP8,
     46                                      kGMPVideoCodecInvalid> {};
     47 
     48 template <>
     49 struct ParamTraits<GMPVideoCodecMode>
     50    : public ContiguousEnumSerializer<GMPVideoCodecMode, kGMPRealtimeVideo,
     51                                      kGMPCodecModeInvalid> {};
     52 
     53 template <>
     54 struct ParamTraits<GMPLogLevel>
     55    : public ContiguousEnumSerializerInclusive<GMPLogLevel, kGMPLogDefault,
     56                                               kGMPLogInvalid> {};
     57 
     58 template <>
     59 struct ParamTraits<GMPLevel>
     60    : public ContiguousEnumSerializerInclusive<GMPLevel, kGMPH264LevelUnknown,
     61                                               kGMPH264Level5_2> {};
     62 
     63 template <>
     64 struct ParamTraits<GMPProfile>
     65    : public ContiguousEnumSerializerInclusive<
     66          GMPProfile, kGMPH264ProfileUnknown, kGMPH264ProfileScalableHigh> {};
     67 
     68 template <>
     69 struct ParamTraits<GMPRateControlMode>
     70    : public ContiguousEnumSerializerInclusive<
     71          GMPRateControlMode, kGMPRateControlUnknown, kGMPRateControlOff> {};
     72 
     73 template <>
     74 struct ParamTraits<GMPSliceMode>
     75    : public ContiguousEnumSerializerInclusive<GMPSliceMode, kGMPSliceUnknown,
     76                                               kGMPSliceSizeLimited> {};
     77 
     78 template <>
     79 struct ParamTraits<GMPBufferType>
     80    : public ContiguousEnumSerializer<GMPBufferType, GMP_BufferSingle,
     81                                      GMP_BufferInvalid> {};
     82 
     83 template <>
     84 struct ParamTraits<cdm::EncryptionScheme>
     85    : public ContiguousEnumSerializerInclusive<
     86          cdm::EncryptionScheme, cdm::EncryptionScheme::kUnencrypted,
     87          cdm::EncryptionScheme::kCbcs> {};
     88 
     89 template <>
     90 struct ParamTraits<cdm::HdcpVersion>
     91    : public ContiguousEnumSerializerInclusive<
     92          cdm::HdcpVersion, cdm::HdcpVersion::kHdcpVersionNone,
     93          cdm::HdcpVersion::kHdcpVersion2_3> {};
     94 
     95 template <>
     96 struct ParamTraits<GMPSimulcastStream> {
     97  typedef GMPSimulcastStream paramType;
     98 
     99  static void Write(MessageWriter* aWriter, const paramType& aParam) {
    100    WriteParam(aWriter, aParam.mWidth);
    101    WriteParam(aWriter, aParam.mHeight);
    102    WriteParam(aWriter, aParam.mNumberOfTemporalLayers);
    103    WriteParam(aWriter, aParam.mMaxBitrate);
    104    WriteParam(aWriter, aParam.mTargetBitrate);
    105    WriteParam(aWriter, aParam.mMinBitrate);
    106    WriteParam(aWriter, aParam.mQPMax);
    107  }
    108 
    109  static bool Read(MessageReader* aReader, paramType* aResult) {
    110    if (ReadParam(aReader, &(aResult->mWidth)) &&
    111        ReadParam(aReader, &(aResult->mHeight)) &&
    112        ReadParam(aReader, &(aResult->mNumberOfTemporalLayers)) &&
    113        ReadParam(aReader, &(aResult->mMaxBitrate)) &&
    114        ReadParam(aReader, &(aResult->mTargetBitrate)) &&
    115        ReadParam(aReader, &(aResult->mMinBitrate)) &&
    116        ReadParam(aReader, &(aResult->mQPMax))) {
    117      return true;
    118    }
    119    return false;
    120  }
    121 };
    122 
    123 template <>
    124 struct ParamTraits<GMPVideoCodec> {
    125  typedef GMPVideoCodec paramType;
    126 
    127  static void Write(MessageWriter* aWriter, const paramType& aParam) {
    128    WriteParam(aWriter, aParam.mGMPApiVersion);
    129    WriteParam(aWriter, aParam.mCodecType);
    130    WriteParam(aWriter, static_cast<const nsCString&>(
    131                            nsDependentCString(aParam.mPLName)));
    132    WriteParam(aWriter, aParam.mPLType);
    133    WriteParam(aWriter, aParam.mWidth);
    134    WriteParam(aWriter, aParam.mHeight);
    135    WriteParam(aWriter, aParam.mStartBitrate);
    136    WriteParam(aWriter, aParam.mMaxBitrate);
    137    WriteParam(aWriter, aParam.mMinBitrate);
    138    WriteParam(aWriter, aParam.mMaxFramerate);
    139    WriteParam(aWriter, aParam.mFrameDroppingOn);
    140    WriteParam(aWriter, aParam.mKeyFrameInterval);
    141    WriteParam(aWriter, aParam.mQPMax);
    142    WriteParam(aWriter, aParam.mNumberOfSimulcastStreams);
    143    for (uint32_t i = 0; i < aParam.mNumberOfSimulcastStreams; i++) {
    144      WriteParam(aWriter, aParam.mSimulcastStream[i]);
    145    }
    146    WriteParam(aWriter, aParam.mMode);
    147    WriteParam(aWriter, aParam.mUseThreadedDecode);
    148    WriteParam(aWriter, aParam.mLogLevel);
    149    WriteParam(aWriter, aParam.mLevel);
    150    WriteParam(aWriter, aParam.mProfile);
    151    WriteParam(aWriter, aParam.mRateControlMode);
    152    WriteParam(aWriter, aParam.mSliceMode);
    153    WriteParam(aWriter, aParam.mUseThreadedEncode);
    154    WriteParam(aWriter, aParam.mTemporalLayerNum);
    155  }
    156 
    157  static bool Read(MessageReader* aReader, paramType* aResult) {
    158    // NOTE: make sure this matches any versions supported
    159    if (!ReadParam(aReader, &(aResult->mGMPApiVersion)) ||
    160        (aResult->mGMPApiVersion != kGMPVersion33 &&
    161         aResult->mGMPApiVersion != kGMPVersion34 &&
    162         aResult->mGMPApiVersion != kGMPVersion35 &&
    163         aResult->mGMPApiVersion != kGMPVersion36)) {
    164      return false;
    165    }
    166    if (!ReadParam(aReader, &(aResult->mCodecType))) {
    167      return false;
    168    }
    169 
    170    nsAutoCString plName;
    171    if (!ReadParam(aReader, &plName) ||
    172        plName.Length() > kGMPPayloadNameSize - 1) {
    173      return false;
    174    }
    175    memcpy(aResult->mPLName, plName.get(), plName.Length());
    176    memset(aResult->mPLName + plName.Length(), 0,
    177           kGMPPayloadNameSize - plName.Length());
    178 
    179    if (!ReadParam(aReader, &(aResult->mPLType)) ||
    180        !ReadParam(aReader, &(aResult->mWidth)) ||
    181        !ReadParam(aReader, &(aResult->mHeight)) ||
    182        !ReadParam(aReader, &(aResult->mStartBitrate)) ||
    183        !ReadParam(aReader, &(aResult->mMaxBitrate)) ||
    184        !ReadParam(aReader, &(aResult->mMinBitrate)) ||
    185        !ReadParam(aReader, &(aResult->mMaxFramerate)) ||
    186        !ReadParam(aReader, &(aResult->mFrameDroppingOn)) ||
    187        !ReadParam(aReader, &(aResult->mKeyFrameInterval))) {
    188      return false;
    189    }
    190 
    191    if (!ReadParam(aReader, &(aResult->mQPMax)) ||
    192        !ReadParam(aReader, &(aResult->mNumberOfSimulcastStreams))) {
    193      return false;
    194    }
    195 
    196    if (aResult->mNumberOfSimulcastStreams > kGMPMaxSimulcastStreams) {
    197      return false;
    198    }
    199 
    200    for (uint32_t i = 0; i < aResult->mNumberOfSimulcastStreams; i++) {
    201      if (!ReadParam(aReader, &(aResult->mSimulcastStream[i]))) {
    202        return false;
    203      }
    204    }
    205 
    206    if (!ReadParam(aReader, &(aResult->mMode)) ||
    207        !ReadParam(aReader, &(aResult->mUseThreadedDecode)) ||
    208        !ReadParam(aReader, &(aResult->mLogLevel)) ||
    209        !ReadParam(aReader, &(aResult->mLevel)) ||
    210        !ReadParam(aReader, &(aResult->mProfile)) ||
    211        !ReadParam(aReader, &(aResult->mRateControlMode)) ||
    212        !ReadParam(aReader, &(aResult->mSliceMode)) ||
    213        !ReadParam(aReader, &(aResult->mUseThreadedEncode)) ||
    214        !ReadParam(aReader, &(aResult->mTemporalLayerNum))) {
    215      return false;
    216    }
    217 
    218    return true;
    219  }
    220 };
    221 
    222 }  // namespace IPC
    223 
    224 #endif  // GMPMessageUtils_h_