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 //#define LOG_NDEBUG 0
19*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "ResourceManagerMetrics"
20*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <mediautils/ProcessInfo.h>
22*ec779b8eSAndroid Build Coastguard Worker
23*ec779b8eSAndroid Build Coastguard Worker #include <stats_media_metrics.h>
24*ec779b8eSAndroid Build Coastguard Worker
25*ec779b8eSAndroid Build Coastguard Worker #include "UidObserver.h"
26*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerMetrics.h"
27*ec779b8eSAndroid Build Coastguard Worker
28*ec779b8eSAndroid Build Coastguard Worker #include <cmath>
29*ec779b8eSAndroid Build Coastguard Worker #include <sstream>
30*ec779b8eSAndroid Build Coastguard Worker
31*ec779b8eSAndroid Build Coastguard Worker namespace android {
32*ec779b8eSAndroid Build Coastguard Worker
33*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::stats_write;
34*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_STARTED;
35*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_STOPPED;
36*ec779b8eSAndroid Build Coastguard Worker // Disabling this for now.
37*ec779b8eSAndroid Build Coastguard Worker #ifdef ENABLE_MEDIA_CODEC_CONCURRENT_USAGE_REPORTED
38*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_CONCURRENT_USAGE_REPORTED;
39*ec779b8eSAndroid Build Coastguard Worker #endif
40*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RECLAIM_REQUEST_COMPLETED;
41*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RECLAIM_REQUEST_COMPLETED__RECLAIM_STATUS__RECLAIM_SUCCESS;
42*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::\
43*ec779b8eSAndroid Build Coastguard Worker MEDIA_CODEC_RECLAIM_REQUEST_COMPLETED__RECLAIM_STATUS__RECLAIM_FAILED_NO_CLIENTS;
44*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::\
45*ec779b8eSAndroid Build Coastguard Worker MEDIA_CODEC_RECLAIM_REQUEST_COMPLETED__RECLAIM_STATUS__RECLAIM_FAILED_RECLAIM_RESOURCES;
46*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_STARTED__CODEC_TYPE__CODEC_TYPE_UNSPECIFIED;
47*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_STARTED__CODEC_TYPE__CODEC_TYPE_AUDIO;
48*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_STARTED__CODEC_TYPE__CODEC_TYPE_VIDEO;
49*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_STARTED__CODEC_TYPE__CODEC_TYPE_IMAGE;
50*ec779b8eSAndroid Build Coastguard Worker
51*ec779b8eSAndroid Build Coastguard Worker // Map MediaResourceSubType to stats::media_metrics::CodecType
getMetricsCodecType(MediaResourceSubType codecType)52*ec779b8eSAndroid Build Coastguard Worker inline int32_t getMetricsCodecType(MediaResourceSubType codecType) {
53*ec779b8eSAndroid Build Coastguard Worker switch (codecType) {
54*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kHwAudioCodec:
55*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kSwAudioCodec:
56*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_STARTED__CODEC_TYPE__CODEC_TYPE_AUDIO;
57*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kHwVideoCodec:
58*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kSwVideoCodec:
59*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_STARTED__CODEC_TYPE__CODEC_TYPE_VIDEO;
60*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kHwImageCodec:
61*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kSwImageCodec:
62*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_STARTED__CODEC_TYPE__CODEC_TYPE_IMAGE;
63*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kUnspecifiedSubType:
64*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_STARTED__CODEC_TYPE__CODEC_TYPE_UNSPECIFIED;
65*ec779b8eSAndroid Build Coastguard Worker }
66*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_STARTED__CODEC_TYPE__CODEC_TYPE_UNSPECIFIED;
67*ec779b8eSAndroid Build Coastguard Worker }
68*ec779b8eSAndroid Build Coastguard Worker
getCodecType(MediaResourceSubType codecType)69*ec779b8eSAndroid Build Coastguard Worker inline const char* getCodecType(MediaResourceSubType codecType) {
70*ec779b8eSAndroid Build Coastguard Worker switch (codecType) {
71*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kHwAudioCodec: return "Hw Audio";
72*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kSwAudioCodec: return "Sw Audio";
73*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kHwVideoCodec: return "Hw Video";
74*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kSwVideoCodec: return "Sw Video";
75*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kHwImageCodec: return "Hw Image";
76*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kSwImageCodec: return "Sw Image";
77*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kUnspecifiedSubType:
78*ec779b8eSAndroid Build Coastguard Worker default:
79*ec779b8eSAndroid Build Coastguard Worker return "Unspecified";
80*ec779b8eSAndroid Build Coastguard Worker }
81*ec779b8eSAndroid Build Coastguard Worker return "Unspecified";
82*ec779b8eSAndroid Build Coastguard Worker }
83*ec779b8eSAndroid Build Coastguard Worker
isHardwareCodec(MediaResourceSubType codecType)84*ec779b8eSAndroid Build Coastguard Worker inline bool isHardwareCodec(MediaResourceSubType codecType) {
85*ec779b8eSAndroid Build Coastguard Worker return (codecType == MediaResourceSubType::kHwAudioCodec ||
86*ec779b8eSAndroid Build Coastguard Worker codecType == MediaResourceSubType::kHwVideoCodec ||
87*ec779b8eSAndroid Build Coastguard Worker codecType == MediaResourceSubType::kHwImageCodec);
88*ec779b8eSAndroid Build Coastguard Worker }
89*ec779b8eSAndroid Build Coastguard Worker
getCodecBucket(bool isEncoder,MediaResourceSubType codecType)90*ec779b8eSAndroid Build Coastguard Worker static CodecBucket getCodecBucket(bool isEncoder, MediaResourceSubType codecType) {
91*ec779b8eSAndroid Build Coastguard Worker switch (codecType) {
92*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kHwAudioCodec:
93*ec779b8eSAndroid Build Coastguard Worker return isEncoder? HwAudioEncoder : HwAudioDecoder;
94*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kSwAudioCodec:
95*ec779b8eSAndroid Build Coastguard Worker return isEncoder? SwAudioEncoder : SwAudioDecoder;
96*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kHwVideoCodec:
97*ec779b8eSAndroid Build Coastguard Worker return isEncoder? HwVideoEncoder : HwVideoDecoder;
98*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kSwVideoCodec:
99*ec779b8eSAndroid Build Coastguard Worker return isEncoder? SwVideoEncoder : SwVideoDecoder;
100*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kHwImageCodec:
101*ec779b8eSAndroid Build Coastguard Worker return isEncoder? HwImageEncoder : HwImageDecoder;
102*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kSwImageCodec:
103*ec779b8eSAndroid Build Coastguard Worker return isEncoder? SwImageEncoder : SwImageDecoder;
104*ec779b8eSAndroid Build Coastguard Worker case MediaResourceSubType::kUnspecifiedSubType:
105*ec779b8eSAndroid Build Coastguard Worker default:
106*ec779b8eSAndroid Build Coastguard Worker return CodecBucketUnspecified;
107*ec779b8eSAndroid Build Coastguard Worker }
108*ec779b8eSAndroid Build Coastguard Worker
109*ec779b8eSAndroid Build Coastguard Worker return CodecBucketUnspecified;
110*ec779b8eSAndroid Build Coastguard Worker }
111*ec779b8eSAndroid Build Coastguard Worker
getLogMessage(const std::string & firstKey,const long & firstValue,const std::string & secondKey,const long & secondValue)112*ec779b8eSAndroid Build Coastguard Worker static std::string getLogMessage(const std::string& firstKey, const long& firstValue,
113*ec779b8eSAndroid Build Coastguard Worker const std::string& secondKey, const long& secondValue) {
114*ec779b8eSAndroid Build Coastguard Worker
115*ec779b8eSAndroid Build Coastguard Worker std::stringstream logMsg;
116*ec779b8eSAndroid Build Coastguard Worker if (firstValue > 0) {
117*ec779b8eSAndroid Build Coastguard Worker logMsg << firstKey << firstValue;
118*ec779b8eSAndroid Build Coastguard Worker }
119*ec779b8eSAndroid Build Coastguard Worker if (secondValue > 0) {
120*ec779b8eSAndroid Build Coastguard Worker logMsg << secondKey << secondValue;
121*ec779b8eSAndroid Build Coastguard Worker }
122*ec779b8eSAndroid Build Coastguard Worker return logMsg.str();
123*ec779b8eSAndroid Build Coastguard Worker }
124*ec779b8eSAndroid Build Coastguard Worker
ResourceManagerMetrics(const sp<ProcessInfoInterface> & processInfo)125*ec779b8eSAndroid Build Coastguard Worker ResourceManagerMetrics::ResourceManagerMetrics(const sp<ProcessInfoInterface>& processInfo) {
126*ec779b8eSAndroid Build Coastguard Worker // Create a process termination watcher, with 5seconds of polling frequency.
127*ec779b8eSAndroid Build Coastguard Worker mUidObserver = sp<UidObserver>::make(processInfo,
128*ec779b8eSAndroid Build Coastguard Worker [this] (int32_t pid, uid_t uid) {
129*ec779b8eSAndroid Build Coastguard Worker onProcessTerminated(pid, uid);
130*ec779b8eSAndroid Build Coastguard Worker });
131*ec779b8eSAndroid Build Coastguard Worker mUidObserver->start();
132*ec779b8eSAndroid Build Coastguard Worker }
133*ec779b8eSAndroid Build Coastguard Worker
~ResourceManagerMetrics()134*ec779b8eSAndroid Build Coastguard Worker ResourceManagerMetrics::~ResourceManagerMetrics() {
135*ec779b8eSAndroid Build Coastguard Worker mUidObserver->stop();
136*ec779b8eSAndroid Build Coastguard Worker }
137*ec779b8eSAndroid Build Coastguard Worker
addPid(int pid,uid_t uid)138*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::addPid(int pid, uid_t uid) {
139*ec779b8eSAndroid Build Coastguard Worker if (uid != 0) {
140*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
141*ec779b8eSAndroid Build Coastguard Worker mUidObserver->add(pid, uid);
142*ec779b8eSAndroid Build Coastguard Worker }
143*ec779b8eSAndroid Build Coastguard Worker }
144*ec779b8eSAndroid Build Coastguard Worker
notifyClientCreated(const ClientInfoParcel & clientInfo)145*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::notifyClientCreated(const ClientInfoParcel& clientInfo) {
146*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
147*ec779b8eSAndroid Build Coastguard Worker // Update the resource instance count.
148*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, int>::iterator found = mConcurrentResourceCountMap.find(clientInfo.name);
149*ec779b8eSAndroid Build Coastguard Worker if (found == mConcurrentResourceCountMap.end()) {
150*ec779b8eSAndroid Build Coastguard Worker mConcurrentResourceCountMap[clientInfo.name] = 1;
151*ec779b8eSAndroid Build Coastguard Worker } else {
152*ec779b8eSAndroid Build Coastguard Worker found->second++;
153*ec779b8eSAndroid Build Coastguard Worker }
154*ec779b8eSAndroid Build Coastguard Worker }
155*ec779b8eSAndroid Build Coastguard Worker
notifyClientReleased(const ClientInfoParcel & clientInfo)156*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::notifyClientReleased(const ClientInfoParcel& clientInfo) {
157*ec779b8eSAndroid Build Coastguard Worker bool stopCalled = true;
158*ec779b8eSAndroid Build Coastguard Worker ClientConfigParcel clientConfig;
159*ec779b8eSAndroid Build Coastguard Worker {
160*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
161*ec779b8eSAndroid Build Coastguard Worker ClientConfigMap::iterator found = mClientConfigMap.find(clientInfo.id);
162*ec779b8eSAndroid Build Coastguard Worker if (found != mClientConfigMap.end()) {
163*ec779b8eSAndroid Build Coastguard Worker // Release is called without Stop!
164*ec779b8eSAndroid Build Coastguard Worker stopCalled = false;
165*ec779b8eSAndroid Build Coastguard Worker clientConfig = found->second;
166*ec779b8eSAndroid Build Coastguard Worker // Update the timestamp for stopping the codec.
167*ec779b8eSAndroid Build Coastguard Worker clientConfig.timeStamp = systemTime(SYSTEM_TIME_MONOTONIC) / 1000LL;
168*ec779b8eSAndroid Build Coastguard Worker }
169*ec779b8eSAndroid Build Coastguard Worker }
170*ec779b8eSAndroid Build Coastguard Worker if (!stopCalled) {
171*ec779b8eSAndroid Build Coastguard Worker // call Stop to update the metrics.
172*ec779b8eSAndroid Build Coastguard Worker notifyClientStopped(clientConfig);
173*ec779b8eSAndroid Build Coastguard Worker }
174*ec779b8eSAndroid Build Coastguard Worker {
175*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
176*ec779b8eSAndroid Build Coastguard Worker // Update the resource instance count also.
177*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, int>::iterator found =
178*ec779b8eSAndroid Build Coastguard Worker mConcurrentResourceCountMap.find(clientInfo.name);
179*ec779b8eSAndroid Build Coastguard Worker if (found != mConcurrentResourceCountMap.end()) {
180*ec779b8eSAndroid Build Coastguard Worker if (found->second > 0) {
181*ec779b8eSAndroid Build Coastguard Worker found->second--;
182*ec779b8eSAndroid Build Coastguard Worker }
183*ec779b8eSAndroid Build Coastguard Worker }
184*ec779b8eSAndroid Build Coastguard Worker }
185*ec779b8eSAndroid Build Coastguard Worker }
186*ec779b8eSAndroid Build Coastguard Worker
notifyClientConfigChanged(const ClientConfigParcel & clientConfig)187*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::notifyClientConfigChanged(const ClientConfigParcel& clientConfig) {
188*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
189*ec779b8eSAndroid Build Coastguard Worker ClientConfigMap::iterator entry = mClientConfigMap.find(clientConfig.clientInfo.id);
190*ec779b8eSAndroid Build Coastguard Worker if (entry != mClientConfigMap.end() &&
191*ec779b8eSAndroid Build Coastguard Worker (clientConfig.codecType == MediaResourceSubType::kHwVideoCodec ||
192*ec779b8eSAndroid Build Coastguard Worker clientConfig.codecType == MediaResourceSubType::kSwVideoCodec ||
193*ec779b8eSAndroid Build Coastguard Worker clientConfig.codecType == MediaResourceSubType::kHwImageCodec ||
194*ec779b8eSAndroid Build Coastguard Worker clientConfig.codecType == MediaResourceSubType::kSwImageCodec)) {
195*ec779b8eSAndroid Build Coastguard Worker int pid = clientConfig.clientInfo.pid;
196*ec779b8eSAndroid Build Coastguard Worker // Update the pixel count for this process
197*ec779b8eSAndroid Build Coastguard Worker updatePixelCount(pid, clientConfig.width * (long)clientConfig.height,
198*ec779b8eSAndroid Build Coastguard Worker entry->second.width * (long)entry->second.height);
199*ec779b8eSAndroid Build Coastguard Worker // Update the resolution in the record.
200*ec779b8eSAndroid Build Coastguard Worker entry->second.width = clientConfig.width;
201*ec779b8eSAndroid Build Coastguard Worker entry->second.height = clientConfig.height;
202*ec779b8eSAndroid Build Coastguard Worker }
203*ec779b8eSAndroid Build Coastguard Worker }
204*ec779b8eSAndroid Build Coastguard Worker
notifyClientStarted(const ClientConfigParcel & clientConfig)205*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::notifyClientStarted(const ClientConfigParcel& clientConfig) {
206*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
207*ec779b8eSAndroid Build Coastguard Worker int pid = clientConfig.clientInfo.pid;
208*ec779b8eSAndroid Build Coastguard Worker // We need to observer this process.
209*ec779b8eSAndroid Build Coastguard Worker mUidObserver->add(pid, clientConfig.clientInfo.uid);
210*ec779b8eSAndroid Build Coastguard Worker
211*ec779b8eSAndroid Build Coastguard Worker // Update the client config for thic client.
212*ec779b8eSAndroid Build Coastguard Worker mClientConfigMap[clientConfig.clientInfo.id] = clientConfig;
213*ec779b8eSAndroid Build Coastguard Worker
214*ec779b8eSAndroid Build Coastguard Worker // Update the concurrent codec count for this process.
215*ec779b8eSAndroid Build Coastguard Worker CodecBucket codecBucket = getCodecBucket(clientConfig.isEncoder, clientConfig.codecType);
216*ec779b8eSAndroid Build Coastguard Worker increaseConcurrentCodecs(pid, codecBucket);
217*ec779b8eSAndroid Build Coastguard Worker
218*ec779b8eSAndroid Build Coastguard Worker if (clientConfig.codecType == MediaResourceSubType::kHwVideoCodec ||
219*ec779b8eSAndroid Build Coastguard Worker clientConfig.codecType == MediaResourceSubType::kSwVideoCodec ||
220*ec779b8eSAndroid Build Coastguard Worker clientConfig.codecType == MediaResourceSubType::kHwImageCodec ||
221*ec779b8eSAndroid Build Coastguard Worker clientConfig.codecType == MediaResourceSubType::kSwImageCodec) {
222*ec779b8eSAndroid Build Coastguard Worker // Update the pixel count for this process
223*ec779b8eSAndroid Build Coastguard Worker increasePixelCount(pid, clientConfig.width * (long)clientConfig.height);
224*ec779b8eSAndroid Build Coastguard Worker }
225*ec779b8eSAndroid Build Coastguard Worker
226*ec779b8eSAndroid Build Coastguard Worker // System concurrent codec usage
227*ec779b8eSAndroid Build Coastguard Worker int systemConcurrentCodecs = mConcurrentCodecsMap[codecBucket];
228*ec779b8eSAndroid Build Coastguard Worker // Process/Application concurrent codec usage for this type of codec
229*ec779b8eSAndroid Build Coastguard Worker const ConcurrentCodecs& concurrentCodecs = mProcessConcurrentCodecsMap[pid];
230*ec779b8eSAndroid Build Coastguard Worker int appConcurrentCodecs = concurrentCodecs.mCurrent[codecBucket];
231*ec779b8eSAndroid Build Coastguard Worker int hwVideoCodecs = concurrentCodecs.mHWVideoCodecs;
232*ec779b8eSAndroid Build Coastguard Worker int swVideoCodecs = concurrentCodecs.mSWVideoCodecs;
233*ec779b8eSAndroid Build Coastguard Worker int videoCodecs = concurrentCodecs.mVideoCodecs;
234*ec779b8eSAndroid Build Coastguard Worker int audioCodecs = concurrentCodecs.mAudioCodecs;
235*ec779b8eSAndroid Build Coastguard Worker int imageCodecs = concurrentCodecs.mImageCodecs;
236*ec779b8eSAndroid Build Coastguard Worker // Process/Application's current pixel count.
237*ec779b8eSAndroid Build Coastguard Worker long pixelCount = 0;
238*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, PixelCount>::iterator it = mProcessPixelsMap.find(pid);
239*ec779b8eSAndroid Build Coastguard Worker if (it != mProcessPixelsMap.end()) {
240*ec779b8eSAndroid Build Coastguard Worker pixelCount = it->second.mCurrent;
241*ec779b8eSAndroid Build Coastguard Worker }
242*ec779b8eSAndroid Build Coastguard Worker
243*ec779b8eSAndroid Build Coastguard Worker int result = stats_write(
244*ec779b8eSAndroid Build Coastguard Worker MEDIA_CODEC_STARTED,
245*ec779b8eSAndroid Build Coastguard Worker clientConfig.clientInfo.uid,
246*ec779b8eSAndroid Build Coastguard Worker clientConfig.id,
247*ec779b8eSAndroid Build Coastguard Worker clientConfig.clientInfo.name.c_str(),
248*ec779b8eSAndroid Build Coastguard Worker getMetricsCodecType(clientConfig.codecType),
249*ec779b8eSAndroid Build Coastguard Worker clientConfig.isEncoder,
250*ec779b8eSAndroid Build Coastguard Worker isHardwareCodec(clientConfig.codecType),
251*ec779b8eSAndroid Build Coastguard Worker clientConfig.width, clientConfig.height,
252*ec779b8eSAndroid Build Coastguard Worker systemConcurrentCodecs,
253*ec779b8eSAndroid Build Coastguard Worker appConcurrentCodecs,
254*ec779b8eSAndroid Build Coastguard Worker pixelCount,
255*ec779b8eSAndroid Build Coastguard Worker hwVideoCodecs,
256*ec779b8eSAndroid Build Coastguard Worker swVideoCodecs,
257*ec779b8eSAndroid Build Coastguard Worker videoCodecs,
258*ec779b8eSAndroid Build Coastguard Worker audioCodecs,
259*ec779b8eSAndroid Build Coastguard Worker imageCodecs);
260*ec779b8eSAndroid Build Coastguard Worker
261*ec779b8eSAndroid Build Coastguard Worker ALOGV("%s: Pushed MEDIA_CODEC_STARTED atom: "
262*ec779b8eSAndroid Build Coastguard Worker "Process[pid(%d): uid(%d)] "
263*ec779b8eSAndroid Build Coastguard Worker "Codec: [%s: %ju] is %s %s "
264*ec779b8eSAndroid Build Coastguard Worker "Timestamp: %jd "
265*ec779b8eSAndroid Build Coastguard Worker "Resolution: %d x %d "
266*ec779b8eSAndroid Build Coastguard Worker "ConcurrentCodec[%d]={System: %d App: %d} "
267*ec779b8eSAndroid Build Coastguard Worker "AppConcurrentCodecs{Video: %d(HW[%d] SW[%d]) Audio: %d Image: %d} "
268*ec779b8eSAndroid Build Coastguard Worker "result: %d",
269*ec779b8eSAndroid Build Coastguard Worker __func__,
270*ec779b8eSAndroid Build Coastguard Worker pid, clientConfig.clientInfo.uid,
271*ec779b8eSAndroid Build Coastguard Worker clientConfig.clientInfo.name.c_str(),
272*ec779b8eSAndroid Build Coastguard Worker clientConfig.id,
273*ec779b8eSAndroid Build Coastguard Worker getCodecType(clientConfig.codecType),
274*ec779b8eSAndroid Build Coastguard Worker clientConfig.isEncoder? "encoder" : "decoder",
275*ec779b8eSAndroid Build Coastguard Worker clientConfig.timeStamp,
276*ec779b8eSAndroid Build Coastguard Worker clientConfig.width, clientConfig.height,
277*ec779b8eSAndroid Build Coastguard Worker codecBucket, systemConcurrentCodecs, appConcurrentCodecs,
278*ec779b8eSAndroid Build Coastguard Worker videoCodecs, hwVideoCodecs, swVideoCodecs, audioCodecs, imageCodecs,
279*ec779b8eSAndroid Build Coastguard Worker result);
280*ec779b8eSAndroid Build Coastguard Worker }
281*ec779b8eSAndroid Build Coastguard Worker
notifyClientStopped(const ClientConfigParcel & clientConfig)282*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::notifyClientStopped(const ClientConfigParcel& clientConfig) {
283*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
284*ec779b8eSAndroid Build Coastguard Worker int pid = clientConfig.clientInfo.pid;
285*ec779b8eSAndroid Build Coastguard Worker // Update the concurrent codec count for this process.
286*ec779b8eSAndroid Build Coastguard Worker CodecBucket codecBucket = getCodecBucket(clientConfig.isEncoder, clientConfig.codecType);
287*ec779b8eSAndroid Build Coastguard Worker decreaseConcurrentCodecs(pid, codecBucket);
288*ec779b8eSAndroid Build Coastguard Worker
289*ec779b8eSAndroid Build Coastguard Worker if (clientConfig.codecType == MediaResourceSubType::kHwVideoCodec ||
290*ec779b8eSAndroid Build Coastguard Worker clientConfig.codecType == MediaResourceSubType::kSwVideoCodec ||
291*ec779b8eSAndroid Build Coastguard Worker clientConfig.codecType == MediaResourceSubType::kHwImageCodec ||
292*ec779b8eSAndroid Build Coastguard Worker clientConfig.codecType == MediaResourceSubType::kSwImageCodec) {
293*ec779b8eSAndroid Build Coastguard Worker // Update the pixel count for this process
294*ec779b8eSAndroid Build Coastguard Worker decreasePixelCount(pid, clientConfig.width * (long)clientConfig.height);
295*ec779b8eSAndroid Build Coastguard Worker }
296*ec779b8eSAndroid Build Coastguard Worker
297*ec779b8eSAndroid Build Coastguard Worker // System concurrent codec usage
298*ec779b8eSAndroid Build Coastguard Worker int systemConcurrentCodecs = mConcurrentCodecsMap[codecBucket];
299*ec779b8eSAndroid Build Coastguard Worker // Process/Application concurrent codec usage for this type of codec
300*ec779b8eSAndroid Build Coastguard Worker int appConcurrentCodecs = 0;
301*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, ConcurrentCodecs>::iterator found = mProcessConcurrentCodecsMap.find(pid);
302*ec779b8eSAndroid Build Coastguard Worker if (found != mProcessConcurrentCodecsMap.end()) {
303*ec779b8eSAndroid Build Coastguard Worker appConcurrentCodecs = found->second.mCurrent[codecBucket];
304*ec779b8eSAndroid Build Coastguard Worker }
305*ec779b8eSAndroid Build Coastguard Worker // Process/Application's current pixel count.
306*ec779b8eSAndroid Build Coastguard Worker long pixelCount = 0;
307*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, PixelCount>::iterator it = mProcessPixelsMap.find(pid);
308*ec779b8eSAndroid Build Coastguard Worker if (it != mProcessPixelsMap.end()) {
309*ec779b8eSAndroid Build Coastguard Worker pixelCount = it->second.mCurrent;
310*ec779b8eSAndroid Build Coastguard Worker }
311*ec779b8eSAndroid Build Coastguard Worker
312*ec779b8eSAndroid Build Coastguard Worker // calculate the usageTime as:
313*ec779b8eSAndroid Build Coastguard Worker // MediaCodecStopped.clientConfig.timeStamp -
314*ec779b8eSAndroid Build Coastguard Worker // MediaCodecStarted.clientConfig.timeStamp
315*ec779b8eSAndroid Build Coastguard Worker int64_t usageTime = 0;
316*ec779b8eSAndroid Build Coastguard Worker ClientConfigMap::iterator entry = mClientConfigMap.find(clientConfig.clientInfo.id);
317*ec779b8eSAndroid Build Coastguard Worker if (entry != mClientConfigMap.end()) {
318*ec779b8eSAndroid Build Coastguard Worker usageTime = clientConfig.timeStamp - entry->second.timeStamp;
319*ec779b8eSAndroid Build Coastguard Worker // And we can erase this config now.
320*ec779b8eSAndroid Build Coastguard Worker mClientConfigMap.erase(entry);
321*ec779b8eSAndroid Build Coastguard Worker } else {
322*ec779b8eSAndroid Build Coastguard Worker ALOGW("%s: Start Config is missing!", __func__);
323*ec779b8eSAndroid Build Coastguard Worker }
324*ec779b8eSAndroid Build Coastguard Worker
325*ec779b8eSAndroid Build Coastguard Worker int result = stats_write(
326*ec779b8eSAndroid Build Coastguard Worker MEDIA_CODEC_STOPPED,
327*ec779b8eSAndroid Build Coastguard Worker clientConfig.clientInfo.uid,
328*ec779b8eSAndroid Build Coastguard Worker clientConfig.id,
329*ec779b8eSAndroid Build Coastguard Worker clientConfig.clientInfo.name.c_str(),
330*ec779b8eSAndroid Build Coastguard Worker getMetricsCodecType(clientConfig.codecType),
331*ec779b8eSAndroid Build Coastguard Worker clientConfig.isEncoder,
332*ec779b8eSAndroid Build Coastguard Worker isHardwareCodec(clientConfig.codecType),
333*ec779b8eSAndroid Build Coastguard Worker clientConfig.width, clientConfig.height,
334*ec779b8eSAndroid Build Coastguard Worker systemConcurrentCodecs,
335*ec779b8eSAndroid Build Coastguard Worker appConcurrentCodecs,
336*ec779b8eSAndroid Build Coastguard Worker pixelCount,
337*ec779b8eSAndroid Build Coastguard Worker usageTime);
338*ec779b8eSAndroid Build Coastguard Worker ALOGV("%s: Pushed MEDIA_CODEC_STOPPED atom: "
339*ec779b8eSAndroid Build Coastguard Worker "Process[pid(%d): uid(%d)] "
340*ec779b8eSAndroid Build Coastguard Worker "Codec: [%s: %ju] is %s %s "
341*ec779b8eSAndroid Build Coastguard Worker "Timestamp: %jd Usage time: %jd "
342*ec779b8eSAndroid Build Coastguard Worker "Resolution: %d x %d "
343*ec779b8eSAndroid Build Coastguard Worker "ConcurrentCodec[%d]={System: %d App: %d} "
344*ec779b8eSAndroid Build Coastguard Worker "result: %d",
345*ec779b8eSAndroid Build Coastguard Worker __func__,
346*ec779b8eSAndroid Build Coastguard Worker pid, clientConfig.clientInfo.uid,
347*ec779b8eSAndroid Build Coastguard Worker clientConfig.clientInfo.name.c_str(),
348*ec779b8eSAndroid Build Coastguard Worker clientConfig.id,
349*ec779b8eSAndroid Build Coastguard Worker getCodecType(clientConfig.codecType),
350*ec779b8eSAndroid Build Coastguard Worker clientConfig.isEncoder? "encoder" : "decoder",
351*ec779b8eSAndroid Build Coastguard Worker clientConfig.timeStamp, usageTime,
352*ec779b8eSAndroid Build Coastguard Worker clientConfig.width, clientConfig.height,
353*ec779b8eSAndroid Build Coastguard Worker codecBucket, systemConcurrentCodecs, appConcurrentCodecs,
354*ec779b8eSAndroid Build Coastguard Worker result);
355*ec779b8eSAndroid Build Coastguard Worker }
356*ec779b8eSAndroid Build Coastguard Worker
onProcessTerminated(int32_t pid,uid_t uid)357*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::onProcessTerminated(int32_t pid, uid_t uid) {
358*ec779b8eSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
359*ec779b8eSAndroid Build Coastguard Worker // post MediaCodecConcurrentUsageReported for this terminated pid.
360*ec779b8eSAndroid Build Coastguard Worker pushConcurrentUsageReport(pid, uid);
361*ec779b8eSAndroid Build Coastguard Worker // Remove all the metrics associated with this process.
362*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, ConcurrentCodecs>::iterator it1 = mProcessConcurrentCodecsMap.find(pid);
363*ec779b8eSAndroid Build Coastguard Worker if (it1 != mProcessConcurrentCodecsMap.end()) {
364*ec779b8eSAndroid Build Coastguard Worker mProcessConcurrentCodecsMap.erase(it1);
365*ec779b8eSAndroid Build Coastguard Worker }
366*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, PixelCount>::iterator it2 = mProcessPixelsMap.find(pid);
367*ec779b8eSAndroid Build Coastguard Worker if (it2 != mProcessPixelsMap.end()) {
368*ec779b8eSAndroid Build Coastguard Worker mProcessPixelsMap.erase(it2);
369*ec779b8eSAndroid Build Coastguard Worker }
370*ec779b8eSAndroid Build Coastguard Worker }
371*ec779b8eSAndroid Build Coastguard Worker
pushConcurrentUsageReport(int32_t pid,uid_t uid)372*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::pushConcurrentUsageReport(int32_t pid, uid_t uid) {
373*ec779b8eSAndroid Build Coastguard Worker // Process/Application peak concurrent codec usage
374*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, ConcurrentCodecs>::iterator found = mProcessConcurrentCodecsMap.find(pid);
375*ec779b8eSAndroid Build Coastguard Worker if (found == mProcessConcurrentCodecsMap.end()) {
376*ec779b8eSAndroid Build Coastguard Worker ALOGI("%s: No MEDIA_CODEC_CONCURRENT_USAGE_REPORTED atom Entry for: "
377*ec779b8eSAndroid Build Coastguard Worker "Application[pid(%d): uid(%d)]", __func__, pid, uid);
378*ec779b8eSAndroid Build Coastguard Worker return;
379*ec779b8eSAndroid Build Coastguard Worker }
380*ec779b8eSAndroid Build Coastguard Worker const ConcurrentCodecsMap& codecsMap = found->second.mPeak;
381*ec779b8eSAndroid Build Coastguard Worker int peakHwAudioEncoderCount = codecsMap[HwAudioEncoder];
382*ec779b8eSAndroid Build Coastguard Worker int peakHwAudioDecoderCount = codecsMap[HwAudioDecoder];
383*ec779b8eSAndroid Build Coastguard Worker int peakHwVideoEncoderCount = codecsMap[HwVideoEncoder];
384*ec779b8eSAndroid Build Coastguard Worker int peakHwVideoDecoderCount = codecsMap[HwVideoDecoder];
385*ec779b8eSAndroid Build Coastguard Worker int peakHwImageEncoderCount = codecsMap[HwImageEncoder];
386*ec779b8eSAndroid Build Coastguard Worker int peakHwImageDecoderCount = codecsMap[HwImageDecoder];
387*ec779b8eSAndroid Build Coastguard Worker int peakSwAudioEncoderCount = codecsMap[SwAudioEncoder];
388*ec779b8eSAndroid Build Coastguard Worker int peakSwAudioDecoderCount = codecsMap[SwAudioDecoder];
389*ec779b8eSAndroid Build Coastguard Worker int peakSwVideoEncoderCount = codecsMap[SwVideoEncoder];
390*ec779b8eSAndroid Build Coastguard Worker int peakSwVideoDecoderCount = codecsMap[SwVideoDecoder];
391*ec779b8eSAndroid Build Coastguard Worker int peakSwImageEncoderCount = codecsMap[SwImageEncoder];
392*ec779b8eSAndroid Build Coastguard Worker int peakSwImageDecoderCount = codecsMap[SwImageDecoder];
393*ec779b8eSAndroid Build Coastguard Worker
394*ec779b8eSAndroid Build Coastguard Worker long peakPixels = 0;
395*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, PixelCount>::iterator it = mProcessPixelsMap.find(pid);
396*ec779b8eSAndroid Build Coastguard Worker if (it == mProcessPixelsMap.end()) {
397*ec779b8eSAndroid Build Coastguard Worker ALOGI("%s: No Video Codec Entry for Application[pid(%d): uid(%d)]",
398*ec779b8eSAndroid Build Coastguard Worker __func__, pid, uid);
399*ec779b8eSAndroid Build Coastguard Worker } else {
400*ec779b8eSAndroid Build Coastguard Worker peakPixels = it->second.mPeak;
401*ec779b8eSAndroid Build Coastguard Worker }
402*ec779b8eSAndroid Build Coastguard Worker std::string peakPixelsLog("Peak Pixels: " + std::to_string(peakPixels));
403*ec779b8eSAndroid Build Coastguard Worker
404*ec779b8eSAndroid Build Coastguard Worker std::stringstream peakCodecLog;
405*ec779b8eSAndroid Build Coastguard Worker peakCodecLog << "Peak { ";
406*ec779b8eSAndroid Build Coastguard Worker std::string logMsg;
407*ec779b8eSAndroid Build Coastguard Worker logMsg = getLogMessage(" HW: ", peakHwAudioEncoderCount, " SW: ", peakSwAudioEncoderCount);
408*ec779b8eSAndroid Build Coastguard Worker if (!logMsg.empty()) {
409*ec779b8eSAndroid Build Coastguard Worker peakCodecLog << "AudioEnc[ " << logMsg << " ] ";
410*ec779b8eSAndroid Build Coastguard Worker }
411*ec779b8eSAndroid Build Coastguard Worker logMsg = getLogMessage(" HW: ", peakHwAudioDecoderCount, " SW: ", peakSwAudioDecoderCount);
412*ec779b8eSAndroid Build Coastguard Worker if (!logMsg.empty()) {
413*ec779b8eSAndroid Build Coastguard Worker peakCodecLog << "AudioDec[" << logMsg << " ] ";
414*ec779b8eSAndroid Build Coastguard Worker }
415*ec779b8eSAndroid Build Coastguard Worker logMsg = getLogMessage(" HW: ", peakHwVideoEncoderCount, " SW: ", peakSwVideoEncoderCount);
416*ec779b8eSAndroid Build Coastguard Worker if (!logMsg.empty()) {
417*ec779b8eSAndroid Build Coastguard Worker peakCodecLog << "VideoEnc[" << logMsg << " ] ";
418*ec779b8eSAndroid Build Coastguard Worker }
419*ec779b8eSAndroid Build Coastguard Worker logMsg = getLogMessage(" HW: ", peakHwVideoDecoderCount, " SW: ", peakSwVideoDecoderCount);
420*ec779b8eSAndroid Build Coastguard Worker if (!logMsg.empty()) {
421*ec779b8eSAndroid Build Coastguard Worker peakCodecLog << "VideoDec[" << logMsg << " ] ";
422*ec779b8eSAndroid Build Coastguard Worker }
423*ec779b8eSAndroid Build Coastguard Worker logMsg = getLogMessage(" HW: ", peakHwImageEncoderCount, " SW: ", peakSwImageEncoderCount);
424*ec779b8eSAndroid Build Coastguard Worker if (!logMsg.empty()) {
425*ec779b8eSAndroid Build Coastguard Worker peakCodecLog << "ImageEnc[" << logMsg << " ] ";
426*ec779b8eSAndroid Build Coastguard Worker }
427*ec779b8eSAndroid Build Coastguard Worker logMsg = getLogMessage(" HW: ", peakHwImageDecoderCount, " SW: ", peakSwImageDecoderCount);
428*ec779b8eSAndroid Build Coastguard Worker if (!logMsg.empty()) {
429*ec779b8eSAndroid Build Coastguard Worker peakCodecLog << "ImageDec[" << logMsg << " ] ";
430*ec779b8eSAndroid Build Coastguard Worker }
431*ec779b8eSAndroid Build Coastguard Worker peakCodecLog << "}";
432*ec779b8eSAndroid Build Coastguard Worker
433*ec779b8eSAndroid Build Coastguard Worker #ifdef ENABLE_MEDIA_CODEC_CONCURRENT_USAGE_REPORTED
434*ec779b8eSAndroid Build Coastguard Worker int result = stats_write(
435*ec779b8eSAndroid Build Coastguard Worker MEDIA_CODEC_CONCURRENT_USAGE_REPORTED,
436*ec779b8eSAndroid Build Coastguard Worker uid,
437*ec779b8eSAndroid Build Coastguard Worker peakHwVideoDecoderCount,
438*ec779b8eSAndroid Build Coastguard Worker peakHwVideoEncoderCount,
439*ec779b8eSAndroid Build Coastguard Worker peakSwVideoDecoderCount,
440*ec779b8eSAndroid Build Coastguard Worker peakSwVideoEncoderCount,
441*ec779b8eSAndroid Build Coastguard Worker peakHwAudioDecoderCount,
442*ec779b8eSAndroid Build Coastguard Worker peakHwAudioEncoderCount,
443*ec779b8eSAndroid Build Coastguard Worker peakSwAudioDecoderCount,
444*ec779b8eSAndroid Build Coastguard Worker peakSwAudioEncoderCount,
445*ec779b8eSAndroid Build Coastguard Worker peakHwImageDecoderCount,
446*ec779b8eSAndroid Build Coastguard Worker peakHwImageEncoderCount,
447*ec779b8eSAndroid Build Coastguard Worker peakSwImageDecoderCount,
448*ec779b8eSAndroid Build Coastguard Worker peakSwImageEncoderCount,
449*ec779b8eSAndroid Build Coastguard Worker peakPixels);
450*ec779b8eSAndroid Build Coastguard Worker ALOGI("%s: Pushed MEDIA_CODEC_CONCURRENT_USAGE_REPORTED atom: "
451*ec779b8eSAndroid Build Coastguard Worker "Process[pid(%d): uid(%d)] %s %s result: %d",
452*ec779b8eSAndroid Build Coastguard Worker __func__, pid, uid, peakCodecLog.str().c_str(), peakPixelsLog.c_str(), result);
453*ec779b8eSAndroid Build Coastguard Worker #else
454*ec779b8eSAndroid Build Coastguard Worker ALOGI("%s: Concurrent Codec Usage Report for the Process[pid(%d): uid(%d)] is %s %s",
455*ec779b8eSAndroid Build Coastguard Worker __func__, pid, uid, peakCodecLog.str().c_str(), peakPixelsLog.c_str());
456*ec779b8eSAndroid Build Coastguard Worker #endif
457*ec779b8eSAndroid Build Coastguard Worker }
458*ec779b8eSAndroid Build Coastguard Worker
pushReclaimStats(int32_t callingPid,int32_t requesterUid,int requesterPriority,const std::string & clientName,int32_t noOfConcurrentCodecs,int32_t reclaimStatus,int32_t noOfCodecsReclaimed=0,int32_t targetIndex=-1,int32_t targetClientPid=-1,int32_t targetClientUid=-1,int32_t targetPriority=-1)459*ec779b8eSAndroid Build Coastguard Worker inline void pushReclaimStats(int32_t callingPid,
460*ec779b8eSAndroid Build Coastguard Worker int32_t requesterUid,
461*ec779b8eSAndroid Build Coastguard Worker int requesterPriority,
462*ec779b8eSAndroid Build Coastguard Worker const std::string& clientName,
463*ec779b8eSAndroid Build Coastguard Worker int32_t noOfConcurrentCodecs,
464*ec779b8eSAndroid Build Coastguard Worker int32_t reclaimStatus,
465*ec779b8eSAndroid Build Coastguard Worker int32_t noOfCodecsReclaimed = 0,
466*ec779b8eSAndroid Build Coastguard Worker int32_t targetIndex = -1,
467*ec779b8eSAndroid Build Coastguard Worker int32_t targetClientPid = -1,
468*ec779b8eSAndroid Build Coastguard Worker int32_t targetClientUid = -1,
469*ec779b8eSAndroid Build Coastguard Worker int32_t targetPriority = -1) {
470*ec779b8eSAndroid Build Coastguard Worker // Post the pushed atom
471*ec779b8eSAndroid Build Coastguard Worker int result = stats_write(
472*ec779b8eSAndroid Build Coastguard Worker MEDIA_CODEC_RECLAIM_REQUEST_COMPLETED,
473*ec779b8eSAndroid Build Coastguard Worker requesterUid,
474*ec779b8eSAndroid Build Coastguard Worker requesterPriority,
475*ec779b8eSAndroid Build Coastguard Worker clientName.c_str(),
476*ec779b8eSAndroid Build Coastguard Worker noOfConcurrentCodecs,
477*ec779b8eSAndroid Build Coastguard Worker reclaimStatus,
478*ec779b8eSAndroid Build Coastguard Worker noOfCodecsReclaimed,
479*ec779b8eSAndroid Build Coastguard Worker targetIndex,
480*ec779b8eSAndroid Build Coastguard Worker targetClientUid,
481*ec779b8eSAndroid Build Coastguard Worker targetPriority);
482*ec779b8eSAndroid Build Coastguard Worker ALOGI("%s: Pushed MEDIA_CODEC_RECLAIM_REQUEST_COMPLETED atom: "
483*ec779b8eSAndroid Build Coastguard Worker "Requester[pid(%d): uid(%d): priority(%d)] "
484*ec779b8eSAndroid Build Coastguard Worker "Codec: [%s] "
485*ec779b8eSAndroid Build Coastguard Worker "No of concurrent codecs: %d "
486*ec779b8eSAndroid Build Coastguard Worker "Reclaim Status: %d "
487*ec779b8eSAndroid Build Coastguard Worker "No of codecs reclaimed: %d "
488*ec779b8eSAndroid Build Coastguard Worker "Target[%d][pid(%d): uid(%d): priority(%d)] result: %d",
489*ec779b8eSAndroid Build Coastguard Worker __func__, callingPid, requesterUid, requesterPriority,
490*ec779b8eSAndroid Build Coastguard Worker clientName.c_str(), noOfConcurrentCodecs,
491*ec779b8eSAndroid Build Coastguard Worker reclaimStatus, noOfCodecsReclaimed,
492*ec779b8eSAndroid Build Coastguard Worker targetIndex, targetClientPid, targetClientUid, targetPriority, result);
493*ec779b8eSAndroid Build Coastguard Worker }
494*ec779b8eSAndroid Build Coastguard Worker
pushReclaimAtom(const ClientInfoParcel & clientInfo,const std::vector<int> & priorities,const std::vector<ClientInfo> & targetClients,bool reclaimed)495*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::pushReclaimAtom(const ClientInfoParcel& clientInfo,
496*ec779b8eSAndroid Build Coastguard Worker const std::vector<int>& priorities,
497*ec779b8eSAndroid Build Coastguard Worker const std::vector<ClientInfo>& targetClients,
498*ec779b8eSAndroid Build Coastguard Worker bool reclaimed) {
499*ec779b8eSAndroid Build Coastguard Worker // Construct the metrics for codec reclaim as a pushed atom.
500*ec779b8eSAndroid Build Coastguard Worker // 1. Information about the requester.
501*ec779b8eSAndroid Build Coastguard Worker // - UID and the priority (oom score)
502*ec779b8eSAndroid Build Coastguard Worker int32_t callingPid = clientInfo.pid;
503*ec779b8eSAndroid Build Coastguard Worker int32_t requesterUid = clientInfo.uid;
504*ec779b8eSAndroid Build Coastguard Worker std::string clientName = clientInfo.name;
505*ec779b8eSAndroid Build Coastguard Worker int requesterPriority = priorities[0];
506*ec779b8eSAndroid Build Coastguard Worker
507*ec779b8eSAndroid Build Coastguard Worker // 2. Information about the codec.
508*ec779b8eSAndroid Build Coastguard Worker // - Name of the codec requested
509*ec779b8eSAndroid Build Coastguard Worker // - Number of concurrent codecs running.
510*ec779b8eSAndroid Build Coastguard Worker int32_t noOfConcurrentCodecs = 0;
511*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, int>::iterator found = mConcurrentResourceCountMap.find(clientName);
512*ec779b8eSAndroid Build Coastguard Worker if (found != mConcurrentResourceCountMap.end()) {
513*ec779b8eSAndroid Build Coastguard Worker noOfConcurrentCodecs = found->second;
514*ec779b8eSAndroid Build Coastguard Worker }
515*ec779b8eSAndroid Build Coastguard Worker
516*ec779b8eSAndroid Build Coastguard Worker // 3. Information about the Reclaim:
517*ec779b8eSAndroid Build Coastguard Worker // - Status of reclaim request
518*ec779b8eSAndroid Build Coastguard Worker // - How many codecs are reclaimed
519*ec779b8eSAndroid Build Coastguard Worker // - For each codecs reclaimed, information of the process that it belonged to:
520*ec779b8eSAndroid Build Coastguard Worker // - UID and the Priority (oom score)
521*ec779b8eSAndroid Build Coastguard Worker int32_t reclaimStatus = MEDIA_CODEC_RECLAIM_REQUEST_COMPLETED__RECLAIM_STATUS__RECLAIM_SUCCESS;
522*ec779b8eSAndroid Build Coastguard Worker if (!reclaimed) {
523*ec779b8eSAndroid Build Coastguard Worker if (targetClients.size() == 0) {
524*ec779b8eSAndroid Build Coastguard Worker // No clients to reclaim from
525*ec779b8eSAndroid Build Coastguard Worker reclaimStatus =
526*ec779b8eSAndroid Build Coastguard Worker MEDIA_CODEC_RECLAIM_REQUEST_COMPLETED__RECLAIM_STATUS__RECLAIM_FAILED_NO_CLIENTS;
527*ec779b8eSAndroid Build Coastguard Worker } else {
528*ec779b8eSAndroid Build Coastguard Worker // Couldn't reclaim resources from the clients
529*ec779b8eSAndroid Build Coastguard Worker reclaimStatus =
530*ec779b8eSAndroid Build Coastguard Worker MEDIA_CODEC_RECLAIM_REQUEST_COMPLETED__RECLAIM_STATUS__RECLAIM_FAILED_RECLAIM_RESOURCES;
531*ec779b8eSAndroid Build Coastguard Worker }
532*ec779b8eSAndroid Build Coastguard Worker }
533*ec779b8eSAndroid Build Coastguard Worker
534*ec779b8eSAndroid Build Coastguard Worker if (targetClients.empty()) {
535*ec779b8eSAndroid Build Coastguard Worker // Push the reclaim atom to stats.
536*ec779b8eSAndroid Build Coastguard Worker pushReclaimStats(callingPid,
537*ec779b8eSAndroid Build Coastguard Worker requesterUid,
538*ec779b8eSAndroid Build Coastguard Worker requesterPriority,
539*ec779b8eSAndroid Build Coastguard Worker clientName,
540*ec779b8eSAndroid Build Coastguard Worker noOfConcurrentCodecs,
541*ec779b8eSAndroid Build Coastguard Worker reclaimStatus);
542*ec779b8eSAndroid Build Coastguard Worker return;
543*ec779b8eSAndroid Build Coastguard Worker }
544*ec779b8eSAndroid Build Coastguard Worker
545*ec779b8eSAndroid Build Coastguard Worker int32_t noOfCodecsReclaimed = targetClients.size();
546*ec779b8eSAndroid Build Coastguard Worker int32_t targetIndex = 1;
547*ec779b8eSAndroid Build Coastguard Worker for (const ClientInfo& targetClient : targetClients) {
548*ec779b8eSAndroid Build Coastguard Worker int targetPriority = priorities[targetIndex];
549*ec779b8eSAndroid Build Coastguard Worker // Push the reclaim atom to stats.
550*ec779b8eSAndroid Build Coastguard Worker pushReclaimStats(callingPid,
551*ec779b8eSAndroid Build Coastguard Worker requesterUid,
552*ec779b8eSAndroid Build Coastguard Worker requesterPriority,
553*ec779b8eSAndroid Build Coastguard Worker clientName,
554*ec779b8eSAndroid Build Coastguard Worker noOfConcurrentCodecs,
555*ec779b8eSAndroid Build Coastguard Worker reclaimStatus,
556*ec779b8eSAndroid Build Coastguard Worker noOfCodecsReclaimed,
557*ec779b8eSAndroid Build Coastguard Worker targetIndex,
558*ec779b8eSAndroid Build Coastguard Worker targetClient.mPid,
559*ec779b8eSAndroid Build Coastguard Worker targetClient.mUid,
560*ec779b8eSAndroid Build Coastguard Worker targetPriority);
561*ec779b8eSAndroid Build Coastguard Worker targetIndex++;
562*ec779b8eSAndroid Build Coastguard Worker }
563*ec779b8eSAndroid Build Coastguard Worker }
564*ec779b8eSAndroid Build Coastguard Worker
increaseConcurrentCodecs(int32_t pid,CodecBucket codecBucket)565*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::increaseConcurrentCodecs(int32_t pid,
566*ec779b8eSAndroid Build Coastguard Worker CodecBucket codecBucket) {
567*ec779b8eSAndroid Build Coastguard Worker // Increase the codec usage across the system.
568*ec779b8eSAndroid Build Coastguard Worker mConcurrentCodecsMap[codecBucket]++;
569*ec779b8eSAndroid Build Coastguard Worker
570*ec779b8eSAndroid Build Coastguard Worker // Now update the codec usage for this (pid) process.
571*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, ConcurrentCodecs>::iterator found = mProcessConcurrentCodecsMap.find(pid);
572*ec779b8eSAndroid Build Coastguard Worker if (found == mProcessConcurrentCodecsMap.end()) {
573*ec779b8eSAndroid Build Coastguard Worker ConcurrentCodecs codecs;
574*ec779b8eSAndroid Build Coastguard Worker codecs.mCurrent[codecBucket] = 1;
575*ec779b8eSAndroid Build Coastguard Worker codecs.mPeak[codecBucket] = 1;
576*ec779b8eSAndroid Build Coastguard Worker auto added = mProcessConcurrentCodecsMap.emplace(pid, codecs);
577*ec779b8eSAndroid Build Coastguard Worker found = added.first;
578*ec779b8eSAndroid Build Coastguard Worker } else {
579*ec779b8eSAndroid Build Coastguard Worker found->second.mCurrent[codecBucket]++;
580*ec779b8eSAndroid Build Coastguard Worker // Check if it's the peak count for this slot.
581*ec779b8eSAndroid Build Coastguard Worker if (found->second.mPeak[codecBucket] < found->second.mCurrent[codecBucket]) {
582*ec779b8eSAndroid Build Coastguard Worker found->second.mPeak[codecBucket] = found->second.mCurrent[codecBucket];
583*ec779b8eSAndroid Build Coastguard Worker }
584*ec779b8eSAndroid Build Coastguard Worker }
585*ec779b8eSAndroid Build Coastguard Worker
586*ec779b8eSAndroid Build Coastguard Worker switch (codecBucket) {
587*ec779b8eSAndroid Build Coastguard Worker case HwVideoEncoder:
588*ec779b8eSAndroid Build Coastguard Worker case HwVideoDecoder:
589*ec779b8eSAndroid Build Coastguard Worker case SwVideoEncoder:
590*ec779b8eSAndroid Build Coastguard Worker case SwVideoDecoder:
591*ec779b8eSAndroid Build Coastguard Worker if (codecBucket == HwVideoEncoder || codecBucket == HwVideoDecoder) {
592*ec779b8eSAndroid Build Coastguard Worker found->second.mHWVideoCodecs++;
593*ec779b8eSAndroid Build Coastguard Worker } else {
594*ec779b8eSAndroid Build Coastguard Worker found->second.mSWVideoCodecs++;
595*ec779b8eSAndroid Build Coastguard Worker }
596*ec779b8eSAndroid Build Coastguard Worker found->second.mVideoCodecs++;
597*ec779b8eSAndroid Build Coastguard Worker break;
598*ec779b8eSAndroid Build Coastguard Worker case HwAudioEncoder:
599*ec779b8eSAndroid Build Coastguard Worker case HwAudioDecoder:
600*ec779b8eSAndroid Build Coastguard Worker case SwAudioEncoder:
601*ec779b8eSAndroid Build Coastguard Worker case SwAudioDecoder:
602*ec779b8eSAndroid Build Coastguard Worker found->second.mAudioCodecs++;
603*ec779b8eSAndroid Build Coastguard Worker break;
604*ec779b8eSAndroid Build Coastguard Worker case HwImageEncoder:
605*ec779b8eSAndroid Build Coastguard Worker case HwImageDecoder:
606*ec779b8eSAndroid Build Coastguard Worker case SwImageEncoder:
607*ec779b8eSAndroid Build Coastguard Worker case SwImageDecoder:
608*ec779b8eSAndroid Build Coastguard Worker found->second.mImageCodecs++;
609*ec779b8eSAndroid Build Coastguard Worker break;
610*ec779b8eSAndroid Build Coastguard Worker default:
611*ec779b8eSAndroid Build Coastguard Worker break;
612*ec779b8eSAndroid Build Coastguard Worker }
613*ec779b8eSAndroid Build Coastguard Worker }
614*ec779b8eSAndroid Build Coastguard Worker
decreaseConcurrentCodecs(int32_t pid,CodecBucket codecBucket)615*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::decreaseConcurrentCodecs(int32_t pid,
616*ec779b8eSAndroid Build Coastguard Worker CodecBucket codecBucket) {
617*ec779b8eSAndroid Build Coastguard Worker // Decrease the codec usage across the system.
618*ec779b8eSAndroid Build Coastguard Worker if (mConcurrentCodecsMap[codecBucket] > 0) {
619*ec779b8eSAndroid Build Coastguard Worker mConcurrentCodecsMap[codecBucket]--;
620*ec779b8eSAndroid Build Coastguard Worker }
621*ec779b8eSAndroid Build Coastguard Worker
622*ec779b8eSAndroid Build Coastguard Worker // Now update the codec usage for this (pid) process.
623*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, ConcurrentCodecs>::iterator found = mProcessConcurrentCodecsMap.find(pid);
624*ec779b8eSAndroid Build Coastguard Worker if (found != mProcessConcurrentCodecsMap.end()) {
625*ec779b8eSAndroid Build Coastguard Worker if (found->second.mCurrent[codecBucket] > 0) {
626*ec779b8eSAndroid Build Coastguard Worker found->second.mCurrent[codecBucket]--;
627*ec779b8eSAndroid Build Coastguard Worker }
628*ec779b8eSAndroid Build Coastguard Worker
629*ec779b8eSAndroid Build Coastguard Worker switch (codecBucket) {
630*ec779b8eSAndroid Build Coastguard Worker case HwVideoEncoder:
631*ec779b8eSAndroid Build Coastguard Worker case HwVideoDecoder:
632*ec779b8eSAndroid Build Coastguard Worker case SwVideoEncoder:
633*ec779b8eSAndroid Build Coastguard Worker case SwVideoDecoder:
634*ec779b8eSAndroid Build Coastguard Worker if (codecBucket == HwVideoEncoder || codecBucket == HwVideoDecoder) {
635*ec779b8eSAndroid Build Coastguard Worker found->second.mHWVideoCodecs--;
636*ec779b8eSAndroid Build Coastguard Worker } else {
637*ec779b8eSAndroid Build Coastguard Worker found->second.mSWVideoCodecs--;
638*ec779b8eSAndroid Build Coastguard Worker }
639*ec779b8eSAndroid Build Coastguard Worker found->second.mVideoCodecs--;
640*ec779b8eSAndroid Build Coastguard Worker break;
641*ec779b8eSAndroid Build Coastguard Worker case HwAudioEncoder:
642*ec779b8eSAndroid Build Coastguard Worker case HwAudioDecoder:
643*ec779b8eSAndroid Build Coastguard Worker case SwAudioEncoder:
644*ec779b8eSAndroid Build Coastguard Worker case SwAudioDecoder:
645*ec779b8eSAndroid Build Coastguard Worker found->second.mAudioCodecs--;
646*ec779b8eSAndroid Build Coastguard Worker break;
647*ec779b8eSAndroid Build Coastguard Worker case HwImageEncoder:
648*ec779b8eSAndroid Build Coastguard Worker case HwImageDecoder:
649*ec779b8eSAndroid Build Coastguard Worker case SwImageEncoder:
650*ec779b8eSAndroid Build Coastguard Worker case SwImageDecoder:
651*ec779b8eSAndroid Build Coastguard Worker found->second.mImageCodecs--;
652*ec779b8eSAndroid Build Coastguard Worker break;
653*ec779b8eSAndroid Build Coastguard Worker default:
654*ec779b8eSAndroid Build Coastguard Worker break;
655*ec779b8eSAndroid Build Coastguard Worker }
656*ec779b8eSAndroid Build Coastguard Worker }
657*ec779b8eSAndroid Build Coastguard Worker }
658*ec779b8eSAndroid Build Coastguard Worker
increasePixelCount(int32_t pid,long pixels)659*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::increasePixelCount(int32_t pid, long pixels) {
660*ec779b8eSAndroid Build Coastguard Worker // Now update the current pixel usage for this (pid) process.
661*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, PixelCount>::iterator found = mProcessPixelsMap.find(pid);
662*ec779b8eSAndroid Build Coastguard Worker if (found == mProcessPixelsMap.end()) {
663*ec779b8eSAndroid Build Coastguard Worker PixelCount pixelCount {pixels, pixels};
664*ec779b8eSAndroid Build Coastguard Worker mProcessPixelsMap.emplace(pid, pixelCount);
665*ec779b8eSAndroid Build Coastguard Worker } else {
666*ec779b8eSAndroid Build Coastguard Worker if (__builtin_add_overflow(found->second.mCurrent, pixels, &found->second.mCurrent)) {
667*ec779b8eSAndroid Build Coastguard Worker ALOGI("Pixel Count overflow");
668*ec779b8eSAndroid Build Coastguard Worker return;
669*ec779b8eSAndroid Build Coastguard Worker }
670*ec779b8eSAndroid Build Coastguard Worker // Check if it's the peak count for this slot.
671*ec779b8eSAndroid Build Coastguard Worker if (found->second.mPeak < found->second.mCurrent) {
672*ec779b8eSAndroid Build Coastguard Worker found->second.mPeak = found->second.mCurrent;
673*ec779b8eSAndroid Build Coastguard Worker }
674*ec779b8eSAndroid Build Coastguard Worker }
675*ec779b8eSAndroid Build Coastguard Worker }
676*ec779b8eSAndroid Build Coastguard Worker
updatePixelCount(int32_t pid,long newPixels,long lastPixels)677*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::updatePixelCount(int32_t pid, long newPixels, long lastPixels) {
678*ec779b8eSAndroid Build Coastguard Worker // Since there is change in resolution, decrease it by last pixels and
679*ec779b8eSAndroid Build Coastguard Worker // increase it by new pixels.
680*ec779b8eSAndroid Build Coastguard Worker decreasePixelCount(pid, lastPixels);
681*ec779b8eSAndroid Build Coastguard Worker increasePixelCount(pid, newPixels);
682*ec779b8eSAndroid Build Coastguard Worker }
683*ec779b8eSAndroid Build Coastguard Worker
decreasePixelCount(int32_t pid,long pixels)684*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerMetrics::decreasePixelCount(int32_t pid, long pixels) {
685*ec779b8eSAndroid Build Coastguard Worker // Now update the current pixel usage for this (pid) process.
686*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, PixelCount>::iterator found = mProcessPixelsMap.find(pid);
687*ec779b8eSAndroid Build Coastguard Worker if (found != mProcessPixelsMap.end()) {
688*ec779b8eSAndroid Build Coastguard Worker if (found->second.mCurrent < pixels) {
689*ec779b8eSAndroid Build Coastguard Worker found->second.mCurrent = 0;
690*ec779b8eSAndroid Build Coastguard Worker } else {
691*ec779b8eSAndroid Build Coastguard Worker if (__builtin_sub_overflow(found->second.mCurrent, pixels, &found->second.mCurrent)) {
692*ec779b8eSAndroid Build Coastguard Worker ALOGI("Pixel Count overflow");
693*ec779b8eSAndroid Build Coastguard Worker return;
694*ec779b8eSAndroid Build Coastguard Worker }
695*ec779b8eSAndroid Build Coastguard Worker }
696*ec779b8eSAndroid Build Coastguard Worker }
697*ec779b8eSAndroid Build Coastguard Worker }
698*ec779b8eSAndroid Build Coastguard Worker
getPeakConcurrentPixelCount(int pid) const699*ec779b8eSAndroid Build Coastguard Worker long ResourceManagerMetrics::getPeakConcurrentPixelCount(int pid) const {
700*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, PixelCount>::const_iterator found = mProcessPixelsMap.find(pid);
701*ec779b8eSAndroid Build Coastguard Worker if (found != mProcessPixelsMap.end()) {
702*ec779b8eSAndroid Build Coastguard Worker return found->second.mPeak;
703*ec779b8eSAndroid Build Coastguard Worker }
704*ec779b8eSAndroid Build Coastguard Worker
705*ec779b8eSAndroid Build Coastguard Worker return 0;
706*ec779b8eSAndroid Build Coastguard Worker }
707*ec779b8eSAndroid Build Coastguard Worker
getCurrentConcurrentPixelCount(int pid) const708*ec779b8eSAndroid Build Coastguard Worker long ResourceManagerMetrics::getCurrentConcurrentPixelCount(int pid) const {
709*ec779b8eSAndroid Build Coastguard Worker std::map<int32_t, PixelCount>::const_iterator found = mProcessPixelsMap.find(pid);
710*ec779b8eSAndroid Build Coastguard Worker if (found != mProcessPixelsMap.end()) {
711*ec779b8eSAndroid Build Coastguard Worker return found->second.mCurrent;
712*ec779b8eSAndroid Build Coastguard Worker }
713*ec779b8eSAndroid Build Coastguard Worker
714*ec779b8eSAndroid Build Coastguard Worker return 0;
715*ec779b8eSAndroid Build Coastguard Worker }
716*ec779b8eSAndroid Build Coastguard Worker
getConcurrentInstanceCount(const std::map<std::string,int> & resourceMap)717*ec779b8eSAndroid Build Coastguard Worker static std::string getConcurrentInstanceCount(const std::map<std::string, int>& resourceMap) {
718*ec779b8eSAndroid Build Coastguard Worker if (resourceMap.empty()) {
719*ec779b8eSAndroid Build Coastguard Worker return "";
720*ec779b8eSAndroid Build Coastguard Worker }
721*ec779b8eSAndroid Build Coastguard Worker std::stringstream concurrentInstanceInfo;
722*ec779b8eSAndroid Build Coastguard Worker for (const auto& [name, count] : resourceMap) {
723*ec779b8eSAndroid Build Coastguard Worker if (count > 0) {
724*ec779b8eSAndroid Build Coastguard Worker concurrentInstanceInfo << " Name: " << name << " Instances: " << count << "\n";
725*ec779b8eSAndroid Build Coastguard Worker }
726*ec779b8eSAndroid Build Coastguard Worker }
727*ec779b8eSAndroid Build Coastguard Worker
728*ec779b8eSAndroid Build Coastguard Worker std::string info = concurrentInstanceInfo.str();
729*ec779b8eSAndroid Build Coastguard Worker if (info.empty()) {
730*ec779b8eSAndroid Build Coastguard Worker return "";
731*ec779b8eSAndroid Build Coastguard Worker }
732*ec779b8eSAndroid Build Coastguard Worker return " Current Concurrent Codec Instances:\n" + info;
733*ec779b8eSAndroid Build Coastguard Worker }
734*ec779b8eSAndroid Build Coastguard Worker
getAppsPixelCount(const std::map<int32_t,PixelCount> & pixelMap)735*ec779b8eSAndroid Build Coastguard Worker static std::string getAppsPixelCount(const std::map<int32_t, PixelCount>& pixelMap) {
736*ec779b8eSAndroid Build Coastguard Worker if (pixelMap.empty()) {
737*ec779b8eSAndroid Build Coastguard Worker return "";
738*ec779b8eSAndroid Build Coastguard Worker }
739*ec779b8eSAndroid Build Coastguard Worker std::stringstream pixelInfo;
740*ec779b8eSAndroid Build Coastguard Worker for (const auto& [pid, pixelCount] : pixelMap) {
741*ec779b8eSAndroid Build Coastguard Worker std::string logMsg = getLogMessage(" Current Pixels: ", pixelCount.mCurrent,
742*ec779b8eSAndroid Build Coastguard Worker " Peak Pixels: ", pixelCount.mPeak);
743*ec779b8eSAndroid Build Coastguard Worker if (!logMsg.empty()) {
744*ec779b8eSAndroid Build Coastguard Worker pixelInfo << " PID[" << pid << "]: {" << logMsg << " }\n";
745*ec779b8eSAndroid Build Coastguard Worker }
746*ec779b8eSAndroid Build Coastguard Worker }
747*ec779b8eSAndroid Build Coastguard Worker
748*ec779b8eSAndroid Build Coastguard Worker return " Applications Pixel Usage:\n" + pixelInfo.str();
749*ec779b8eSAndroid Build Coastguard Worker }
750*ec779b8eSAndroid Build Coastguard Worker
getCodecUsageMetrics(const ConcurrentCodecsMap & codecsMap)751*ec779b8eSAndroid Build Coastguard Worker static std::string getCodecUsageMetrics(const ConcurrentCodecsMap& codecsMap) {
752*ec779b8eSAndroid Build Coastguard Worker int peakHwAudioEncoderCount = codecsMap[HwAudioEncoder];
753*ec779b8eSAndroid Build Coastguard Worker int peakHwAudioDecoderCount = codecsMap[HwAudioDecoder];
754*ec779b8eSAndroid Build Coastguard Worker int peakHwVideoEncoderCount = codecsMap[HwVideoEncoder];
755*ec779b8eSAndroid Build Coastguard Worker int peakHwVideoDecoderCount = codecsMap[HwVideoDecoder];
756*ec779b8eSAndroid Build Coastguard Worker int peakHwImageEncoderCount = codecsMap[HwImageEncoder];
757*ec779b8eSAndroid Build Coastguard Worker int peakHwImageDecoderCount = codecsMap[HwImageDecoder];
758*ec779b8eSAndroid Build Coastguard Worker int peakSwAudioEncoderCount = codecsMap[SwAudioEncoder];
759*ec779b8eSAndroid Build Coastguard Worker int peakSwAudioDecoderCount = codecsMap[SwAudioDecoder];
760*ec779b8eSAndroid Build Coastguard Worker int peakSwVideoEncoderCount = codecsMap[SwVideoEncoder];
761*ec779b8eSAndroid Build Coastguard Worker int peakSwVideoDecoderCount = codecsMap[SwVideoDecoder];
762*ec779b8eSAndroid Build Coastguard Worker int peakSwImageEncoderCount = codecsMap[SwImageEncoder];
763*ec779b8eSAndroid Build Coastguard Worker int peakSwImageDecoderCount = codecsMap[SwImageDecoder];
764*ec779b8eSAndroid Build Coastguard Worker std::stringstream usageMetrics;
765*ec779b8eSAndroid Build Coastguard Worker std::string logMsg;
766*ec779b8eSAndroid Build Coastguard Worker logMsg = getLogMessage(" HW: ", peakHwAudioEncoderCount, " SW: ", peakSwAudioEncoderCount);
767*ec779b8eSAndroid Build Coastguard Worker if (!logMsg.empty()) {
768*ec779b8eSAndroid Build Coastguard Worker usageMetrics << "AudioEnc[" << logMsg << " ] ";
769*ec779b8eSAndroid Build Coastguard Worker }
770*ec779b8eSAndroid Build Coastguard Worker logMsg = getLogMessage(" HW: ", peakHwAudioDecoderCount, " SW: ", peakSwAudioDecoderCount);
771*ec779b8eSAndroid Build Coastguard Worker if (!logMsg.empty()) {
772*ec779b8eSAndroid Build Coastguard Worker usageMetrics << "AudioDec[" << logMsg << " ] ";
773*ec779b8eSAndroid Build Coastguard Worker }
774*ec779b8eSAndroid Build Coastguard Worker logMsg = getLogMessage(" HW: ", peakHwVideoEncoderCount, " SW: ", peakSwVideoEncoderCount);
775*ec779b8eSAndroid Build Coastguard Worker if (!logMsg.empty()) {
776*ec779b8eSAndroid Build Coastguard Worker usageMetrics << "VideoEnc[" << logMsg << " ] ";
777*ec779b8eSAndroid Build Coastguard Worker }
778*ec779b8eSAndroid Build Coastguard Worker logMsg = getLogMessage(" HW: ", peakHwVideoDecoderCount, " SW: ", peakSwVideoDecoderCount);
779*ec779b8eSAndroid Build Coastguard Worker if (!logMsg.empty()) {
780*ec779b8eSAndroid Build Coastguard Worker usageMetrics << "VideoDec[" << logMsg << " ] ";
781*ec779b8eSAndroid Build Coastguard Worker }
782*ec779b8eSAndroid Build Coastguard Worker logMsg = getLogMessage(" HW: ", peakHwImageEncoderCount, " SW: ", peakSwImageEncoderCount);
783*ec779b8eSAndroid Build Coastguard Worker if (!logMsg.empty()) {
784*ec779b8eSAndroid Build Coastguard Worker usageMetrics << "ImageEnc[" << logMsg << " ] ";
785*ec779b8eSAndroid Build Coastguard Worker }
786*ec779b8eSAndroid Build Coastguard Worker logMsg = getLogMessage(" HW: ", peakHwImageDecoderCount, " SW: ", peakSwImageDecoderCount);
787*ec779b8eSAndroid Build Coastguard Worker if (!logMsg.empty()) {
788*ec779b8eSAndroid Build Coastguard Worker usageMetrics << "ImageDec[" << logMsg << " ] ";
789*ec779b8eSAndroid Build Coastguard Worker }
790*ec779b8eSAndroid Build Coastguard Worker
791*ec779b8eSAndroid Build Coastguard Worker return usageMetrics.str();
792*ec779b8eSAndroid Build Coastguard Worker }
793*ec779b8eSAndroid Build Coastguard Worker
getAppsCodecUsageMetrics(const std::map<int32_t,ConcurrentCodecs> & processCodecsMap)794*ec779b8eSAndroid Build Coastguard Worker static std::string getAppsCodecUsageMetrics(
795*ec779b8eSAndroid Build Coastguard Worker const std::map<int32_t, ConcurrentCodecs>& processCodecsMap) {
796*ec779b8eSAndroid Build Coastguard Worker if (processCodecsMap.empty()) {
797*ec779b8eSAndroid Build Coastguard Worker return "";
798*ec779b8eSAndroid Build Coastguard Worker }
799*ec779b8eSAndroid Build Coastguard Worker std::stringstream codecUsage;
800*ec779b8eSAndroid Build Coastguard Worker std::string info;
801*ec779b8eSAndroid Build Coastguard Worker for (const auto& [pid, codecMap] : processCodecsMap) {
802*ec779b8eSAndroid Build Coastguard Worker codecUsage << " PID[" << pid << "]: ";
803*ec779b8eSAndroid Build Coastguard Worker info = getCodecUsageMetrics(codecMap.mCurrent);
804*ec779b8eSAndroid Build Coastguard Worker if (!info.empty()) {
805*ec779b8eSAndroid Build Coastguard Worker codecUsage << "Current Codec Usage: { " << info << "} ";
806*ec779b8eSAndroid Build Coastguard Worker }
807*ec779b8eSAndroid Build Coastguard Worker info = getCodecUsageMetrics(codecMap.mPeak);
808*ec779b8eSAndroid Build Coastguard Worker if (!info.empty()) {
809*ec779b8eSAndroid Build Coastguard Worker codecUsage << "Peak Codec Usage: { " << info << "}";
810*ec779b8eSAndroid Build Coastguard Worker }
811*ec779b8eSAndroid Build Coastguard Worker codecUsage << "\n";
812*ec779b8eSAndroid Build Coastguard Worker }
813*ec779b8eSAndroid Build Coastguard Worker
814*ec779b8eSAndroid Build Coastguard Worker return " Applications Codec Usage:\n" + codecUsage.str();
815*ec779b8eSAndroid Build Coastguard Worker }
816*ec779b8eSAndroid Build Coastguard Worker
817*ec779b8eSAndroid Build Coastguard Worker
dump() const818*ec779b8eSAndroid Build Coastguard Worker std::string ResourceManagerMetrics::dump() const {
819*ec779b8eSAndroid Build Coastguard Worker std::string metricsLog(" Metrics logs:\n");
820*ec779b8eSAndroid Build Coastguard Worker metricsLog += getConcurrentInstanceCount(mConcurrentResourceCountMap);
821*ec779b8eSAndroid Build Coastguard Worker metricsLog += getAppsPixelCount(mProcessPixelsMap);
822*ec779b8eSAndroid Build Coastguard Worker metricsLog += getAppsCodecUsageMetrics(mProcessConcurrentCodecsMap);
823*ec779b8eSAndroid Build Coastguard Worker
824*ec779b8eSAndroid Build Coastguard Worker return metricsLog;
825*ec779b8eSAndroid Build Coastguard Worker }
826*ec779b8eSAndroid Build Coastguard Worker
827*ec779b8eSAndroid Build Coastguard Worker } // namespace android
828