tor-browser

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

MediaSystemResourceClient.h (2800B)


      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 file,
      5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #if !defined(MediaSystemResourceClient_h_)
      8 #  define MediaSystemResourceClient_h_
      9 
     10 #  include "MediaSystemResourceManager.h"
     11 #  include "MediaSystemResourceTypes.h"
     12 #  include "mozilla/Atomics.h"
     13 #  include "mozilla/Monitor.h"
     14 #  include "mozilla/RefPtr.h"
     15 #  include "mozilla/media/MediaSystemResourceTypes.h"
     16 
     17 namespace mozilla {
     18 
     19 class MediaSystemResourceManager;
     20 
     21 /**
     22 * This is a base class for listener callbacks.
     23 * This callback is invoked when the media system resource reservation state
     24 * is changed.
     25 */
     26 class MediaSystemResourceReservationListener {
     27 public:
     28  virtual void ResourceReserved() = 0;
     29  virtual void ResourceReserveFailed() = 0;
     30 };
     31 
     32 /**
     33 * MediaSystemResourceClient is used to reserve a media system resource
     34 * like hw decoder. When system has a limitation of a media resource,
     35 * use this class to mediate use rights of the resource.
     36 */
     37 class MediaSystemResourceClient {
     38 public:
     39  // Enumeration for the valid decoding states
     40  enum ResourceState {
     41    RESOURCE_STATE_START,
     42    RESOURCE_STATE_WAITING,
     43    RESOURCE_STATE_ACQUIRED,
     44    RESOURCE_STATE_NOT_ACQUIRED,
     45    RESOURCE_STATE_END
     46  };
     47 
     48  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaSystemResourceClient)
     49 
     50  explicit MediaSystemResourceClient(MediaSystemResourceType aReourceType);
     51 
     52  bool SetListener(MediaSystemResourceReservationListener* aListener);
     53 
     54  // Try to acquire media resource asynchronously.
     55  // If the resource is used by others, wait until acquired.
     56  void Acquire();
     57 
     58  // Try to acquire media resource synchronously. If the resource is not
     59  // immediately available, fail to acquire it. return false if resource is not
     60  // acquired. return true if resource is acquired.
     61  //
     62  // This function should not be called on ImageBridge thread.
     63  // It should be used only for compatibility with legacy code.
     64  bool AcquireSyncNoWait();
     65 
     66  void ReleaseResource();
     67 
     68 private:
     69  ~MediaSystemResourceClient();
     70 
     71  RefPtr<MediaSystemResourceManager> mManager;
     72  const MediaSystemResourceType mResourceType;
     73  const uint32_t mId;
     74 
     75  // Modified only by MediaSystemResourceManager.
     76  // Accessed and modified with MediaSystemResourceManager::mReentrantMonitor
     77  // held.
     78  MediaSystemResourceReservationListener* mListener;
     79  ResourceState mResourceState;
     80  bool mIsSync;
     81  ReentrantMonitor* mAcquireSyncWaitMonitor;
     82  bool* mAcquireSyncWaitDone;
     83 
     84  static mozilla::Atomic<uint32_t> sSerialCounter;
     85 
     86  friend class MediaSystemResourceManager;
     87 };
     88 
     89 }  // namespace mozilla
     90 
     91 #endif