EncoderTypes.h (5978B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim:set ts=2 sw=2 sts=2 et cindent: */ 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_EncoderTypes_h 8 #define mozilla_dom_EncoderTypes_h 9 10 #include "VideoDecoder.h" 11 #include "mozilla/Maybe.h" 12 #include "mozilla/dom/AudioEncoderBinding.h" 13 #include "mozilla/dom/EncodedVideoChunk.h" 14 #include "mozilla/dom/MediaRecorderBinding.h" 15 #include "mozilla/dom/VideoEncoderBinding.h" 16 #include "mozilla/dom/VideoFrame.h" 17 #include "mozilla/dom/VideoFrameBinding.h" 18 #include "nsStringFwd.h" 19 #include "nsTLiteralString.h" 20 21 namespace mozilla { 22 23 class TrackInfo; 24 class MediaByteBuffer; 25 26 namespace dom { 27 28 class AudioEncoderConfigInternal { 29 public: 30 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AudioEncoderConfigInternal); 31 explicit AudioEncoderConfigInternal(const AudioEncoderConfig& aConfig); 32 explicit AudioEncoderConfigInternal( 33 const AudioEncoderConfigInternal& aConfig); 34 35 void SetSpecific(const EncoderConfig::CodecSpecific& aSpecific); 36 37 nsCString ToString() const; 38 39 bool Equals(const AudioEncoderConfigInternal& aOther) const; 40 bool CanReconfigure(const AudioEncoderConfigInternal& aOther) const; 41 42 // Returns an EncoderConfig struct with as many filled members as 43 // possible. 44 EncoderConfig ToEncoderConfig() const; 45 46 already_AddRefed<WebCodecsConfigurationChangeList> Diff( 47 const AudioEncoderConfigInternal& aOther) const; 48 49 nsString mCodec; 50 Maybe<uint32_t> mSampleRate; 51 Maybe<uint32_t> mNumberOfChannels; 52 Maybe<uint32_t> mBitrate; 53 BitrateMode mBitrateMode; 54 EncoderConfig::CodecSpecific mSpecific{void_t{}}; 55 56 private: 57 AudioEncoderConfigInternal(const nsAString& aCodec, 58 Maybe<uint32_t> aSampleRate, 59 Maybe<uint32_t> aNumberOfChannels, 60 Maybe<uint32_t> aBitRate, 61 BitrateMode aBitratemode); 62 ~AudioEncoderConfigInternal() = default; 63 }; 64 65 class AudioEncoderTraits { 66 public: 67 static constexpr nsLiteralCString Name = "AudioEncoder"_ns; 68 using ConfigType = AudioEncoderConfig; 69 using ConfigTypeInternal = AudioEncoderConfigInternal; 70 using InputType = dom::AudioData; 71 using OutputConfigType = mozilla::dom::AudioDecoderConfig; 72 using InputTypeInternal = mozilla::AudioData; 73 using OutputType = EncodedAudioChunk; 74 using OutputCallbackType = EncodedAudioChunkOutputCallback; 75 using MetadataType = EncodedAudioChunkMetadata; 76 77 static bool IsSupported(const ConfigTypeInternal& aConfig); 78 static Result<UniquePtr<TrackInfo>, nsresult> CreateTrackInfo( 79 const ConfigTypeInternal& aConfig); 80 static bool Validate(const ConfigType& aConfig, nsCString& aErrorMessage); 81 static RefPtr<ConfigTypeInternal> CreateConfigInternal( 82 const ConfigType& aConfig); 83 static RefPtr<InputTypeInternal> CreateInputInternal( 84 const InputType& aInput, const VideoEncoderEncodeOptions& aOptions); 85 static already_AddRefed<OutputConfigType> EncoderConfigToDecoderConfig( 86 nsIGlobalObject* aGlobal, const RefPtr<MediaRawData>& aData, 87 const ConfigTypeInternal& mOutputConfig); 88 }; 89 90 class VideoEncoderConfigInternal { 91 public: 92 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoEncoderConfigInternal); 93 explicit VideoEncoderConfigInternal(const VideoEncoderConfig& aConfig); 94 explicit VideoEncoderConfigInternal( 95 const VideoEncoderConfigInternal& aConfig); 96 97 // Returns an EncoderConfig struct with as many filled members as 98 // possible. 99 // TODO: handle codec specific things 100 EncoderConfig ToEncoderConfig() const; 101 102 bool Equals(const VideoEncoderConfigInternal& aOther) const; 103 bool CanReconfigure(const VideoEncoderConfigInternal& aOther) const; 104 already_AddRefed<WebCodecsConfigurationChangeList> Diff( 105 const VideoEncoderConfigInternal& aOther) const; 106 nsCString ToString() const; 107 108 nsString mCodec; 109 uint32_t mWidth; 110 uint32_t mHeight; 111 Maybe<uint32_t> mDisplayWidth; 112 Maybe<uint32_t> mDisplayHeight; 113 Maybe<uint32_t> mBitrate; 114 Maybe<double> mFramerate; 115 HardwareAcceleration mHardwareAcceleration; 116 AlphaOption mAlpha; 117 Maybe<nsString> mScalabilityMode; 118 VideoEncoderBitrateMode mBitrateMode; 119 LatencyMode mLatencyMode; 120 Maybe<nsString> mContentHint; 121 Maybe<AvcEncoderConfig> mAvc; 122 123 private: 124 VideoEncoderConfigInternal( 125 const nsAString& aCodec, uint32_t aWidth, uint32_t aHeight, 126 Maybe<uint32_t>&& aDisplayWidth, Maybe<uint32_t>&& aDisplayHeight, 127 Maybe<uint32_t>&& aBitrate, Maybe<double>&& aFramerate, 128 const HardwareAcceleration& aHardwareAcceleration, 129 const AlphaOption& aAlpha, Maybe<nsString>&& aScalabilityMode, 130 const VideoEncoderBitrateMode& aBitrateMode, 131 const LatencyMode& aLatencyMode, Maybe<nsString>&& aContentHint); 132 133 ~VideoEncoderConfigInternal() = default; 134 }; 135 136 class VideoEncoderTraits { 137 public: 138 static constexpr nsLiteralCString Name = "VideoEncoder"_ns; 139 using ConfigType = VideoEncoderConfig; 140 using ConfigTypeInternal = VideoEncoderConfigInternal; 141 using InputType = dom::VideoFrame; 142 using InputTypeInternal = mozilla::VideoData; 143 using OutputConfigType = mozilla::dom::VideoDecoderConfig; 144 using OutputType = EncodedVideoChunk; 145 using OutputCallbackType = EncodedVideoChunkOutputCallback; 146 using MetadataType = EncodedVideoChunkMetadata; 147 148 static bool IsSupported(const ConfigTypeInternal& aConfig); 149 static bool CanEncodeVideo(const ConfigTypeInternal& aConfig); 150 static bool Validate(const ConfigType& aConfig, nsCString& aErrorMessage); 151 static RefPtr<ConfigTypeInternal> CreateConfigInternal( 152 const ConfigType& aConfig); 153 static RefPtr<InputTypeInternal> CreateInputInternal( 154 const InputType& aInput, const VideoEncoderEncodeOptions& aOptions); 155 }; 156 157 } // namespace dom 158 } // namespace mozilla 159 160 #endif // mozilla_dom_EncoderTypes_h