diff options
author | Girish Shetty <girishshetty@google.com> | 2024-04-19 05:12:41 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-04-19 05:12:41 +0000 |
commit | 6af9330e67150afb7b7cb3d1a6652667697d97b2 (patch) | |
tree | 7d71e0792f3b8c4161a7d268698c9f1f5c68b7f5 | |
parent | 02e64af2cdf51ba02ced5e36f1501bda8ddb9693 (diff) | |
parent | dc187558fc87a6f3c3275b75cac6c77b5f22904d (diff) | |
download | av-6af9330e67150afb7b7cb3d1a6652667697d97b2.tar.gz |
Merge changes I0e5b59b9,I6a37e397 into main
* changes:
resourcemanager: add resource metrics to dumpsys
libstagefright: record failed codec initialization
4 files changed, 173 insertions, 30 deletions
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index 4e378d43a2..1a479acd91 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -3975,6 +3975,15 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { switch (mState) { case INITIALIZING: { + // Resource error during INITIALIZING state needs to be logged + // through metrics, to be able to track such occurrences. + if (isResourceError(err)) { + mediametrics_setInt32(mMetricsHandle, kCodecError, err); + mediametrics_setCString(mMetricsHandle, kCodecErrorState, + stateString(mState).c_str()); + flushMediametrics(); + initMediametrics(); + } setState(UNINITIALIZED); break; } diff --git a/services/mediaresourcemanager/ResourceManagerMetrics.cpp b/services/mediaresourcemanager/ResourceManagerMetrics.cpp index cd0093703c..a8a1de17cd 100644 --- a/services/mediaresourcemanager/ResourceManagerMetrics.cpp +++ b/services/mediaresourcemanager/ResourceManagerMetrics.cpp @@ -109,23 +109,17 @@ static CodecBucket getCodecBucket(bool isEncoder, MediaResourceSubType codecType return CodecBucketUnspecified; } -static bool getLogMessage(int hwCount, int swCount, std::stringstream& logMsg) { - bool update = false; - logMsg.clear(); +static std::string getLogMessage(const std::string& firstKey, const long& firstValue, + const std::string& secondKey, const long& secondValue) { - if (hwCount > 0) { - logMsg << " HW: " << hwCount; - update = true; - } - if (swCount > 0) { - logMsg << " SW: " << swCount; - update = true; + std::stringstream logMsg; + if (firstValue > 0) { + logMsg << firstKey << firstValue; } - - if (update) { - logMsg << " ] "; + if (secondValue > 0) { + logMsg << secondKey << secondValue; } - return update; + return logMsg.str(); } ResourceManagerMetrics::ResourceManagerMetrics(const sp<ProcessInfoInterface>& processInfo) { @@ -364,6 +358,15 @@ void ResourceManagerMetrics::onProcessTerminated(int32_t pid, uid_t uid) { std::scoped_lock lock(mLock); // post MediaCodecConcurrentUsageReported for this terminated pid. pushConcurrentUsageReport(pid, uid); + // Remove all the metrics associated with this process. + std::map<int32_t, ConcurrentCodecs>::iterator it1 = mProcessConcurrentCodecsMap.find(pid); + if (it1 != mProcessConcurrentCodecsMap.end()) { + mProcessConcurrentCodecsMap.erase(it1); + } + std::map<int32_t, PixelCount>::iterator it2 = mProcessPixelsMap.find(pid); + if (it2 != mProcessPixelsMap.end()) { + mProcessPixelsMap.erase(it2); + } } void ResourceManagerMetrics::pushConcurrentUsageReport(int32_t pid, uid_t uid) { @@ -400,24 +403,30 @@ void ResourceManagerMetrics::pushConcurrentUsageReport(int32_t pid, uid_t uid) { std::stringstream peakCodecLog; peakCodecLog << "Peak { "; - std::stringstream logMsg; - if (getLogMessage(peakHwAudioEncoderCount, peakSwAudioEncoderCount, logMsg)) { - peakCodecLog << "AudioEnc[" << logMsg.str(); + std::string logMsg; + logMsg = getLogMessage(" HW: ", peakHwAudioEncoderCount, " SW: ", peakSwAudioEncoderCount); + if (!logMsg.empty()) { + peakCodecLog << "AudioEnc[ " << logMsg << " ] "; } - if (getLogMessage(peakHwAudioDecoderCount, peakSwAudioDecoderCount, logMsg)) { - peakCodecLog << "AudioDec[" << logMsg.str(); + logMsg = getLogMessage(" HW: ", peakHwAudioDecoderCount, " SW: ", peakSwAudioDecoderCount); + if (!logMsg.empty()) { + peakCodecLog << "AudioDec[" << logMsg << " ] "; } - if (getLogMessage(peakHwVideoEncoderCount, peakSwVideoEncoderCount, logMsg)) { - peakCodecLog << "VideoEnc[" << logMsg.str(); + logMsg = getLogMessage(" HW: ", peakHwVideoEncoderCount, " SW: ", peakSwVideoEncoderCount); + if (!logMsg.empty()) { + peakCodecLog << "VideoEnc[" << logMsg << " ] "; } - if (getLogMessage(peakHwVideoDecoderCount, peakSwVideoDecoderCount, logMsg)) { - peakCodecLog << "VideoDec[" << logMsg.str(); + logMsg = getLogMessage(" HW: ", peakHwVideoDecoderCount, " SW: ", peakSwVideoDecoderCount); + if (!logMsg.empty()) { + peakCodecLog << "VideoDec[" << logMsg << " ] "; } - if (getLogMessage(peakHwImageEncoderCount, peakSwImageEncoderCount, logMsg)) { - peakCodecLog << "ImageEnc[" << logMsg.str(); + logMsg = getLogMessage(" HW: ", peakHwImageEncoderCount, " SW: ", peakSwImageEncoderCount); + if (!logMsg.empty()) { + peakCodecLog << "ImageEnc[" << logMsg << " ] "; } - if (getLogMessage(peakHwImageDecoderCount, peakSwImageDecoderCount, logMsg)) { - peakCodecLog << "ImageDec[" << logMsg.str(); + logMsg = getLogMessage(" HW: ", peakHwImageDecoderCount, " SW: ", peakSwImageDecoderCount); + if (!logMsg.empty()) { + peakCodecLog << "ImageDec[" << logMsg << " ] "; } peakCodecLog << "}"; @@ -705,4 +714,114 @@ long ResourceManagerMetrics::getCurrentConcurrentPixelCount(int pid) const { return 0; } +static std::string getConcurrentInstanceCount(const std::map<std::string, int>& resourceMap) { + if (resourceMap.empty()) { + return ""; + } + std::stringstream concurrentInstanceInfo; + for (const auto& [name, count] : resourceMap) { + if (count > 0) { + concurrentInstanceInfo << " Name: " << name << " Instances: " << count << "\n"; + } + } + + std::string info = concurrentInstanceInfo.str(); + if (info.empty()) { + return ""; + } + return " Current Concurrent Codec Instances:\n" + info; +} + +static std::string getAppsPixelCount(const std::map<int32_t, PixelCount>& pixelMap) { + if (pixelMap.empty()) { + return ""; + } + std::stringstream pixelInfo; + for (const auto& [pid, pixelCount] : pixelMap) { + std::string logMsg = getLogMessage(" Current Pixels: ", pixelCount.mCurrent, + " Peak Pixels: ", pixelCount.mPeak); + if (!logMsg.empty()) { + pixelInfo << " PID[" << pid << "]: {" << logMsg << " }\n"; + } + } + + return " Applications Pixel Usage:\n" + pixelInfo.str(); +} + +static std::string getCodecUsageMetrics(const ConcurrentCodecsMap& codecsMap) { + int peakHwAudioEncoderCount = codecsMap[HwAudioEncoder]; + int peakHwAudioDecoderCount = codecsMap[HwAudioDecoder]; + int peakHwVideoEncoderCount = codecsMap[HwVideoEncoder]; + int peakHwVideoDecoderCount = codecsMap[HwVideoDecoder]; + int peakHwImageEncoderCount = codecsMap[HwImageEncoder]; + int peakHwImageDecoderCount = codecsMap[HwImageDecoder]; + int peakSwAudioEncoderCount = codecsMap[SwAudioEncoder]; + int peakSwAudioDecoderCount = codecsMap[SwAudioDecoder]; + int peakSwVideoEncoderCount = codecsMap[SwVideoEncoder]; + int peakSwVideoDecoderCount = codecsMap[SwVideoDecoder]; + int peakSwImageEncoderCount = codecsMap[SwImageEncoder]; + int peakSwImageDecoderCount = codecsMap[SwImageDecoder]; + std::stringstream usageMetrics; + std::string logMsg; + logMsg = getLogMessage(" HW: ", peakHwAudioEncoderCount, " SW: ", peakSwAudioEncoderCount); + if (!logMsg.empty()) { + usageMetrics << "AudioEnc[" << logMsg << " ] "; + } + logMsg = getLogMessage(" HW: ", peakHwAudioDecoderCount, " SW: ", peakSwAudioDecoderCount); + if (!logMsg.empty()) { + usageMetrics << "AudioDec[" << logMsg << " ] "; + } + logMsg = getLogMessage(" HW: ", peakHwVideoEncoderCount, " SW: ", peakSwVideoEncoderCount); + if (!logMsg.empty()) { + usageMetrics << "VideoEnc[" << logMsg << " ] "; + } + logMsg = getLogMessage(" HW: ", peakHwVideoDecoderCount, " SW: ", peakSwVideoDecoderCount); + if (!logMsg.empty()) { + usageMetrics << "VideoDec[" << logMsg << " ] "; + } + logMsg = getLogMessage(" HW: ", peakHwImageEncoderCount, " SW: ", peakSwImageEncoderCount); + if (!logMsg.empty()) { + usageMetrics << "ImageEnc[" << logMsg << " ] "; + } + logMsg = getLogMessage(" HW: ", peakHwImageDecoderCount, " SW: ", peakSwImageDecoderCount); + if (!logMsg.empty()) { + usageMetrics << "ImageDec[" << logMsg << " ] "; + } + + return usageMetrics.str(); +} + +static std::string getAppsCodecUsageMetrics( + const std::map<int32_t, ConcurrentCodecs>& processCodecsMap) { + if (processCodecsMap.empty()) { + return ""; + } + std::stringstream codecUsage; + std::string info; + for (const auto& [pid, codecMap] : processCodecsMap) { + codecUsage << " PID[" << pid << "]: "; + info = getCodecUsageMetrics(codecMap.mCurrent); + if (!info.empty()) { + codecUsage << "Current Codec Usage: { " << info << "} "; + } + info = getCodecUsageMetrics(codecMap.mPeak); + if (!info.empty()) { + codecUsage << "Peak Codec Usage: { " << info << "}"; + } + codecUsage << "\n"; + } + + return " Applications Codec Usage:\n" + codecUsage.str(); +} + + +std::string ResourceManagerMetrics::dump() const { + std::string metricsLog(" Metrics logs:\n"); + metricsLog += getConcurrentInstanceCount(mConcurrentResourceCountMap); + metricsLog += getAppsPixelCount(mProcessPixelsMap); + metricsLog += getAppsCodecUsageMetrics(mProcessConcurrentCodecsMap); + + return std::move(metricsLog); +} + } // namespace android diff --git a/services/mediaresourcemanager/ResourceManagerMetrics.h b/services/mediaresourcemanager/ResourceManagerMetrics.h index 7a5a89fa5e..9904f7d2fa 100644 --- a/services/mediaresourcemanager/ResourceManagerMetrics.h +++ b/services/mediaresourcemanager/ResourceManagerMetrics.h @@ -171,6 +171,9 @@ public: // Get the current concurrent pixel count (associated with the video codecs) for the process. long getCurrentConcurrentPixelCount(int pid) const; + // retrieves metrics log. + std::string dump() const; + private: ResourceManagerMetrics(const ResourceManagerMetrics&) = delete; ResourceManagerMetrics(ResourceManagerMetrics&&) = delete; @@ -204,9 +207,9 @@ private: // Map of resources (name) and number of concurrent instances std::map<std::string, int> mConcurrentResourceCountMap; - // Map of concurrent codes by CodecBucket across the system. + // Map of concurrent codecs by CodecBucket across the system. ConcurrentCodecsMap mConcurrentCodecsMap; - // Map of concurrent and peak codes by CodecBucket for each process/application. + // Map of concurrent and peak codecs by CodecBucket for each process/application. std::map<int32_t, ConcurrentCodecs> mProcessConcurrentCodecsMap; // Uid Observer to monitor the application termination. diff --git a/services/mediaresourcemanager/ResourceManagerService.cpp b/services/mediaresourcemanager/ResourceManagerService.cpp index d37d89390a..9c2fb7c7f9 100644 --- a/services/mediaresourcemanager/ResourceManagerService.cpp +++ b/services/mediaresourcemanager/ResourceManagerService.cpp @@ -108,10 +108,17 @@ binder_status_t ResourceManagerService::dump(int fd, const char** /*args*/, uint serviceLog = mServiceLog->toString(" " /* linePrefix */); } - // Get all the resource (and overload pid) logs + // Get all the resource (and overload pid) log. std::string resourceLog; getResourceDump(resourceLog); + // Get all the metrics log. + std::string metricsLog; + { + std::scoped_lock lock{mLock}; + metricsLog = mResourceManagerMetrics->dump(); + } + const size_t SIZE = 256; char buffer[SIZE]; snprintf(buffer, SIZE, "ResourceManagerService: %p\n", this); @@ -123,11 +130,16 @@ binder_status_t ResourceManagerService::dump(int fd, const char** /*args*/, uint supportsSecureWithNonSecureCodec); result.append(buffer); + // Add resource log. result.append(resourceLog.c_str()); + // Add service log. result.append(" Events logs (most recent at top):\n"); result.append(serviceLog); + // Add metrics log. + result.append(metricsLog.c_str()); + write(fd, result.c_str(), result.size()); return OK; } |