tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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