tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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