/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim:set ts=2 sw=2 sts=2 et cindent: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef MOZILLA_DOM_WEBCODECS_WEBCODECSUTILS_H #define MOZILLA_DOM_WEBCODECS_WEBCODECSUTILS_H #include "ErrorList.h" #include "MediaData.h" #include "js/TypeDecls.h" #include "mozilla/Maybe.h" #include "mozilla/MozPromise.h" #include "mozilla/Result.h" #include "mozilla/TaskQueue.h" #include "mozilla/dom/BindingDeclarations.h" #include "mozilla/dom/Nullable.h" #include "mozilla/dom/UnionTypes.h" #include "mozilla/dom/VideoEncoderBinding.h" #include "mozilla/dom/VideoFrameBinding.h" #include "PlatformEncoderModule.h" namespace mozilla { namespace gfx { enum class ColorRange : uint8_t; enum class ColorSpace2 : uint8_t; enum class SurfaceFormat : int8_t; enum class TransferFunction : uint8_t; enum class YUVColorSpace : uint8_t; } // namespace gfx using WebCodecsId = size_t; extern std::atomic sNextId; struct EncoderConfigurationChangeList; namespace dom { /* * The followings are helpers for WebCodecs methods. */ nsTArray GuessContainers(const nsAString& aCodec); Maybe ParseCodecString(const nsAString& aCodec); /* * Below are helpers for conversion among Maybe, Optional, and Nullable. */ template Maybe OptionalToMaybe(const Optional& aOptional) { if (aOptional.WasPassed()) { return Some(aOptional.Value()); } return Nothing(); } template const T* OptionalToPointer(const Optional& aOptional) { return aOptional.WasPassed() ? &aOptional.Value() : nullptr; } template Maybe NullableToMaybe(const Nullable& aNullable) { if (!aNullable.IsNull()) { return Some(aNullable.Value()); } return Nothing(); } template Nullable MaybeToNullable(const Maybe& aOptional) { if (aOptional.isSome()) { return Nullable(aOptional.value()); } return Nullable(); } /* * Below are helpers to operate ArrayBuffer or ArrayBufferView. */ Result CloneBuffer( JSContext* aCx, OwningMaybeSharedArrayBufferViewOrMaybeSharedArrayBuffer& aDest, const OwningMaybeSharedArrayBufferViewOrMaybeSharedArrayBuffer& aSrc, ErrorResult& aRv); Result, nsresult> GetExtraDataFromArrayBuffer( const OwningMaybeSharedArrayBufferViewOrMaybeSharedArrayBuffer& aBuffer); /* * The following are utilities to convert between VideoColorSpace values to * gfx's values. */ enum class VideoColorPrimaries : uint8_t; enum class VideoMatrixCoefficients : uint8_t; enum class VideoTransferCharacteristics : uint8_t; gfx::ColorRange ToColorRange(bool aIsFullRange); gfx::YUVColorSpace ToColorSpace(VideoMatrixCoefficients aMatrix); gfx::TransferFunction ToTransferFunction( VideoTransferCharacteristics aTransfer); gfx::ColorSpace2 ToPrimaries(VideoColorPrimaries aPrimaries); bool ToFullRange(const gfx::ColorRange& aColorRange); Maybe ToMatrixCoefficients( const gfx::YUVColorSpace& aColorSpace); Maybe ToTransferCharacteristics( const gfx::TransferFunction& aTransferFunction); Maybe ToPrimaries(const gfx::ColorSpace2& aColorSpace); /* * The following are utilities to convert from gfx's formats to * VideoPixelFormats. */ enum class ImageBitmapFormat : uint8_t; enum class VideoPixelFormat : uint8_t; Maybe SurfaceFormatToVideoPixelFormat( gfx::SurfaceFormat aFormat); Maybe ImageBitmapFormatToVideoPixelFormat( ImageBitmapFormat aFormat); template class MessageRequestHolder { public: MessageRequestHolder() = default; ~MessageRequestHolder() = default; MozPromiseRequestHolder& Request() { return mRequest; } void Disconnect() { mRequest.DisconnectIfExists(); } void Complete() { mRequest.Complete(); } bool Exists() const { return mRequest.Exists(); } protected: MozPromiseRequestHolder mRequest{}; }; enum class MessageProcessedResult { NotProcessed, Processed }; bool IsOnAndroid(); bool IsOnMacOS(); bool IsOnLinux(); // Wrap a type to make it unique. This allows using ergonomically in the Variant // below. Simply aliasing with `using` isn't enough, because typedefs in C++ // don't produce strong types, so two integer variants result in // the same type, making it ambiguous to the Variant code. // T is the type to be wrapped. Phantom is a type that is only used to // disambiguate and should be unique in the program. template class StrongTypedef { public: explicit StrongTypedef(T const& value) : mValue(value) {} explicit StrongTypedef(T&& value) : mValue(std::move(value)) {} T& get() { return mValue; } T const& get() const { return mValue; } private: T mValue; }; using CodecChange = StrongTypedef; using DimensionsChange = StrongTypedef; using DisplayDimensionsChange = StrongTypedef, struct DisplayDimensionsChangeTypeWebCodecs>; using BitrateChange = StrongTypedef, struct BitrateChangeTypeWebCodecs>; using FramerateChange = StrongTypedef, struct FramerateChangeTypeWebCodecs>; using HardwareAccelerationChange = StrongTypedef; using AlphaChange = StrongTypedef; using ScalabilityModeChange = StrongTypedef, struct ScalabilityModeChangeTypeWebCodecs>; using BitrateModeChange = StrongTypedef; using LatencyModeChange = StrongTypedef; using ContentHintChange = StrongTypedef, struct ContentHintTypeTypeWebCodecs>; using WebCodecsEncoderConfigurationItem = Variant; struct WebCodecsConfigurationChangeList { NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WebCodecsConfigurationChangeList) bool Empty() const { return mChanges.IsEmpty(); } template void Push(const T& aItem) { mChanges.AppendElement(aItem); } // This returns true if it should be possible to attempt to reconfigure the // encoder on the fly. It can fail, in which case the encoder will be flushed // and a new one will be created with the new set of parameters. bool CanAttemptReconfigure() const; // Convert this to the format the underlying PEM can understand RefPtr ToPEMChangeList() const; nsString ToString() const; nsTArray mChanges; private: ~WebCodecsConfigurationChangeList() = default; }; nsCString ColorSpaceInitToString( const dom::VideoColorSpaceInit& aColorSpaceInit); RefPtr GetWebCodecsEncoderTaskQueue(); VideoColorSpaceInit FallbackColorSpaceForVideoContent(); VideoColorSpaceInit FallbackColorSpaceForWebContent(); Maybe CodecStringToCodecType(const nsAString& aCodecString); nsString ConfigToString(const VideoDecoderConfig& aConfig); bool IsSupportedVideoCodec(const nsAString& aCodec); } // namespace dom } // namespace mozilla #endif // MOZILLA_DOM_WEBCODECS_WEBCODECSUTILS_H