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/. */
7 #ifndef mozilla_dom_media_MediaIPCUtils_h
8 #define mozilla_dom_media_MediaIPCUtils_h
10 #include "DecoderDoctorDiagnostics.h"
11 #include "PlatformDecoderModule.h"
12 #include "ipc/EnumSerializer.h"
13 #include "mozilla/EnumSet.h"
14 #include "mozilla/GfxMessageUtils.h"
15 #include "mozilla/gfx/Rect.h"
19 struct ParamTraits
<mozilla::VideoInfo
> {
20 typedef mozilla::VideoInfo paramType
;
22 static void Write(MessageWriter
* aWriter
, const paramType
& aParam
) {
24 WriteParam(aWriter
, aParam
.mMimeType
);
27 WriteParam(aWriter
, aParam
.mDisplay
);
28 WriteParam(aWriter
, aParam
.mStereoMode
);
29 WriteParam(aWriter
, aParam
.mImage
);
30 WriteParam(aWriter
, aParam
.mImageRect
);
31 WriteParam(aWriter
, *aParam
.mCodecSpecificConfig
);
32 WriteParam(aWriter
, *aParam
.mExtraData
);
33 WriteParam(aWriter
, aParam
.mRotation
);
34 WriteParam(aWriter
, aParam
.mColorDepth
);
35 WriteParam(aWriter
, aParam
.mColorSpace
);
36 WriteParam(aWriter
, aParam
.mColorPrimaries
);
37 WriteParam(aWriter
, aParam
.mTransferFunction
);
38 WriteParam(aWriter
, aParam
.mColorRange
);
39 WriteParam(aWriter
, aParam
.HasAlpha());
42 static bool Read(MessageReader
* aReader
, paramType
* aResult
) {
43 mozilla::gfx::IntRect imageRect
;
45 if (ReadParam(aReader
, &aResult
->mMimeType
) &&
46 ReadParam(aReader
, &aResult
->mDisplay
) &&
47 ReadParam(aReader
, &aResult
->mStereoMode
) &&
48 ReadParam(aReader
, &aResult
->mImage
) &&
49 ReadParam(aReader
, &aResult
->mImageRect
) &&
50 ReadParam(aReader
, aResult
->mCodecSpecificConfig
.get()) &&
51 ReadParam(aReader
, aResult
->mExtraData
.get()) &&
52 ReadParam(aReader
, &aResult
->mRotation
) &&
53 ReadParam(aReader
, &aResult
->mColorDepth
) &&
54 ReadParam(aReader
, &aResult
->mColorSpace
) &&
55 ReadParam(aReader
, &aResult
->mColorPrimaries
) &&
56 ReadParam(aReader
, &aResult
->mTransferFunction
) &&
57 ReadParam(aReader
, &aResult
->mColorRange
) &&
58 ReadParam(aReader
, &alphaPresent
)) {
59 aResult
->SetAlpha(alphaPresent
);
67 struct ParamTraits
<mozilla::TrackInfo::TrackType
>
68 : public ContiguousEnumSerializerInclusive
<
69 mozilla::TrackInfo::TrackType
,
70 mozilla::TrackInfo::TrackType::kUndefinedTrack
,
71 mozilla::TrackInfo::TrackType::kTextTrack
> {};
74 struct ParamTraits
<mozilla::VideoInfo::Rotation
>
75 : public ContiguousEnumSerializerInclusive
<
76 mozilla::VideoInfo::Rotation
, mozilla::VideoInfo::Rotation::kDegree_0
,
77 mozilla::VideoInfo::Rotation::kDegree_270
> {};
80 struct ParamTraits
<mozilla::MediaByteBuffer
>
81 : public ParamTraits
<nsTArray
<uint8_t>> {
82 typedef mozilla::MediaByteBuffer paramType
;
85 // Traits for AudioCodecSpecificVariant types.
88 struct ParamTraits
<mozilla::NoCodecSpecificData
>
89 : public EmptyStructSerializer
<mozilla::NoCodecSpecificData
> {};
92 struct ParamTraits
<mozilla::AudioCodecSpecificBinaryBlob
> {
93 using paramType
= mozilla::AudioCodecSpecificBinaryBlob
;
95 static void Write(MessageWriter
* aWriter
, const paramType
& aParam
) {
96 WriteParam(aWriter
, *aParam
.mBinaryBlob
);
98 static bool Read(MessageReader
* aReader
, paramType
* aResult
) {
99 return ReadParam(aReader
, aResult
->mBinaryBlob
.get());
104 struct ParamTraits
<mozilla::AacCodecSpecificData
> {
105 using paramType
= mozilla::AacCodecSpecificData
;
107 static void Write(MessageWriter
* aWriter
, const paramType
& aParam
) {
108 WriteParam(aWriter
, *aParam
.mEsDescriptorBinaryBlob
);
109 WriteParam(aWriter
, *aParam
.mDecoderConfigDescriptorBinaryBlob
);
111 static bool Read(MessageReader
* aReader
, paramType
* aResult
) {
112 return ReadParam(aReader
, aResult
->mEsDescriptorBinaryBlob
.get()) &&
114 aResult
->mDecoderConfigDescriptorBinaryBlob
.get());
119 struct ParamTraits
<mozilla::FlacCodecSpecificData
> {
120 using paramType
= mozilla::FlacCodecSpecificData
;
122 static void Write(MessageWriter
* aWriter
, const paramType
& aParam
) {
123 WriteParam(aWriter
, *aParam
.mStreamInfoBinaryBlob
);
125 static bool Read(MessageReader
* aReader
, paramType
* aResult
) {
126 return ReadParam(aReader
, aResult
->mStreamInfoBinaryBlob
.get());
131 struct ParamTraits
<mozilla::Mp3CodecSpecificData
>
132 : public PlainOldDataSerializer
<mozilla::Mp3CodecSpecificData
> {};
135 struct ParamTraits
<mozilla::OpusCodecSpecificData
> {
136 using paramType
= mozilla::OpusCodecSpecificData
;
138 static void Write(MessageWriter
* aWriter
, const paramType
& aParam
) {
139 WriteParam(aWriter
, aParam
.mContainerCodecDelayMicroSeconds
);
140 WriteParam(aWriter
, *aParam
.mHeadersBinaryBlob
);
142 static bool Read(MessageReader
* aReader
, paramType
* aResult
) {
143 return ReadParam(aReader
, &aResult
->mContainerCodecDelayMicroSeconds
) &&
144 ReadParam(aReader
, aResult
->mHeadersBinaryBlob
.get());
149 struct ParamTraits
<mozilla::VorbisCodecSpecificData
> {
150 using paramType
= mozilla::VorbisCodecSpecificData
;
152 static void Write(MessageWriter
* aWriter
, const paramType
& aParam
) {
153 WriteParam(aWriter
, *aParam
.mHeadersBinaryBlob
);
155 static bool Read(MessageReader
* aReader
, paramType
* aResult
) {
156 return ReadParam(aReader
, aResult
->mHeadersBinaryBlob
.get());
161 struct ParamTraits
<mozilla::WaveCodecSpecificData
>
162 : public EmptyStructSerializer
<mozilla::WaveCodecSpecificData
> {};
164 // End traits for AudioCodecSpecificVariant types.
167 struct ParamTraits
<mozilla::AudioInfo
> {
168 typedef mozilla::AudioInfo paramType
;
170 static void Write(MessageWriter
* aWriter
, const paramType
& aParam
) {
172 WriteParam(aWriter
, aParam
.mMimeType
);
175 WriteParam(aWriter
, aParam
.mRate
);
176 WriteParam(aWriter
, aParam
.mChannels
);
177 WriteParam(aWriter
, aParam
.mChannelMap
);
178 WriteParam(aWriter
, aParam
.mBitDepth
);
179 WriteParam(aWriter
, aParam
.mProfile
);
180 WriteParam(aWriter
, aParam
.mExtendedProfile
);
181 WriteParam(aWriter
, aParam
.mCodecSpecificConfig
);
184 static bool Read(MessageReader
* aReader
, paramType
* aResult
) {
185 if (ReadParam(aReader
, &aResult
->mMimeType
) &&
186 ReadParam(aReader
, &aResult
->mRate
) &&
187 ReadParam(aReader
, &aResult
->mChannels
) &&
188 ReadParam(aReader
, &aResult
->mChannelMap
) &&
189 ReadParam(aReader
, &aResult
->mBitDepth
) &&
190 ReadParam(aReader
, &aResult
->mProfile
) &&
191 ReadParam(aReader
, &aResult
->mExtendedProfile
) &&
192 ReadParam(aReader
, &aResult
->mCodecSpecificConfig
)) {
200 struct ParamTraits
<mozilla::MediaDataDecoder::ConversionRequired
>
201 : public ContiguousEnumSerializerInclusive
<
202 mozilla::MediaDataDecoder::ConversionRequired
,
203 mozilla::MediaDataDecoder::ConversionRequired(0),
204 mozilla::MediaDataDecoder::ConversionRequired(
205 mozilla::MediaDataDecoder::ConversionRequired::kNeedAnnexB
)> {};
208 struct ParamTraits
<mozilla::media::TimeUnit
> {
209 typedef mozilla::media::TimeUnit paramType
;
211 static void Write(MessageWriter
* aWriter
, const paramType
& aParam
) {
212 WriteParam(aWriter
, aParam
.IsValid());
213 WriteParam(aWriter
, aParam
.IsValid() ? aParam
.ToMicroseconds() : 0);
216 static bool Read(MessageReader
* aReader
, paramType
* aResult
) {
219 if (ReadParam(aReader
, &valid
) && ReadParam(aReader
, &value
)) {
221 *aResult
= mozilla::media::TimeUnit::Invalid();
223 *aResult
= mozilla::media::TimeUnit::FromMicroseconds(value
);
232 struct ParamTraits
<mozilla::media::TimeInterval
> {
233 typedef mozilla::media::TimeInterval paramType
;
235 static void Write(MessageWriter
* aWriter
, const paramType
& aParam
) {
236 WriteParam(aWriter
, aParam
.mStart
);
237 WriteParam(aWriter
, aParam
.mEnd
);
238 WriteParam(aWriter
, aParam
.mFuzz
);
241 static bool Read(MessageReader
* aReader
, paramType
* aResult
) {
242 if (ReadParam(aReader
, &aResult
->mStart
) &&
243 ReadParam(aReader
, &aResult
->mEnd
) &&
244 ReadParam(aReader
, &aResult
->mFuzz
)) {
252 struct ParamTraits
<mozilla::MediaResult
> {
253 typedef mozilla::MediaResult paramType
;
255 static void Write(MessageWriter
* aWriter
, const paramType
& aParam
) {
256 WriteParam(aWriter
, aParam
.Code());
257 WriteParam(aWriter
, aParam
.Message());
260 static bool Read(MessageReader
* aReader
, paramType
* aResult
) {
263 if (ReadParam(aReader
, &result
) && ReadParam(aReader
, &message
)) {
264 *aResult
= paramType(result
, std::move(message
));
272 struct ParamTraits
<mozilla::DecoderDoctorDiagnostics
> {
273 typedef mozilla::DecoderDoctorDiagnostics paramType
;
275 static void Write(MessageWriter
* aWriter
, const paramType
& aParam
) {
276 WriteParam(aWriter
, aParam
.mDiagnosticsType
);
277 WriteParam(aWriter
, aParam
.mFormat
);
278 WriteParam(aWriter
, aParam
.mFlags
);
279 WriteParam(aWriter
, aParam
.mEvent
);
282 static bool Read(MessageReader
* aReader
, paramType
* aResult
) {
283 if (ReadParam(aReader
, &aResult
->mDiagnosticsType
) &&
284 ReadParam(aReader
, &aResult
->mFormat
) &&
285 ReadParam(aReader
, &aResult
->mFlags
) &&
286 ReadParam(aReader
, &aResult
->mEvent
)) {
294 struct ParamTraits
<mozilla::DecoderDoctorDiagnostics::DiagnosticsType
>
295 : public ContiguousEnumSerializerInclusive
<
296 mozilla::DecoderDoctorDiagnostics::DiagnosticsType
,
297 mozilla::DecoderDoctorDiagnostics::DiagnosticsType::eUnsaved
,
298 mozilla::DecoderDoctorDiagnostics::DiagnosticsType::eDecodeWarning
> {
302 struct ParamTraits
<mozilla::DecoderDoctorEvent
> {
303 typedef mozilla::DecoderDoctorEvent paramType
;
305 static void Write(MessageWriter
* aWriter
, const paramType
& aParam
) {
306 int domain
= aParam
.mDomain
;
307 WriteParam(aWriter
, domain
);
308 WriteParam(aWriter
, aParam
.mResult
);
311 static bool Read(MessageReader
* aReader
, paramType
* aResult
) {
313 if (ReadParam(aReader
, &domain
) && ReadParam(aReader
, &aResult
->mResult
)) {
314 aResult
->mDomain
= paramType::Domain(domain
);
323 #endif // mozilla_dom_media_MediaIPCUtils_h