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