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