MediaDataEncoderProxy.cpp (4118B)
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 #include "MediaDataEncoderProxy.h" 8 9 namespace mozilla { 10 11 MediaDataEncoderProxy::MediaDataEncoderProxy( 12 already_AddRefed<MediaDataEncoder> aProxyEncoder, 13 already_AddRefed<nsISerialEventTarget> aProxyThread) 14 : mProxyEncoder(aProxyEncoder), mProxyThread(aProxyThread) {} 15 16 MediaDataEncoderProxy::~MediaDataEncoderProxy() = default; 17 18 RefPtr<MediaDataEncoder::InitPromise> MediaDataEncoderProxy::Init() { 19 MOZ_ASSERT(!mIsShutdown); 20 21 if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { 22 return mProxyEncoder->Init(); 23 } 24 return InvokeAsync(mProxyThread, __func__, [self = RefPtr{this}] { 25 return self->mProxyEncoder->Init(); 26 }); 27 } 28 29 RefPtr<MediaDataEncoder::EncodePromise> MediaDataEncoderProxy::Encode( 30 nsTArray<RefPtr<MediaData>>&& aSamples) { 31 MOZ_ASSERT(!mIsShutdown); 32 33 if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { 34 return mProxyEncoder->Encode(std::move(aSamples)); 35 } 36 return InvokeAsync( 37 mProxyThread, __func__, 38 [self = RefPtr{this}, samples = std::move(aSamples)]() mutable { 39 return self->mProxyEncoder->Encode(std::move(samples)); 40 }); 41 } 42 43 RefPtr<MediaDataEncoder::EncodePromise> MediaDataEncoderProxy::Encode( 44 const MediaData* aSample) { 45 MOZ_ASSERT(!mIsShutdown); 46 47 if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { 48 return mProxyEncoder->Encode(aSample); 49 } 50 return InvokeAsync(mProxyThread, __func__, 51 [self = RefPtr{this}, sample = RefPtr{aSample}] { 52 return self->mProxyEncoder->Encode(sample); 53 }); 54 } 55 56 RefPtr<MediaDataEncoder::ReconfigurationPromise> 57 MediaDataEncoderProxy::Reconfigure( 58 const RefPtr<const EncoderConfigurationChangeList>& aConfigurationChanges) { 59 MOZ_ASSERT(!mIsShutdown); 60 61 if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { 62 return mProxyEncoder->Reconfigure(aConfigurationChanges); 63 } 64 return InvokeAsync( 65 mProxyThread, __func__, 66 [self = RefPtr{this}, changes = RefPtr{aConfigurationChanges}] { 67 return self->mProxyEncoder->Reconfigure(changes); 68 }); 69 } 70 71 RefPtr<MediaDataEncoder::EncodePromise> MediaDataEncoderProxy::Drain() { 72 MOZ_ASSERT(!mIsShutdown); 73 74 if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { 75 return mProxyEncoder->Drain(); 76 } 77 return InvokeAsync(mProxyThread, __func__, [self = RefPtr{this}] { 78 return self->mProxyEncoder->Drain(); 79 }); 80 } 81 82 RefPtr<ShutdownPromise> MediaDataEncoderProxy::Shutdown() { 83 MOZ_ASSERT(!mIsShutdown); 84 85 #if defined(DEBUG) 86 mIsShutdown = true; 87 #endif 88 89 RefPtr<MediaDataEncoder> proxyEncoder = std::move(mProxyEncoder); 90 if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { 91 return proxyEncoder->Shutdown(); 92 } 93 // We chain another promise to ensure that the proxied encoder gets destructed 94 // on the proxy thread. 95 return InvokeAsync( 96 mProxyThread, __func__, 97 [self = RefPtr{this}, proxyEncoder = std::move(proxyEncoder)] { 98 return proxyEncoder->Shutdown(); 99 }); 100 } 101 102 RefPtr<GenericPromise> MediaDataEncoderProxy::SetBitrate(uint32_t aBitsPerSec) { 103 MOZ_ASSERT(!mIsShutdown); 104 105 if (!mProxyThread || mProxyThread->IsOnCurrentThread()) { 106 return mProxyEncoder->SetBitrate(aBitsPerSec); 107 } 108 return InvokeAsync(mProxyThread, __func__, 109 [self = RefPtr{this}, bitsPerSec = aBitsPerSec] { 110 return self->mProxyEncoder->SetBitrate(bitsPerSec); 111 }); 112 } 113 114 bool MediaDataEncoderProxy::IsHardwareAccelerated( 115 nsACString& aFailureReason) const { 116 MOZ_ASSERT(!mIsShutdown); 117 118 return mProxyEncoder->IsHardwareAccelerated(aFailureReason); 119 } 120 121 nsCString MediaDataEncoderProxy::GetDescriptionName() const { 122 MOZ_ASSERT(!mIsShutdown); 123 124 return mProxyEncoder->GetDescriptionName(); 125 } 126 127 } // namespace mozilla