xref: /aosp_15_r20/frameworks/av/services/mediaresourcemanager/ResourceObserverService.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /**
2*ec779b8eSAndroid Build Coastguard Worker  *
3*ec779b8eSAndroid Build Coastguard Worker  * Copyright 2020, The Android Open Source Project
4*ec779b8eSAndroid Build Coastguard Worker  *
5*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*ec779b8eSAndroid Build Coastguard Worker  *
9*ec779b8eSAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*ec779b8eSAndroid Build Coastguard Worker  *
11*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
16*ec779b8eSAndroid Build Coastguard Worker  */
17*ec779b8eSAndroid Build Coastguard Worker 
18*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_MEDIA_RESOURCE_OBSERVER_SERVICE_H
19*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_MEDIA_RESOURCE_OBSERVER_SERVICE_H
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #include <map>
22*ec779b8eSAndroid Build Coastguard Worker 
23*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/media/BnResourceObserverService.h>
24*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerService.h"
25*ec779b8eSAndroid Build Coastguard Worker 
26*ec779b8eSAndroid Build Coastguard Worker namespace android {
27*ec779b8eSAndroid Build Coastguard Worker 
28*ec779b8eSAndroid Build Coastguard Worker using Status = ::ndk::ScopedAStatus;
29*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::BnResourceObserverService;
30*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::IResourceObserver;
31*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::MediaObservableFilter;
32*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::MediaObservableParcel;
33*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::MediaObservableType;
34*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::MediaObservableEvent;
35*ec779b8eSAndroid Build Coastguard Worker 
36*ec779b8eSAndroid Build Coastguard Worker class ResourceObserverService : public BnResourceObserverService {
37*ec779b8eSAndroid Build Coastguard Worker public:
38*ec779b8eSAndroid Build Coastguard Worker 
getServiceName()39*ec779b8eSAndroid Build Coastguard Worker     static char const *getServiceName() { return "media.resource_observer"; }
40*ec779b8eSAndroid Build Coastguard Worker     static std::shared_ptr<ResourceObserverService> instantiate();
41*ec779b8eSAndroid Build Coastguard Worker 
42*ec779b8eSAndroid Build Coastguard Worker     virtual inline binder_status_t dump(
43*ec779b8eSAndroid Build Coastguard Worker             int /*fd*/, const char** /*args*/, uint32_t /*numArgs*/);
44*ec779b8eSAndroid Build Coastguard Worker 
45*ec779b8eSAndroid Build Coastguard Worker     ResourceObserverService();
~ResourceObserverService()46*ec779b8eSAndroid Build Coastguard Worker     virtual ~ResourceObserverService() {}
47*ec779b8eSAndroid Build Coastguard Worker 
48*ec779b8eSAndroid Build Coastguard Worker     // IResourceObserverService interface
49*ec779b8eSAndroid Build Coastguard Worker     Status registerObserver(const std::shared_ptr<IResourceObserver>& in_observer,
50*ec779b8eSAndroid Build Coastguard Worker             const std::vector<MediaObservableFilter>& in_filters) override;
51*ec779b8eSAndroid Build Coastguard Worker 
52*ec779b8eSAndroid Build Coastguard Worker     Status unregisterObserver(const std::shared_ptr<IResourceObserver>& in_observer) override;
53*ec779b8eSAndroid Build Coastguard Worker     // ~IResourceObserverService interface
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker     // Called by ResourceManagerService when resources are added.
56*ec779b8eSAndroid Build Coastguard Worker     void onResourceAdded(int uid, int pid, const ResourceList &resources);
57*ec779b8eSAndroid Build Coastguard Worker 
58*ec779b8eSAndroid Build Coastguard Worker     // Called by ResourceManagerService when resources are removed.
59*ec779b8eSAndroid Build Coastguard Worker     void onResourceRemoved(int uid, int pid, const ResourceList &resources);
60*ec779b8eSAndroid Build Coastguard Worker 
61*ec779b8eSAndroid Build Coastguard Worker private:
62*ec779b8eSAndroid Build Coastguard Worker     struct ObserverInfo {
63*ec779b8eSAndroid Build Coastguard Worker         ::ndk::SpAIBinder binder;
64*ec779b8eSAndroid Build Coastguard Worker         std::shared_ptr<IResourceObserver> observer;
65*ec779b8eSAndroid Build Coastguard Worker         std::vector<MediaObservableFilter> filters;
66*ec779b8eSAndroid Build Coastguard Worker     };
67*ec779b8eSAndroid Build Coastguard Worker     struct DeathRecipient;
68*ec779b8eSAndroid Build Coastguard Worker 
69*ec779b8eSAndroid Build Coastguard Worker     // Below maps are all keyed on the observer's binder ptr value.
70*ec779b8eSAndroid Build Coastguard Worker     using ObserverInfoMap = std::map<uintptr_t, ObserverInfo>;
71*ec779b8eSAndroid Build Coastguard Worker     using SubscriberMap = std::map<uintptr_t, std::shared_ptr<IResourceObserver>>;
72*ec779b8eSAndroid Build Coastguard Worker 
73*ec779b8eSAndroid Build Coastguard Worker     std::mutex mObserverLock;
74*ec779b8eSAndroid Build Coastguard Worker     // Binder->ObserverInfo
75*ec779b8eSAndroid Build Coastguard Worker     ObserverInfoMap mObserverInfoMap GUARDED_BY(mObserverLock);
76*ec779b8eSAndroid Build Coastguard Worker     // Observable(<type,event>)->Subscribers
77*ec779b8eSAndroid Build Coastguard Worker     std::map<MediaObservableFilter, SubscriberMap> mObservableToSubscribersMap
78*ec779b8eSAndroid Build Coastguard Worker             GUARDED_BY(mObserverLock);
79*ec779b8eSAndroid Build Coastguard Worker 
80*ec779b8eSAndroid Build Coastguard Worker     ::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient;
81*ec779b8eSAndroid Build Coastguard Worker 
82*ec779b8eSAndroid Build Coastguard Worker     // Binder death handling.
83*ec779b8eSAndroid Build Coastguard Worker     static std::mutex sDeathRecipientLock;
84*ec779b8eSAndroid Build Coastguard Worker     static std::map<uintptr_t, std::shared_ptr<DeathRecipient>> sDeathRecipientMap
85*ec779b8eSAndroid Build Coastguard Worker             GUARDED_BY(sDeathRecipientLock);
86*ec779b8eSAndroid Build Coastguard Worker     static void BinderDiedCallback(void* cookie);
87*ec779b8eSAndroid Build Coastguard Worker 
88*ec779b8eSAndroid Build Coastguard Worker     void notifyObservers(MediaObservableEvent event,
89*ec779b8eSAndroid Build Coastguard Worker             int uid, int pid, const ResourceList &resources);
90*ec779b8eSAndroid Build Coastguard Worker };
91*ec779b8eSAndroid Build Coastguard Worker 
92*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
93*ec779b8eSAndroid Build Coastguard Worker } // namespace android
94*ec779b8eSAndroid Build Coastguard Worker 
95*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_MEDIA_RESOURCE_OBSERVER_SERVICE_H
96