MediaIPCUtils.h (25916B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_dom_media_MediaIPCUtils_h 8 #define mozilla_dom_media_MediaIPCUtils_h 9 10 #include "DecoderDoctorDiagnostics.h" 11 #include "EncoderConfig.h" 12 #include "MediaTrackConstraints.h" 13 #include "PerformanceRecorder.h" 14 #include "PlatformDecoderModule.h" 15 #include "PlatformEncoderModule.h" 16 #include "ipc/EnumSerializer.h" 17 #include "mozilla/CDMProxy.h" 18 #include "mozilla/GfxMessageUtils.h" 19 #include "mozilla/Maybe.h" 20 #include "mozilla/ParamTraits_TiedFields.h" 21 #include "mozilla/dom/MFCDMSerializers.h" 22 #include "mozilla/dom/MediaKeysBinding.h" 23 #include "mozilla/gfx/Rect.h" 24 25 namespace IPC { 26 template <> 27 struct ParamTraits<mozilla::VideoInfo> { 28 typedef mozilla::VideoInfo paramType; 29 30 static void Write(MessageWriter* aWriter, const paramType& aParam) { 31 // TrackInfo 32 WriteParam(aWriter, aParam.mMimeType); 33 34 // VideoInfo 35 WriteParam(aWriter, aParam.mDisplay); 36 WriteParam(aWriter, aParam.mStereoMode); 37 WriteParam(aWriter, aParam.mImage); 38 WriteParam(aWriter, aParam.mImageRect); 39 WriteParam(aWriter, *aParam.mCodecSpecificConfig); 40 WriteParam(aWriter, *aParam.mExtraData); 41 WriteParam(aWriter, aParam.mRotation); 42 WriteParam(aWriter, aParam.mColorDepth); 43 WriteParam(aWriter, aParam.mColorSpace); 44 WriteParam(aWriter, aParam.mColorPrimaries); 45 WriteParam(aWriter, aParam.mTransferFunction); 46 WriteParam(aWriter, aParam.mColorRange); 47 WriteParam(aWriter, aParam.HasAlpha()); 48 WriteParam(aWriter, aParam.mCrypto); 49 } 50 51 static bool Read(MessageReader* aReader, paramType* aResult) { 52 mozilla::gfx::IntRect imageRect; 53 bool alphaPresent; 54 if (ReadParam(aReader, &aResult->mMimeType) && 55 ReadParam(aReader, &aResult->mDisplay) && 56 ReadParam(aReader, &aResult->mStereoMode) && 57 ReadParam(aReader, &aResult->mImage) && 58 ReadParam(aReader, &aResult->mImageRect) && 59 ReadParam(aReader, aResult->mCodecSpecificConfig.get()) && 60 ReadParam(aReader, aResult->mExtraData.get()) && 61 ReadParam(aReader, &aResult->mRotation) && 62 ReadParam(aReader, &aResult->mColorDepth) && 63 ReadParam(aReader, &aResult->mColorSpace) && 64 ReadParam(aReader, &aResult->mColorPrimaries) && 65 ReadParam(aReader, &aResult->mTransferFunction) && 66 ReadParam(aReader, &aResult->mColorRange) && 67 ReadParam(aReader, &alphaPresent) && 68 ReadParam(aReader, &aResult->mCrypto)) { 69 aResult->SetAlpha(alphaPresent); 70 return true; 71 } 72 return false; 73 } 74 }; 75 76 template <> 77 struct ParamTraits<mozilla::TrackInfo::TrackType> 78 : public ContiguousEnumSerializerInclusive< 79 mozilla::TrackInfo::TrackType, 80 mozilla::TrackInfo::TrackType::kUndefinedTrack, 81 mozilla::TrackInfo::TrackType::kTextTrack> {}; 82 83 template <> 84 struct ParamTraits<mozilla::VideoRotation> 85 : public ContiguousEnumSerializerInclusive< 86 mozilla::VideoRotation, mozilla::VideoRotation::kDegree_0, 87 mozilla::VideoRotation::kDegree_270> {}; 88 89 template <> 90 struct ParamTraits<mozilla::MediaByteBuffer> 91 : public ParamTraits<nsTArray<uint8_t>> { 92 typedef mozilla::MediaByteBuffer paramType; 93 }; 94 95 // Traits for AudioCodecSpecificVariant types. 96 97 template <> 98 struct ParamTraits<mozilla::NoCodecSpecificData> 99 : public EmptyStructSerializer<mozilla::NoCodecSpecificData> {}; 100 101 template <> 102 struct ParamTraits<mozilla::AudioCodecSpecificBinaryBlob> { 103 using paramType = mozilla::AudioCodecSpecificBinaryBlob; 104 105 static void Write(MessageWriter* aWriter, const paramType& aParam) { 106 WriteParam(aWriter, *aParam.mBinaryBlob); 107 } 108 static bool Read(MessageReader* aReader, paramType* aResult) { 109 return ReadParam(aReader, aResult->mBinaryBlob.get()); 110 } 111 }; 112 113 template <> 114 struct ParamTraits<mozilla::AacCodecSpecificData> { 115 using paramType = mozilla::AacCodecSpecificData; 116 117 static void Write(MessageWriter* aWriter, const paramType& aParam) { 118 WriteParam(aWriter, *aParam.mEsDescriptorBinaryBlob); 119 WriteParam(aWriter, *aParam.mDecoderConfigDescriptorBinaryBlob); 120 WriteParam(aWriter, aParam.mEncoderDelayFrames); 121 WriteParam(aWriter, aParam.mMediaFrameCount); 122 } 123 static bool Read(MessageReader* aReader, paramType* aResult) { 124 return ReadParam(aReader, aResult->mEsDescriptorBinaryBlob.get()) && 125 ReadParam(aReader, 126 aResult->mDecoderConfigDescriptorBinaryBlob.get()) && 127 ReadParam(aReader, &aResult->mEncoderDelayFrames) && 128 ReadParam(aReader, &aResult->mMediaFrameCount); 129 } 130 }; 131 132 template <> 133 struct ParamTraits<mozilla::FlacCodecSpecificData> { 134 using paramType = mozilla::FlacCodecSpecificData; 135 136 static void Write(MessageWriter* aWriter, const paramType& aParam) { 137 WriteParam(aWriter, *aParam.mStreamInfoBinaryBlob); 138 } 139 static bool Read(MessageReader* aReader, paramType* aResult) { 140 return ReadParam(aReader, aResult->mStreamInfoBinaryBlob.get()); 141 } 142 }; 143 144 template <> 145 struct ParamTraits<mozilla::Mp3CodecSpecificData> 146 : public ParamTraits_TiedFields<mozilla::Mp3CodecSpecificData> {}; 147 148 template <> 149 struct ParamTraits<mozilla::OpusCodecSpecificData> { 150 using paramType = mozilla::OpusCodecSpecificData; 151 152 static void Write(MessageWriter* aWriter, const paramType& aParam) { 153 WriteParam(aWriter, aParam.mContainerCodecDelayFrames); 154 WriteParam(aWriter, *aParam.mHeadersBinaryBlob); 155 } 156 static bool Read(MessageReader* aReader, paramType* aResult) { 157 return ReadParam(aReader, &aResult->mContainerCodecDelayFrames) && 158 ReadParam(aReader, aResult->mHeadersBinaryBlob.get()); 159 } 160 }; 161 162 template <> 163 struct ParamTraits<mozilla::VorbisCodecSpecificData> { 164 using paramType = mozilla::VorbisCodecSpecificData; 165 166 static void Write(MessageWriter* aWriter, const paramType& aParam) { 167 WriteParam(aWriter, *aParam.mHeadersBinaryBlob); 168 } 169 static bool Read(MessageReader* aReader, paramType* aResult) { 170 return ReadParam(aReader, aResult->mHeadersBinaryBlob.get()); 171 } 172 }; 173 174 template <> 175 struct ParamTraits<mozilla::WaveCodecSpecificData> 176 : public EmptyStructSerializer<mozilla::WaveCodecSpecificData> {}; 177 178 // End traits for AudioCodecSpecificVariant types. 179 180 template <> 181 struct ParamTraits<mozilla::AudioInfo> { 182 typedef mozilla::AudioInfo paramType; 183 184 static void Write(MessageWriter* aWriter, const paramType& aParam) { 185 // TrackInfo 186 WriteParam(aWriter, aParam.mMimeType); 187 188 // AudioInfo 189 WriteParam(aWriter, aParam.mRate); 190 WriteParam(aWriter, aParam.mChannels); 191 WriteParam(aWriter, aParam.mChannelMap); 192 WriteParam(aWriter, aParam.mBitDepth); 193 WriteParam(aWriter, aParam.mProfile); 194 WriteParam(aWriter, aParam.mExtendedProfile); 195 WriteParam(aWriter, aParam.mCodecSpecificConfig); 196 WriteParam(aWriter, aParam.mCrypto); 197 } 198 199 static bool Read(MessageReader* aReader, paramType* aResult) { 200 if (ReadParam(aReader, &aResult->mMimeType) && 201 ReadParam(aReader, &aResult->mRate) && 202 ReadParam(aReader, &aResult->mChannels) && 203 ReadParam(aReader, &aResult->mChannelMap) && 204 ReadParam(aReader, &aResult->mBitDepth) && 205 ReadParam(aReader, &aResult->mProfile) && 206 ReadParam(aReader, &aResult->mExtendedProfile) && 207 ReadParam(aReader, &aResult->mCodecSpecificConfig) && 208 ReadParam(aReader, &aResult->mCrypto)) { 209 return true; 210 } 211 return false; 212 } 213 }; 214 215 template <> 216 struct ParamTraits<mozilla::MediaDataDecoder::ConversionRequired> 217 : public ContiguousEnumSerializerInclusive< 218 mozilla::MediaDataDecoder::ConversionRequired, 219 mozilla::MediaDataDecoder::ConversionRequired(0), 220 mozilla::MediaDataDecoder::ConversionRequired( 221 mozilla::MediaDataDecoder::ConversionRequired::kNeedHVCC)> {}; 222 223 template <> 224 struct ParamTraits<mozilla::MediaDataDecoder::PropertyName> 225 : public ContiguousEnumSerializerInclusive< 226 mozilla::MediaDataDecoder::PropertyName, 227 mozilla::MediaDataDecoder::PropertyName(0), 228 mozilla::MediaDataDecoder::sHighestPropertyName> {}; 229 230 template <> 231 struct ParamTraits<mozilla::media::TimeUnit> { 232 using paramType = mozilla::media::TimeUnit; 233 234 static void Write(MessageWriter* aWriter, const paramType& aParam) { 235 WriteParam(aWriter, aParam.IsValid()); 236 WriteParam(aWriter, aParam.IsValid() ? aParam.mTicks.value() : 0); 237 WriteParam(aWriter, 238 aParam.IsValid() ? aParam.mBase : 1); // base can't be 0 239 } 240 241 static bool Read(MessageReader* aReader, paramType* aResult) { 242 bool valid; 243 int64_t ticks; 244 int64_t base; 245 if (ReadParam(aReader, &valid) && ReadParam(aReader, &ticks) && 246 ReadParam(aReader, &base)) { 247 if (valid) { 248 *aResult = mozilla::media::TimeUnit(ticks, base); 249 } else { 250 *aResult = mozilla::media::TimeUnit::Invalid(); 251 } 252 return true; 253 } 254 return false; 255 }; 256 }; 257 258 template <> 259 struct ParamTraits<mozilla::media::TimeInterval> { 260 typedef mozilla::media::TimeInterval paramType; 261 262 static void Write(MessageWriter* aWriter, const paramType& aParam) { 263 WriteParam(aWriter, aParam.mStart); 264 WriteParam(aWriter, aParam.mEnd); 265 WriteParam(aWriter, aParam.mFuzz); 266 } 267 268 static bool Read(MessageReader* aReader, paramType* aResult) { 269 if (ReadParam(aReader, &aResult->mStart) && 270 ReadParam(aReader, &aResult->mEnd) && 271 ReadParam(aReader, &aResult->mFuzz)) { 272 return true; 273 } 274 return false; 275 } 276 }; 277 278 template <> 279 struct ParamTraits<mozilla::MediaResult> { 280 typedef mozilla::MediaResult paramType; 281 282 static void Write(MessageWriter* aWriter, const paramType& aParam) { 283 WriteParam(aWriter, aParam.Code()); 284 WriteParam(aWriter, aParam.Message()); 285 WriteParam(aWriter, aParam.GetPlatformErrorCode()); 286 } 287 288 static bool Read(MessageReader* aReader, paramType* aResult) { 289 nsresult result; 290 nsCString message; 291 mozilla::Maybe<int32_t> platformErrorCode; 292 if (ReadParam(aReader, &result) && ReadParam(aReader, &message) && 293 ReadParam(aReader, &platformErrorCode)) { 294 *aResult = paramType(result, std::move(message), platformErrorCode); 295 return true; 296 } 297 return false; 298 }; 299 }; 300 301 template <> 302 struct ParamTraits<mozilla::DecoderDoctorDiagnostics> { 303 typedef mozilla::DecoderDoctorDiagnostics paramType; 304 305 static void Write(MessageWriter* aWriter, const paramType& aParam) { 306 WriteParam(aWriter, aParam.mDiagnosticsType); 307 WriteParam(aWriter, aParam.mFormat); 308 WriteParam(aWriter, aParam.mFlags); 309 WriteParam(aWriter, aParam.mEvent); 310 } 311 312 static bool Read(MessageReader* aReader, paramType* aResult) { 313 if (ReadParam(aReader, &aResult->mDiagnosticsType) && 314 ReadParam(aReader, &aResult->mFormat) && 315 ReadParam(aReader, &aResult->mFlags) && 316 ReadParam(aReader, &aResult->mEvent)) { 317 return true; 318 } 319 return false; 320 }; 321 }; 322 323 template <> 324 struct ParamTraits<mozilla::DecoderDoctorDiagnostics::DiagnosticsType> 325 : public ContiguousEnumSerializerInclusive< 326 mozilla::DecoderDoctorDiagnostics::DiagnosticsType, 327 mozilla::DecoderDoctorDiagnostics::DiagnosticsType::eUnsaved, 328 mozilla::DecoderDoctorDiagnostics::DiagnosticsType::eDecodeWarning> { 329 }; 330 331 template <> 332 struct ParamTraits<mozilla::DecoderDoctorEvent> { 333 typedef mozilla::DecoderDoctorEvent paramType; 334 335 static void Write(MessageWriter* aWriter, const paramType& aParam) { 336 int domain = aParam.mDomain; 337 WriteParam(aWriter, domain); 338 WriteParam(aWriter, aParam.mResult); 339 } 340 341 static bool Read(MessageReader* aReader, paramType* aResult) { 342 int domain = 0; 343 if (ReadParam(aReader, &domain) && ReadParam(aReader, &aResult->mResult)) { 344 aResult->mDomain = paramType::Domain(domain); 345 return true; 346 } 347 return false; 348 }; 349 }; 350 351 template <> 352 struct ParamTraits<mozilla::TrackingId::Source> 353 : public ContiguousEnumSerializer< 354 mozilla::TrackingId::Source, 355 mozilla::TrackingId::Source::Unimplemented, 356 mozilla::TrackingId::Source::LAST> {}; 357 358 template <> 359 struct ParamTraits<mozilla::TrackingId> { 360 typedef mozilla::TrackingId paramType; 361 362 static void Write(MessageWriter* aWriter, const paramType& aParam) { 363 WriteParam(aWriter, aParam.mSource); 364 WriteParam(aWriter, aParam.mProcId); 365 WriteParam(aWriter, aParam.mUniqueInProcId); 366 } 367 368 static bool Read(MessageReader* aReader, paramType* aResult) { 369 return ReadParam(aReader, &aResult->mSource) && 370 ReadParam(aReader, &aResult->mProcId) && 371 ReadParam(aReader, &aResult->mUniqueInProcId); 372 } 373 }; 374 375 template <> 376 struct ParamTraits<mozilla::CryptoTrack> { 377 typedef mozilla::CryptoTrack paramType; 378 379 static void Write(MessageWriter* aWriter, const paramType& aParam) { 380 WriteParam(aWriter, aParam.mCryptoScheme); 381 } 382 383 static bool Read(MessageReader* aReader, paramType* aResult) { 384 return ReadParam(aReader, &aResult->mCryptoScheme); 385 } 386 }; 387 388 template <> 389 struct ParamTraits<mozilla::dom::ImageBitmapFormat> 390 : public ContiguousEnumSerializerInclusive< 391 mozilla::dom::ImageBitmapFormat, 392 mozilla::dom::ImageBitmapFormat::RGBA32, 393 mozilla::dom::ImageBitmapFormat::DEPTH> {}; 394 395 template <> 396 struct ParamTraits<mozilla::CodecType> 397 : public ContiguousEnumSerializerInclusive<mozilla::CodecType, 398 mozilla::CodecType::_BeginVideo_, 399 mozilla::CodecType::Unknown> {}; 400 401 template <> 402 struct ParamTraits<mozilla::BitrateMode> 403 : public ContiguousEnumSerializerInclusive<mozilla::BitrateMode, 404 mozilla::BitrateMode::Constant, 405 mozilla::BitrateMode::Variable> { 406 }; 407 408 template <> 409 struct ParamTraits<mozilla::ScalabilityMode> 410 : public ContiguousEnumSerializerInclusive<mozilla::ScalabilityMode, 411 mozilla::ScalabilityMode::None, 412 mozilla::ScalabilityMode::L1T3> { 413 }; 414 415 template <> 416 struct ParamTraits<mozilla::H264BitStreamFormat> 417 : public ContiguousEnumSerializerInclusive< 418 mozilla::H264BitStreamFormat, mozilla::H264BitStreamFormat::AVC, 419 mozilla::H264BitStreamFormat::ANNEXB> {}; 420 421 template <> 422 struct ParamTraits<mozilla::HardwarePreference> 423 : public ContiguousEnumSerializerInclusive< 424 mozilla::HardwarePreference, mozilla::HardwarePreference::None, 425 mozilla::HardwarePreference::RequireSoftware> {}; 426 427 template <> 428 struct ParamTraits<mozilla::Usage> 429 : public ContiguousEnumSerializerInclusive< 430 mozilla::Usage, mozilla::Usage::Realtime, mozilla::Usage::Record> {}; 431 432 template <> 433 struct ParamTraits<mozilla::H264_PROFILE> 434 : public ContiguousEnumSerializerInclusive< 435 mozilla::H264_PROFILE, mozilla::H264_PROFILE::H264_PROFILE_UNKNOWN, 436 mozilla::H264_PROFILE::H264_PROFILE_HIGH> {}; 437 438 template <> 439 struct ParamTraits<mozilla::H264_LEVEL> 440 : public ContiguousEnumSerializerInclusive< 441 mozilla::H264_LEVEL, mozilla::H264_LEVEL::H264_LEVEL_1, 442 mozilla::H264_LEVEL::H264_LEVEL_6_2> {}; 443 444 template <> 445 struct ParamTraits<mozilla::OpusBitstreamFormat> 446 : public ContiguousEnumSerializerInclusive< 447 mozilla::OpusBitstreamFormat, mozilla::OpusBitstreamFormat::Opus, 448 mozilla::OpusBitstreamFormat::OGG> {}; 449 450 template <> 451 struct ParamTraits<mozilla::OpusSpecific::Application> 452 : public ContiguousEnumSerializerInclusive< 453 mozilla::OpusSpecific::Application, 454 mozilla::OpusSpecific::Application::Unspecified, 455 mozilla::OpusSpecific::Application::RestricedLowDelay> {}; 456 457 template <> 458 struct ParamTraits<mozilla::VPXComplexity> 459 : public ContiguousEnumSerializerInclusive<mozilla::VPXComplexity, 460 mozilla::VPXComplexity::Normal, 461 mozilla::VPXComplexity::Max> {}; 462 463 template <> 464 struct ParamTraits<struct mozilla::H264Specific> { 465 typedef mozilla::H264Specific paramType; 466 467 static void Write(MessageWriter* aWriter, const paramType& aParam) { 468 WriteParam(aWriter, aParam.mProfile); 469 WriteParam(aWriter, aParam.mLevel); 470 WriteParam(aWriter, aParam.mFormat); 471 } 472 473 static bool Read(MessageReader* aReader, paramType* aResult) { 474 return ReadParam(aReader, &aResult->mProfile) && 475 ReadParam(aReader, &aResult->mLevel) && 476 ReadParam(aReader, &aResult->mFormat); 477 } 478 }; 479 480 template <> 481 struct ParamTraits<struct mozilla::OpusSpecific> { 482 typedef mozilla::OpusSpecific paramType; 483 484 static void Write(MessageWriter* aWriter, const paramType& aParam) { 485 WriteParam(aWriter, aParam.mApplication); 486 WriteParam(aWriter, aParam.mFrameDuration); 487 WriteParam(aWriter, aParam.mComplexity); 488 WriteParam(aWriter, aParam.mFormat); 489 WriteParam(aWriter, aParam.mPacketLossPerc); 490 WriteParam(aWriter, aParam.mUseInBandFEC); 491 WriteParam(aWriter, aParam.mUseDTX); 492 } 493 494 static bool Read(MessageReader* aReader, paramType* aResult) { 495 return ReadParam(aReader, &aResult->mApplication) && 496 ReadParam(aReader, &aResult->mFrameDuration) && 497 ReadParam(aReader, &aResult->mComplexity) && 498 ReadParam(aReader, &aResult->mFormat) && 499 ReadParam(aReader, &aResult->mPacketLossPerc) && 500 ReadParam(aReader, &aResult->mUseInBandFEC) && 501 ReadParam(aReader, &aResult->mUseDTX); 502 } 503 }; 504 505 template <> 506 struct ParamTraits<struct mozilla::VP8Specific> { 507 typedef mozilla::VP8Specific paramType; 508 509 static void Write(MessageWriter* aWriter, const paramType& aParam) { 510 WriteParam(aWriter, aParam.mComplexity); 511 WriteParam(aWriter, aParam.mResilience); 512 WriteParam(aWriter, aParam.mNumTemporalLayers); 513 WriteParam(aWriter, aParam.mDenoising); 514 WriteParam(aWriter, aParam.mAutoResize); 515 WriteParam(aWriter, aParam.mFrameDropping); 516 } 517 518 static bool Read(MessageReader* aReader, paramType* aResult) { 519 return ReadParam(aReader, &aResult->mComplexity) && 520 ReadParam(aReader, &aResult->mResilience) && 521 ReadParam(aReader, &aResult->mNumTemporalLayers) && 522 ReadParam(aReader, &aResult->mDenoising) && 523 ReadParam(aReader, &aResult->mAutoResize) && 524 ReadParam(aReader, &aResult->mFrameDropping); 525 } 526 }; 527 528 template <> 529 struct ParamTraits<struct mozilla::VP9Specific> { 530 typedef mozilla::VP9Specific paramType; 531 532 static void Write(MessageWriter* aWriter, const paramType& aParam) { 533 ParamTraits<mozilla::VP8Specific>::Write(aWriter, aParam); 534 WriteParam(aWriter, aParam.mAdaptiveQp); 535 WriteParam(aWriter, aParam.mNumSpatialLayers); 536 WriteParam(aWriter, aParam.mFlexible); 537 } 538 539 static bool Read(MessageReader* aReader, paramType* aResult) { 540 return ParamTraits<mozilla::VP8Specific>::Read(aReader, aResult) && 541 ReadParam(aReader, &aResult->mAdaptiveQp) && 542 ReadParam(aReader, &aResult->mNumSpatialLayers) && 543 ReadParam(aReader, &aResult->mFlexible); 544 } 545 }; 546 547 template <> 548 struct ParamTraits<struct mozilla::EncoderConfig::VideoColorSpace> { 549 typedef mozilla::EncoderConfig::VideoColorSpace paramType; 550 551 static void Write(MessageWriter* aWriter, const paramType& aParam) { 552 WriteParam(aWriter, aParam.mRange); 553 WriteParam(aWriter, aParam.mMatrix); 554 WriteParam(aWriter, aParam.mPrimaries); 555 WriteParam(aWriter, aParam.mTransferFunction); 556 } 557 558 static bool Read(MessageReader* aReader, paramType* aResult) { 559 return ReadParam(aReader, &aResult->mRange) && 560 ReadParam(aReader, &aResult->mMatrix) && 561 ReadParam(aReader, &aResult->mPrimaries) && 562 ReadParam(aReader, &aResult->mTransferFunction); 563 } 564 }; 565 566 template <> 567 struct ParamTraits<struct mozilla::EncoderConfig::SampleFormat> { 568 typedef mozilla::EncoderConfig::SampleFormat paramType; 569 570 static void Write(MessageWriter* aWriter, const paramType& aParam) { 571 WriteParam(aWriter, aParam.mPixelFormat); 572 WriteParam(aWriter, aParam.mColorSpace); 573 } 574 575 static bool Read(MessageReader* aReader, paramType* aResult) { 576 return ReadParam(aReader, &aResult->mPixelFormat) && 577 ReadParam(aReader, &aResult->mColorSpace); 578 } 579 }; 580 581 template <> 582 struct ParamTraits<mozilla::EncoderConfig> { 583 typedef mozilla::EncoderConfig paramType; 584 585 static void Write(MessageWriter* aWriter, const paramType& aParam) { 586 WriteParam(aWriter, aParam.mCodec); 587 WriteParam(aWriter, aParam.mSize); 588 WriteParam(aWriter, aParam.mBitrateMode); 589 WriteParam(aWriter, aParam.mBitrate); 590 WriteParam(aWriter, aParam.mMinBitrate); 591 WriteParam(aWriter, aParam.mMaxBitrate); 592 WriteParam(aWriter, aParam.mUsage); 593 WriteParam(aWriter, aParam.mHardwarePreference); 594 WriteParam(aWriter, aParam.mFormat); 595 WriteParam(aWriter, aParam.mScalabilityMode); 596 WriteParam(aWriter, aParam.mFramerate); 597 WriteParam(aWriter, aParam.mKeyframeInterval); 598 WriteParam(aWriter, aParam.mNumberOfChannels); 599 WriteParam(aWriter, aParam.mSampleRate); 600 WriteParam(aWriter, aParam.mCodecSpecific); 601 } 602 603 static bool Read(MessageReader* aReader, paramType* aResult) { 604 return ReadParam(aReader, &aResult->mCodec) && 605 ReadParam(aReader, &aResult->mSize) && 606 ReadParam(aReader, &aResult->mBitrateMode) && 607 ReadParam(aReader, &aResult->mBitrate) && 608 ReadParam(aReader, &aResult->mMinBitrate) && 609 ReadParam(aReader, &aResult->mMaxBitrate) && 610 ReadParam(aReader, &aResult->mUsage) && 611 ReadParam(aReader, &aResult->mHardwarePreference) && 612 ReadParam(aReader, &aResult->mFormat) && 613 ReadParam(aReader, &aResult->mScalabilityMode) && 614 ReadParam(aReader, &aResult->mFramerate) && 615 ReadParam(aReader, &aResult->mKeyframeInterval) && 616 ReadParam(aReader, &aResult->mNumberOfChannels) && 617 ReadParam(aReader, &aResult->mSampleRate) && 618 ReadParam(aReader, &aResult->mCodecSpecific); 619 } 620 }; 621 622 template <typename T, typename Phantom> 623 struct ParamTraits<struct mozilla::StrongTypedef<T, Phantom>> { 624 typedef mozilla::StrongTypedef<T, Phantom> paramType; 625 626 static void Write(MessageWriter* aWriter, const paramType& aParam) { 627 WriteParam(aWriter, aParam.mValue); 628 } 629 630 static bool Read(MessageReader* aReader, paramType* aResult) { 631 return ReadParam(aReader, &aResult->mValue); 632 } 633 }; 634 635 // [RefCounted] typed 636 template <> 637 struct ParamTraits<mozilla::EncoderConfigurationChangeList*> { 638 typedef mozilla::EncoderConfigurationChangeList paramType; 639 640 static void Write(MessageWriter* aWriter, const paramType* aParam) { 641 WriteParam(aWriter, aParam->mChanges); 642 } 643 644 static bool Read(MessageReader* aReader, RefPtr<paramType>* aResult) { 645 auto result = mozilla::MakeRefPtr<paramType>(); 646 if (!ReadParam(aReader, &result->mChanges)) { 647 return false; 648 } 649 *aResult = std::move(result); 650 return true; 651 } 652 }; 653 654 template <> 655 struct ParamTraits<mozilla::dom::MediaKeySessionType> 656 : public ContiguousEnumSerializerInclusive< 657 mozilla::dom::MediaKeySessionType, 658 mozilla::dom::MediaKeySessionType::Temporary, 659 mozilla::dom::MediaKeySessionType::Persistent_license> {}; 660 661 template <> 662 struct ParamTraits<mozilla::CDMKeyInfo> { 663 typedef mozilla::CDMKeyInfo paramType; 664 665 static void Write(MessageWriter* aWriter, const paramType& aParam) { 666 WriteParam(aWriter, aParam.mKeyId); 667 WriteParam(aWriter, aParam.mStatus); 668 } 669 670 static bool Read(MessageReader* aReader, paramType* aResult) { 671 return ReadParam(aReader, &aResult->mKeyId) && 672 ReadParam(aReader, &aResult->mStatus); 673 } 674 }; 675 676 template <typename T> 677 struct ParamTraits<mozilla::NormalizedConstraintSet::Range<T>> { 678 using paramType = mozilla::NormalizedConstraintSet::Range<T>; 679 static void Write(MessageWriter* aWriter, const paramType& aParam) { 680 WriteParams(aWriter, aParam.mMin, aParam.mMax, aParam.mIdeal); 681 } 682 683 static bool Read(MessageReader* aReader, paramType* aResult) { 684 paramType& aParam = *aResult; 685 return ReadParams(aReader, aParam.mMin, aParam.mMax, aParam.mIdeal); 686 } 687 }; 688 DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS( 689 mozilla::NormalizedConstraintSet::LongRange, 690 mozilla::NormalizedConstraintSet::Range<int32_t>); 691 DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS( 692 mozilla::NormalizedConstraintSet::LongLongRange, 693 mozilla::NormalizedConstraintSet::Range<int64_t>); 694 DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS( 695 mozilla::NormalizedConstraintSet::DoubleRange, 696 mozilla::NormalizedConstraintSet::Range<double>); 697 DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS( 698 mozilla::NormalizedConstraintSet::BooleanRange, 699 mozilla::NormalizedConstraintSet::Range<bool>); 700 DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::NormalizedConstraintSet::StringRange, 701 mExact, mIdeal); 702 DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::NormalizedConstraintSet, mWidth, 703 mHeight, mFrameRate, mFacingMode, mResizeMode, 704 mMediaSource, mBrowserWindow, mDeviceId, 705 mGroupId, mViewportOffsetX, mViewportOffsetY, 706 mViewportWidth, mViewportHeight, 707 mEchoCancellation, mNoiseSuppression, 708 mAutoGainControl, mChannelCount); 709 DEFINE_IPC_SERIALIZER_WITH_SUPER_CLASS_AND_FIELDS( 710 mozilla::NormalizedConstraints, mozilla::NormalizedConstraintSet, 711 mAdvanced); 712 713 template <> 714 struct ParamTraits<mozilla::dom::VideoResizeModeEnum> 715 : public mozilla::dom::WebIDLEnumSerializer< 716 mozilla::dom::VideoResizeModeEnum> {}; 717 718 } // namespace IPC 719 720 #endif // mozilla_dom_media_MediaIPCUtils_h