From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../platforms/wrappers/MediaDataDecoderProxy.cpp | 149 +++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 dom/media/platforms/wrappers/MediaDataDecoderProxy.cpp (limited to 'dom/media/platforms/wrappers/MediaDataDecoderProxy.cpp') diff --git a/dom/media/platforms/wrappers/MediaDataDecoderProxy.cpp b/dom/media/platforms/wrappers/MediaDataDecoderProxy.cpp new file mode 100644 index 0000000000..dcb31b0899 --- /dev/null +++ b/dom/media/platforms/wrappers/MediaDataDecoderProxy.cpp @@ -0,0 +1,149 @@ +/* -*- 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/. */ + +#include "MediaDataDecoderProxy.h" + +namespace mozilla { + +RefPtr MediaDataDecoderProxy::Init() { + MOZ_ASSERT(!mIsShutdown); + + if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { + return mProxyDecoder->Init(); + } + return InvokeAsync(mProxyThread, __func__, [self = RefPtr{this}] { + return self->mProxyDecoder->Init(); + }); +} + +RefPtr MediaDataDecoderProxy::Decode( + MediaRawData* aSample) { + MOZ_ASSERT(!mIsShutdown); + + if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { + return mProxyDecoder->Decode(aSample); + } + RefPtr sample = aSample; + return InvokeAsync(mProxyThread, __func__, [self = RefPtr{this}, sample] { + return self->mProxyDecoder->Decode(sample); + }); +} + +bool MediaDataDecoderProxy::CanDecodeBatch() const { + return mProxyDecoder->CanDecodeBatch(); +} + +RefPtr MediaDataDecoderProxy::DecodeBatch( + nsTArray>&& aSamples) { + MOZ_ASSERT(!mIsShutdown); + if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { + return mProxyDecoder->DecodeBatch(std::move(aSamples)); + } + return InvokeAsync( + mProxyThread, __func__, + [self = RefPtr{this}, samples = std::move(aSamples)]() mutable { + return self->mProxyDecoder->DecodeBatch(std::move(samples)); + }); +} + +RefPtr MediaDataDecoderProxy::Flush() { + MOZ_ASSERT(!mIsShutdown); + + if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { + return mProxyDecoder->Flush(); + } + return InvokeAsync(mProxyThread, __func__, [self = RefPtr{this}] { + return self->mProxyDecoder->Flush(); + }); +} + +RefPtr MediaDataDecoderProxy::Drain() { + MOZ_ASSERT(!mIsShutdown); + + if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { + return mProxyDecoder->Drain(); + } + return InvokeAsync(mProxyThread, __func__, [self = RefPtr{this}] { + return self->mProxyDecoder->Drain(); + }); +} + +RefPtr MediaDataDecoderProxy::Shutdown() { + MOZ_ASSERT(!mIsShutdown); + +#if defined(DEBUG) + mIsShutdown = true; +#endif + + if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { + return mProxyDecoder->Shutdown(); + } + // We chain another promise to ensure that the proxied decoder gets destructed + // on the proxy thread. + return InvokeAsync(mProxyThread, __func__, [self = RefPtr{this}] { + RefPtr p = self->mProxyDecoder->Shutdown()->Then( + self->mProxyThread, __func__, + [self](const ShutdownPromise::ResolveOrRejectValue& aResult) { + self->mProxyDecoder = nullptr; + return ShutdownPromise::CreateAndResolveOrReject(aResult, __func__); + }); + return p; + }); +} + +nsCString MediaDataDecoderProxy::GetDescriptionName() const { + MOZ_ASSERT(!mIsShutdown); + + return mProxyDecoder->GetDescriptionName(); +} + +nsCString MediaDataDecoderProxy::GetProcessName() const { + MOZ_ASSERT(!mIsShutdown); + + return mProxyDecoder->GetProcessName(); +} + +nsCString MediaDataDecoderProxy::GetCodecName() const { + MOZ_ASSERT(!mIsShutdown); + + return mProxyDecoder->GetCodecName(); +} + +bool MediaDataDecoderProxy::IsHardwareAccelerated( + nsACString& aFailureReason) const { + MOZ_ASSERT(!mIsShutdown); + + return mProxyDecoder->IsHardwareAccelerated(aFailureReason); +} + +void MediaDataDecoderProxy::SetSeekThreshold(const media::TimeUnit& aTime) { + MOZ_ASSERT(!mIsShutdown); + + if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { + mProxyDecoder->SetSeekThreshold(aTime); + return; + } + media::TimeUnit time = aTime; + mProxyThread->Dispatch(NS_NewRunnableFunction( + "MediaDataDecoderProxy::SetSeekThreshold", [self = RefPtr{this}, time] { + self->mProxyDecoder->SetSeekThreshold(time); + })); +} + +bool MediaDataDecoderProxy::SupportDecoderRecycling() const { + MOZ_ASSERT(!mIsShutdown); + + return mProxyDecoder->SupportDecoderRecycling(); +} + +MediaDataDecoder::ConversionRequired MediaDataDecoderProxy::NeedsConversion() + const { + MOZ_ASSERT(!mIsShutdown); + + return mProxyDecoder->NeedsConversion(); +} + +} // namespace mozilla -- cgit v1.2.3