/* 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 "MediaDataEncoderProxy.h" #include "nsProxyRelease.h" namespace mozilla { MediaDataEncoderProxy::MediaDataEncoderProxy( RefPtr&& aProxyEncoder, nsCOMPtr&& aProxyThread) : mProxyEncoder(std::move(aProxyEncoder)), mProxyThread(std::move(aProxyThread)) { MOZ_ASSERT(mProxyEncoder); MOZ_ASSERT(mProxyThread); } MediaDataEncoderProxy::~MediaDataEncoderProxy() { NS_ProxyRelease("MediaDataEncoderProxy::mProxyEncoder", mProxyThread, mProxyEncoder.forget()); } RefPtr MediaDataEncoderProxy::Init() { MOZ_ASSERT(!mIsShutdown); if (mProxyThread->IsOnCurrentThread()) { return mProxyEncoder->Init(); } return InvokeAsync(mProxyThread, __func__, [self = RefPtr{this}] { return self->mProxyEncoder->Init(); }); } RefPtr MediaDataEncoderProxy::Encode( nsTArray>&& aSamples) { MOZ_ASSERT(!mIsShutdown); if (mProxyThread->IsOnCurrentThread()) { return mProxyEncoder->Encode(std::move(aSamples)); } return InvokeAsync( mProxyThread, __func__, [self = RefPtr{this}, samples = std::move(aSamples)]() mutable { return self->mProxyEncoder->Encode(std::move(samples)); }); } RefPtr MediaDataEncoderProxy::Encode( const MediaData* aSample) { MOZ_ASSERT(!mIsShutdown); if (mProxyThread->IsOnCurrentThread()) { return mProxyEncoder->Encode(aSample); } return InvokeAsync(mProxyThread, __func__, [self = RefPtr{this}, sample = RefPtr{aSample}] { return self->mProxyEncoder->Encode(sample); }); } RefPtr MediaDataEncoderProxy::Reconfigure( const RefPtr& aConfigurationChanges) { MOZ_ASSERT(!mIsShutdown); if (mProxyThread->IsOnCurrentThread()) { return mProxyEncoder->Reconfigure(aConfigurationChanges); } return InvokeAsync( mProxyThread, __func__, [self = RefPtr{this}, changes = RefPtr{aConfigurationChanges}] { return self->mProxyEncoder->Reconfigure(changes); }); } RefPtr MediaDataEncoderProxy::Drain() { MOZ_ASSERT(!mIsShutdown); if (mProxyThread->IsOnCurrentThread()) { return mProxyEncoder->Drain(); } return InvokeAsync(mProxyThread, __func__, [self = RefPtr{this}] { return self->mProxyEncoder->Drain(); }); } RefPtr MediaDataEncoderProxy::Shutdown() { MOZ_ASSERT(!mIsShutdown); #if defined(DEBUG) mIsShutdown = true; #endif if (mProxyThread->IsOnCurrentThread()) { return mProxyEncoder->Shutdown(); } // We chain another promise to ensure that the proxied encoder gets destructed // on the proxy thread. return InvokeAsync(mProxyThread, __func__, [self = RefPtr{this}] { return self->mProxyEncoder->Shutdown(); }); } RefPtr MediaDataEncoderProxy::SetBitrate(uint32_t aBitsPerSec) { MOZ_ASSERT(!mIsShutdown); if (mProxyThread->IsOnCurrentThread()) { return mProxyEncoder->SetBitrate(aBitsPerSec); } return InvokeAsync(mProxyThread, __func__, [self = RefPtr{this}, bitsPerSec = aBitsPerSec] { return self->mProxyEncoder->SetBitrate(bitsPerSec); }); } bool MediaDataEncoderProxy::IsHardwareAccelerated( nsACString& aFailureReason) const { MOZ_ASSERT(!mIsShutdown); return mProxyEncoder->IsHardwareAccelerated(aFailureReason); } nsCString MediaDataEncoderProxy::GetDescriptionName() const { MOZ_ASSERT(!mIsShutdown); return mProxyEncoder->GetDescriptionName(); } } // namespace mozilla