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_