diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /dom/media/webcodecs/EncoderAgent.h | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/media/webcodecs/EncoderAgent.h')
-rw-r--r-- | dom/media/webcodecs/EncoderAgent.h | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/dom/media/webcodecs/EncoderAgent.h b/dom/media/webcodecs/EncoderAgent.h new file mode 100644 index 0000000000..387f218e29 --- /dev/null +++ b/dom/media/webcodecs/EncoderAgent.h @@ -0,0 +1,116 @@ +/* -*- 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 DOM_MEDIA_WEBCODECS_EncoderAgent_H +#define DOM_MEDIA_WEBCODECS_EncoderAgent_H + +#include "MediaResult.h" +#include "PlatformEncoderModule.h" +#include "PEMFactory.h" +#include "mozilla/RefPtr.h" +#include "mozilla/TaskQueue.h" +#include "WebCodecsUtils.h" + +class nsISerialEventTarget; + +namespace mozilla { + +class PDMFactory; +class TrackInfo; + +namespace layers { +class ImageContainer; +} // namespace layers + +// EncoderAgent is a wrapper that contains a MediaDataEncoder. It adapts the +// MediaDataEncoder APIs for use in WebCodecs. +// +// If Configure() is called, Shutdown() must be called to release the resources +// gracefully. Except Shutdown(), all the methods can't be called concurrently, +// meaning a method can only be called when the previous API call has completed. +// The responsability of arranging the method calls is on the caller. +// +// When Shutdown() is called, all the operations in flight are canceled and the +// MediaDataEncoder is shut down. On the other hand, errors are final. A new +// EncoderAgent must be created when an error is encountered. +// +// All the methods need to be called on the EncoderAgent's owner thread. In +// WebCodecs, it's either on the main thread or worker thread. +class EncoderAgent final { + public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(EncoderAgent); + + explicit EncoderAgent(WebCodecsId aId); + + // The following APIs are owner thread only. + + using ConfigurePromise = MozPromise<bool, MediaResult, true /* exclusive */>; + using ReconfigurationPromise = MediaDataEncoder::ReconfigurationPromise; + RefPtr<ConfigurePromise> Configure(const EncoderConfig& aConfig); + RefPtr<ReconfigurationPromise> Reconfigure( + const RefPtr<const EncoderConfigurationChangeList>& aConfigChange); + RefPtr<ShutdownPromise> Shutdown(); + using EncodePromise = MediaDataEncoder::EncodePromise; + RefPtr<EncodePromise> Encode(MediaData* aInput); + // WebCodecs's flush() flushes out all the pending encoded data in the + // encoder. It's called Drain internally. + RefPtr<EncodePromise> Drain(); + + const WebCodecsId mId; + + private: + ~EncoderAgent(); + + // Push out all the data in the MediaDataEncoder's pipeline. + // TODO: MediaDataEncoder should implement this, instead of asking call site + // to run `Drain` multiple times. + RefPtr<EncodePromise> Dry(); + void DryUntilDrain(); + + enum class State { + Unconfigured, + Configuring, + Configured, + Encoding, + Flushing, + ShuttingDown, + Error, + }; + void SetState(State aState); + + const RefPtr<nsISerialEventTarget> mOwnerThread; + const RefPtr<PEMFactory> mPEMFactory; + RefPtr<MediaDataEncoder> mEncoder; + State mState; + + // Configure + MozPromiseHolder<ConfigurePromise> mConfigurePromise; + using CreateEncoderPromise = PlatformEncoderModule::CreateEncoderPromise; + MozPromiseRequestHolder<CreateEncoderPromise> mCreateRequest; + using InitPromise = MediaDataEncoder::InitPromise; + MozPromiseRequestHolder<InitPromise> mInitRequest; + + // Reconfigure + MozPromiseHolder<ReconfigurationPromise> mReconfigurationPromise; + using ReconfigureEncoderRequest = ReconfigurationPromise; + MozPromiseRequestHolder<ReconfigureEncoderRequest> mReconfigurationRequest; + + // Shutdown + MozPromiseHolder<ShutdownPromise> mShutdownWhileCreationPromise; + + // Encoding + MozPromiseHolder<EncodePromise> mEncodePromise; + MozPromiseRequestHolder<EncodePromise> mEncodeRequest; + + // Drain + MozPromiseRequestHolder<EncodePromise> mDrainRequest; + MozPromiseHolder<EncodePromise> mDrainPromise; + MediaDataEncoder::EncodedData mDrainData; +}; + +} // namespace mozilla + +#endif // DOM_MEDIA_WEBCODECS_EncoderAgent_H |