1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker ** 3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2023, 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_RESOURCEMANAGERMETRICS_H_ 19*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_MEDIA_RESOURCEMANAGERMETRICS_H_ 20*ec779b8eSAndroid Build Coastguard Worker 21*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerService.h" 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker namespace android { 24*ec779b8eSAndroid Build Coastguard Worker 25*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::ClientInfoParcel; 26*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::ClientConfigParcel; 27*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::IResourceManagerClient; 28*ec779b8eSAndroid Build Coastguard Worker 29*ec779b8eSAndroid Build Coastguard Worker struct ProcessInfoInterface; 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker class UidObserver; 32*ec779b8eSAndroid Build Coastguard Worker 33*ec779b8eSAndroid Build Coastguard Worker // 34*ec779b8eSAndroid Build Coastguard Worker // Enumeration for Codec bucket based on: 35*ec779b8eSAndroid Build Coastguard Worker // - Encoder or Decoder 36*ec779b8eSAndroid Build Coastguard Worker // - hardware implementation or not 37*ec779b8eSAndroid Build Coastguard Worker // - Audio/Video/Image codec 38*ec779b8eSAndroid Build Coastguard Worker // 39*ec779b8eSAndroid Build Coastguard Worker enum CodecBucket { 40*ec779b8eSAndroid Build Coastguard Worker CodecBucketUnspecified = 0, 41*ec779b8eSAndroid Build Coastguard Worker HwAudioEncoder = 1, 42*ec779b8eSAndroid Build Coastguard Worker HwAudioDecoder = 2, 43*ec779b8eSAndroid Build Coastguard Worker HwVideoEncoder = 3, 44*ec779b8eSAndroid Build Coastguard Worker HwVideoDecoder = 4, 45*ec779b8eSAndroid Build Coastguard Worker HwImageEncoder = 5, 46*ec779b8eSAndroid Build Coastguard Worker HwImageDecoder = 6, 47*ec779b8eSAndroid Build Coastguard Worker SwAudioEncoder = 7, 48*ec779b8eSAndroid Build Coastguard Worker SwAudioDecoder = 8, 49*ec779b8eSAndroid Build Coastguard Worker SwVideoEncoder = 9, 50*ec779b8eSAndroid Build Coastguard Worker SwVideoDecoder = 10, 51*ec779b8eSAndroid Build Coastguard Worker SwImageEncoder = 11, 52*ec779b8eSAndroid Build Coastguard Worker SwImageDecoder = 12, 53*ec779b8eSAndroid Build Coastguard Worker CodecBucketMaxSize = 13, 54*ec779b8eSAndroid Build Coastguard Worker }; 55*ec779b8eSAndroid Build Coastguard Worker 56*ec779b8eSAndroid Build Coastguard Worker // Map of client id and client configuration, when it was started last. 57*ec779b8eSAndroid Build Coastguard Worker typedef std::map<int64_t, ClientConfigParcel> ClientConfigMap; 58*ec779b8eSAndroid Build Coastguard Worker 59*ec779b8eSAndroid Build Coastguard Worker // Map of pid and the uid. 60*ec779b8eSAndroid Build Coastguard Worker typedef std::map<int32_t, uid_t> PidUidMap; 61*ec779b8eSAndroid Build Coastguard Worker 62*ec779b8eSAndroid Build Coastguard Worker // Map of concurrent codes by Codec type bucket. 63*ec779b8eSAndroid Build Coastguard Worker struct ConcurrentCodecsMap { 64*ec779b8eSAndroid Build Coastguard Worker int& operator[](CodecBucket index) { 65*ec779b8eSAndroid Build Coastguard Worker return mCodec[index]; 66*ec779b8eSAndroid Build Coastguard Worker } 67*ec779b8eSAndroid Build Coastguard Worker 68*ec779b8eSAndroid Build Coastguard Worker const int& operator[](CodecBucket index) const { 69*ec779b8eSAndroid Build Coastguard Worker return mCodec[index]; 70*ec779b8eSAndroid Build Coastguard Worker } 71*ec779b8eSAndroid Build Coastguard Worker 72*ec779b8eSAndroid Build Coastguard Worker private: 73*ec779b8eSAndroid Build Coastguard Worker int mCodec[CodecBucketMaxSize] = {0}; 74*ec779b8eSAndroid Build Coastguard Worker }; 75*ec779b8eSAndroid Build Coastguard Worker 76*ec779b8eSAndroid Build Coastguard Worker // Current and Peak ConcurrentCodecMap for a process. 77*ec779b8eSAndroid Build Coastguard Worker struct ConcurrentCodecs { 78*ec779b8eSAndroid Build Coastguard Worker ConcurrentCodecsMap mCurrent; 79*ec779b8eSAndroid Build Coastguard Worker ConcurrentCodecsMap mPeak; 80*ec779b8eSAndroid Build Coastguard Worker // concurrent HW Video codecs. 81*ec779b8eSAndroid Build Coastguard Worker int mHWVideoCodecs; 82*ec779b8eSAndroid Build Coastguard Worker // concurrent SW Video codecs. 83*ec779b8eSAndroid Build Coastguard Worker int mSWVideoCodecs; 84*ec779b8eSAndroid Build Coastguard Worker // concurrent Video codecs. 85*ec779b8eSAndroid Build Coastguard Worker int mVideoCodecs; 86*ec779b8eSAndroid Build Coastguard Worker // concurrent Audio codecs. 87*ec779b8eSAndroid Build Coastguard Worker int mAudioCodecs; 88*ec779b8eSAndroid Build Coastguard Worker // concurrent Image codecs. 89*ec779b8eSAndroid Build Coastguard Worker int mImageCodecs; 90*ec779b8eSAndroid Build Coastguard Worker }; 91*ec779b8eSAndroid Build Coastguard Worker 92*ec779b8eSAndroid Build Coastguard Worker // Current and Peak pixel count for a process. 93*ec779b8eSAndroid Build Coastguard Worker struct PixelCount { 94*ec779b8eSAndroid Build Coastguard Worker long mCurrent = 0; 95*ec779b8eSAndroid Build Coastguard Worker long mPeak = 0; 96*ec779b8eSAndroid Build Coastguard Worker }; 97*ec779b8eSAndroid Build Coastguard Worker 98*ec779b8eSAndroid Build Coastguard Worker // 99*ec779b8eSAndroid Build Coastguard Worker // Resource Manager Metrics is designed to answer some of the questions like: 100*ec779b8eSAndroid Build Coastguard Worker // - What apps are causing reclaim and what apps are targeted (reclaimed from) in the process? 101*ec779b8eSAndroid Build Coastguard Worker // - which apps use the most codecs and the most codec memory? 102*ec779b8eSAndroid Build Coastguard Worker // - What is the % of total successful reclaims? 103*ec779b8eSAndroid Build Coastguard Worker // 104*ec779b8eSAndroid Build Coastguard Worker // Though, it's not in the context of this class, metrics should also answer: 105*ec779b8eSAndroid Build Coastguard Worker // - what % of codec errors are due to codec being reclaimed? 106*ec779b8eSAndroid Build Coastguard Worker // - What % of successful codec creation(start) requires codec reclaims? 107*ec779b8eSAndroid Build Coastguard Worker // - How often codec start fails even after successful reclaim? 108*ec779b8eSAndroid Build Coastguard Worker // 109*ec779b8eSAndroid Build Coastguard Worker // The metrics are collected to analyze and understand the codec resource usage 110*ec779b8eSAndroid Build Coastguard Worker // and use that information to help with: 111*ec779b8eSAndroid Build Coastguard Worker // - minimize the no of reclaims 112*ec779b8eSAndroid Build Coastguard Worker // - reduce the codec start delays by minimizing no of times we try to reclaim 113*ec779b8eSAndroid Build Coastguard Worker // - minimize the reclaim errors in codec records 114*ec779b8eSAndroid Build Coastguard Worker // 115*ec779b8eSAndroid Build Coastguard Worker // Success metrics for Resource Manager Service could be defined as: 116*ec779b8eSAndroid Build Coastguard Worker // - increase in sucecssful codec creation for the foreground apps 117*ec779b8eSAndroid Build Coastguard Worker // - reduce the number of reclaims for codecs 118*ec779b8eSAndroid Build Coastguard Worker // - reduce the time to create codec 119*ec779b8eSAndroid Build Coastguard Worker // 120*ec779b8eSAndroid Build Coastguard Worker // We would like to use this data to come up with a better resource management that would: 121*ec779b8eSAndroid Build Coastguard Worker // - increase the successful codec creation (for all kind of apps) 122*ec779b8eSAndroid Build Coastguard Worker // - decrease the codec errors due to resources 123*ec779b8eSAndroid Build Coastguard Worker // 124*ec779b8eSAndroid Build Coastguard Worker // This class that maintains concurrent codec counts based on: 125*ec779b8eSAndroid Build Coastguard Worker // 126*ec779b8eSAndroid Build Coastguard Worker // 1. # of concurrent active codecs (initialized, but aren't released yet) of given 127*ec779b8eSAndroid Build Coastguard Worker // implementation (by codec name) across the system. 128*ec779b8eSAndroid Build Coastguard Worker // 129*ec779b8eSAndroid Build Coastguard Worker // 2. # of concurrent codec usage (started, but not stopped yet), which is 130*ec779b8eSAndroid Build Coastguard Worker // measured using codec type bucket (CodecBucket) for: 131*ec779b8eSAndroid Build Coastguard Worker // - each process/application. 132*ec779b8eSAndroid Build Coastguard Worker // - across the system. 133*ec779b8eSAndroid Build Coastguard Worker // Also the peak count of the same for each process/application is maintained. 134*ec779b8eSAndroid Build Coastguard Worker // 135*ec779b8eSAndroid Build Coastguard Worker // 3. # of Peak Concurrent Pixels for each process/application. 136*ec779b8eSAndroid Build Coastguard Worker // This should help with understanding the (video) memory usage per 137*ec779b8eSAndroid Build Coastguard Worker // application. 138*ec779b8eSAndroid Build Coastguard Worker // 139*ec779b8eSAndroid Build Coastguard Worker 140*ec779b8eSAndroid Build Coastguard Worker class ResourceManagerMetrics { 141*ec779b8eSAndroid Build Coastguard Worker public: 142*ec779b8eSAndroid Build Coastguard Worker ResourceManagerMetrics(const sp<ProcessInfoInterface>& processInfo); 143*ec779b8eSAndroid Build Coastguard Worker ~ResourceManagerMetrics(); 144*ec779b8eSAndroid Build Coastguard Worker 145*ec779b8eSAndroid Build Coastguard Worker // To be called when a client is created. 146*ec779b8eSAndroid Build Coastguard Worker void notifyClientCreated(const ClientInfoParcel& clientInfo); 147*ec779b8eSAndroid Build Coastguard Worker 148*ec779b8eSAndroid Build Coastguard Worker // To be called when a client is released. 149*ec779b8eSAndroid Build Coastguard Worker void notifyClientReleased(const ClientInfoParcel& clientInfo); 150*ec779b8eSAndroid Build Coastguard Worker 151*ec779b8eSAndroid Build Coastguard Worker // To be called when a client is started. 152*ec779b8eSAndroid Build Coastguard Worker void notifyClientStarted(const ClientConfigParcel& clientConfig); 153*ec779b8eSAndroid Build Coastguard Worker 154*ec779b8eSAndroid Build Coastguard Worker // To be called when a client is stopped. 155*ec779b8eSAndroid Build Coastguard Worker void notifyClientStopped(const ClientConfigParcel& clientConfig); 156*ec779b8eSAndroid Build Coastguard Worker 157*ec779b8eSAndroid Build Coastguard Worker // To be called when a client's configuration has changed. 158*ec779b8eSAndroid Build Coastguard Worker void notifyClientConfigChanged(const ClientConfigParcel& clientConfig); 159*ec779b8eSAndroid Build Coastguard Worker 160*ec779b8eSAndroid Build Coastguard Worker // To be called when after a reclaim event. 161*ec779b8eSAndroid Build Coastguard Worker void pushReclaimAtom(const ClientInfoParcel& clientInfo, 162*ec779b8eSAndroid Build Coastguard Worker const std::vector<int>& priorities, 163*ec779b8eSAndroid Build Coastguard Worker const std::vector<ClientInfo>& targetClients, 164*ec779b8eSAndroid Build Coastguard Worker bool reclaimed); 165*ec779b8eSAndroid Build Coastguard Worker 166*ec779b8eSAndroid Build Coastguard Worker // Add this pid/uid set to monitor for the process termination state. 167*ec779b8eSAndroid Build Coastguard Worker void addPid(int pid, uid_t uid = 0); 168*ec779b8eSAndroid Build Coastguard Worker 169*ec779b8eSAndroid Build Coastguard Worker // Get the peak concurrent pixel count (associated with the video codecs) for the process. 170*ec779b8eSAndroid Build Coastguard Worker long getPeakConcurrentPixelCount(int pid) const; 171*ec779b8eSAndroid Build Coastguard Worker // Get the current concurrent pixel count (associated with the video codecs) for the process. 172*ec779b8eSAndroid Build Coastguard Worker long getCurrentConcurrentPixelCount(int pid) const; 173*ec779b8eSAndroid Build Coastguard Worker 174*ec779b8eSAndroid Build Coastguard Worker // retrieves metrics log. 175*ec779b8eSAndroid Build Coastguard Worker std::string dump() const; 176*ec779b8eSAndroid Build Coastguard Worker 177*ec779b8eSAndroid Build Coastguard Worker private: 178*ec779b8eSAndroid Build Coastguard Worker ResourceManagerMetrics(const ResourceManagerMetrics&) = delete; 179*ec779b8eSAndroid Build Coastguard Worker ResourceManagerMetrics(ResourceManagerMetrics&&) = delete; 180*ec779b8eSAndroid Build Coastguard Worker ResourceManagerMetrics& operator=(const ResourceManagerMetrics&) = delete; 181*ec779b8eSAndroid Build Coastguard Worker ResourceManagerMetrics& operator=(ResourceManagerMetrics&&) = delete; 182*ec779b8eSAndroid Build Coastguard Worker 183*ec779b8eSAndroid Build Coastguard Worker // To increase/decrease the concurrent codec usage for a given CodecBucket. 184*ec779b8eSAndroid Build Coastguard Worker void increaseConcurrentCodecs(int32_t pid, CodecBucket codecBucket); 185*ec779b8eSAndroid Build Coastguard Worker void decreaseConcurrentCodecs(int32_t pid, CodecBucket codecBucket); 186*ec779b8eSAndroid Build Coastguard Worker 187*ec779b8eSAndroid Build Coastguard Worker // To increase/update/decrease the concurrent pixels usage for a process. 188*ec779b8eSAndroid Build Coastguard Worker void increasePixelCount(int32_t pid, long pixels); 189*ec779b8eSAndroid Build Coastguard Worker void updatePixelCount(int32_t pid, long newPixels, long lastPixels); 190*ec779b8eSAndroid Build Coastguard Worker void decreasePixelCount(int32_t pid, long pixels); 191*ec779b8eSAndroid Build Coastguard Worker 192*ec779b8eSAndroid Build Coastguard Worker // Issued when the process/application with given pid/uid is terminated. 193*ec779b8eSAndroid Build Coastguard Worker void onProcessTerminated(int32_t pid, uid_t uid); 194*ec779b8eSAndroid Build Coastguard Worker 195*ec779b8eSAndroid Build Coastguard Worker // To push conccuret codec usage of a process/application. 196*ec779b8eSAndroid Build Coastguard Worker void pushConcurrentUsageReport(int32_t pid, uid_t uid); 197*ec779b8eSAndroid Build Coastguard Worker 198*ec779b8eSAndroid Build Coastguard Worker private: 199*ec779b8eSAndroid Build Coastguard Worker std::mutex mLock; 200*ec779b8eSAndroid Build Coastguard Worker 201*ec779b8eSAndroid Build Coastguard Worker // Map of client id and the configuration. 202*ec779b8eSAndroid Build Coastguard Worker ClientConfigMap mClientConfigMap; 203*ec779b8eSAndroid Build Coastguard Worker 204*ec779b8eSAndroid Build Coastguard Worker // Concurrent and Peak Pixel count for each process/application. 205*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, PixelCount> mProcessPixelsMap; 206*ec779b8eSAndroid Build Coastguard Worker 207*ec779b8eSAndroid Build Coastguard Worker // Map of resources (name) and number of concurrent instances 208*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, int> mConcurrentResourceCountMap; 209*ec779b8eSAndroid Build Coastguard Worker 210*ec779b8eSAndroid Build Coastguard Worker // Map of concurrent codecs by CodecBucket across the system. 211*ec779b8eSAndroid Build Coastguard Worker ConcurrentCodecsMap mConcurrentCodecsMap; 212*ec779b8eSAndroid Build Coastguard Worker // Map of concurrent and peak codecs by CodecBucket for each process/application. 213*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, ConcurrentCodecs> mProcessConcurrentCodecsMap; 214*ec779b8eSAndroid Build Coastguard Worker 215*ec779b8eSAndroid Build Coastguard Worker // Uid Observer to monitor the application termination. 216*ec779b8eSAndroid Build Coastguard Worker sp<UidObserver> mUidObserver; 217*ec779b8eSAndroid Build Coastguard Worker }; 218*ec779b8eSAndroid Build Coastguard Worker 219*ec779b8eSAndroid Build Coastguard Worker } // namespace android 220*ec779b8eSAndroid Build Coastguard Worker 221*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_MEDIA_RESOURCEMANAGERMETRICS_H_ 222