Loading drm/libmediadrm/DrmHal.cpp +7 −7 Original line number Diff line number Diff line Loading @@ -16,13 +16,9 @@ //#define LOG_NDEBUG 0 #define LOG_TAG "DrmHal" #include <iomanip> #include <utils/Log.h> #include <android/binder_manager.h> #include <aidl/android/media/BnResourceManagerClient.h> #include <android/binder_manager.h> #include <android/hardware/drm/1.2/types.h> #include <android/hidl/manager/1.2/IServiceManager.h> #include <hidl/ServiceManagement.h> Loading @@ -40,7 +36,9 @@ #include <mediadrm/DrmSessionManager.h> #include <mediadrm/IDrmMetricsConsumer.h> #include <mediadrm/DrmUtils.h> #include <utils/Log.h> #include <iomanip> #include <vector> using drm::V1_0::KeyedVector; Loading Loading @@ -364,7 +362,7 @@ sp<IDrmPlugin> DrmHal::makeDrmPlugin(const sp<IDrmFactory>& factory, Return<void> hResult = factory->createPlugin(uuid, appPackageName.string(), [&](Status status, const sp<IDrmPlugin>& hPlugin) { if (status != Status::OK) { DrmUtils::LOG2BE("Failed to make drm plugin: %d", status); DrmUtils::LOG2BE(uuid, "Failed to make drm plugin: %d", status); return; } plugin = hPlugin; Loading @@ -372,7 +370,8 @@ sp<IDrmPlugin> DrmHal::makeDrmPlugin(const sp<IDrmFactory>& factory, ); if (!hResult.isOk()) { DrmUtils::LOG2BE("createPlugin remote call failed"); DrmUtils::LOG2BE(uuid, "createPlugin remote call failed: %s", hResult.description().c_str()); } return plugin; Loading Loading @@ -580,6 +579,7 @@ status_t DrmHal::createPlugin(const uint8_t uuid[16], } if (mPlugin == NULL) { DrmUtils::LOG2BE(uuid, "No supported hal instance found"); mInitCheck = ERROR_UNSUPPORTED; } else { mInitCheck = OK; Loading drm/libmediadrm/DrmUtils.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -108,7 +108,7 @@ sp<::V1_0::IDrmPlugin> MakeDrmPlugin(const sp<::V1_0::IDrmFactory> &factory, factory->createPlugin(toHidlArray16(uuid), hidl_string(appPackageName), [&](::V1_0::Status status, const sp<::V1_0::IDrmPlugin> &hPlugin) { if (status != ::V1_0::Status::OK) { LOG2BE("MakeDrmPlugin failed: %d", status); LOG2BE(uuid, "MakeDrmPlugin failed: %d", status); return; } plugin = hPlugin; Loading @@ -123,7 +123,7 @@ sp<::V1_0::ICryptoPlugin> MakeCryptoPlugin(const sp<::V1_0::ICryptoFactory> &fac factory->createPlugin(toHidlArray16(uuid), toHidlVec(initData, initDataSize), [&](::V1_0::Status status, const sp<::V1_0::ICryptoPlugin> &hPlugin) { if (status != ::V1_0::Status::OK) { LOG2BE("MakeCryptoPlugin failed: %d", status); LOG2BE(uuid, "MakeCryptoPlugin failed: %d", status); return; } plugin = hPlugin; Loading drm/libmediadrm/interface/mediadrm/DrmUtils.h +14 −1 Original line number Diff line number Diff line Loading @@ -33,8 +33,10 @@ #include <cstdint> #include <ctime> #include <deque> #include <endian.h> #include <iterator> #include <mutex> #include <string> #include <vector> Loading Loading @@ -88,6 +90,14 @@ void LogToBuffer(android_LogPriority level, const char *fmt, Args... args) { } } template <typename... Args> void LogToBuffer(android_LogPriority level, const uint8_t uuid[16], const char *fmt, Args... args) { const uint64_t* uuid2 = reinterpret_cast<const uint64_t*>(uuid); std::string uuidFmt("uuid=[%lx %lx] "); uuidFmt += fmt; LogToBuffer(level, uuidFmt.c_str(), htobe64(uuid2[0]), htobe64(uuid2[1]), args...); } #ifndef LOG2BE #define LOG2BE(...) LogToBuffer(ANDROID_LOG_ERROR, __VA_ARGS__) #define LOG2BW(...) LogToBuffer(ANDROID_LOG_WARN, __VA_ARGS__) Loading Loading @@ -196,10 +206,13 @@ status_t GetLogMessages(const sp<U> &obj, Vector<::V1_4::LogMessage> &logs) { hResult = plugin->getLogMessages(cb); } if (!hResult.isOk()) { LOG2BW("%s::getLogMessages remote call failed", T::descriptor); LOG2BW("%s::getLogMessages remote call failed %s", T::descriptor, hResult.description().c_str()); } auto allLogs(gLogBuf.getLogs()); LOG2BI("framework logs size %zu; plugin logs size %zu", allLogs.size(), pluginLogs.size()); std::copy(pluginLogs.begin(), pluginLogs.end(), std::back_inserter(allLogs)); std::sort(allLogs.begin(), allLogs.end(), [](const ::V1_4::LogMessage &a, const ::V1_4::LogMessage &b) { Loading media/libstagefright/MediaCodec.cpp +63 −6 Original line number Diff line number Diff line Loading @@ -118,6 +118,11 @@ static const char *kCodecQueueInputBufferError = "android.media.mediacodec.queue static const char *kCodecNumLowLatencyModeOn = "android.media.mediacodec.low-latency.on"; /* 0..n */ static const char *kCodecNumLowLatencyModeOff = "android.media.mediacodec.low-latency.off"; /* 0..n */ static const char *kCodecFirstFrameIndexLowLatencyModeOn = "android.media.mediacodec.low-latency.first-frame"; /* 0..n */ static const char *kCodecChannelCount = "android.media.mediacodec.channelCount"; static const char *kCodecSampleRate = "android.media.mediacodec.sampleRate"; static const char *kCodecVideoEncodedBytes = "android.media.mediacodec.vencode.bytes"; static const char *kCodecVideoEncodedFrames = "android.media.mediacodec.vencode.frames"; static const char *kCodecVideoEncodedDurationUs = "android.media.mediacodec.vencode.durationUs"; // the kCodecRecent* fields appear only in getMetrics() results static const char *kCodecRecentLatencyMax = "android.media.mediacodec.recent.max"; /* in us */ Loading Loading @@ -695,6 +700,10 @@ MediaCodec::MediaCodec( mHavePendingInputBuffers(false), mCpuBoostRequested(false), mLatencyUnknown(0), mBytesEncoded(0), mEarliestEncodedPtsUs(INT64_MAX), mLatestEncodedPtsUs(INT64_MIN), mFramesEncoded(0), mNumLowLatencyEnables(0), mNumLowLatencyDisables(0), mIsLowLatencyModeOn(false), Loading Loading @@ -802,6 +811,18 @@ void MediaCodec::updateMediametrics() { mediametrics_setInt64(mMetricsHandle, kCodecLifetimeMs, lifetime); } if (mBytesEncoded) { Mutex::Autolock al(mOutputStatsLock); mediametrics_setInt64(mMetricsHandle, kCodecVideoEncodedBytes, mBytesEncoded); int64_t duration = 0; if (mLatestEncodedPtsUs > mEarliestEncodedPtsUs) { duration = mLatestEncodedPtsUs - mEarliestEncodedPtsUs; } mediametrics_setInt64(mMetricsHandle, kCodecVideoEncodedDurationUs, duration); mediametrics_setInt64(mMetricsHandle, kCodecVideoEncodedFrames, mFramesEncoded); } { Mutex::Autolock al(mLatencyLock); mediametrics_setInt64(mMetricsHandle, kCodecNumLowLatencyModeOn, mNumLowLatencyEnables); Loading Loading @@ -1005,10 +1026,34 @@ void MediaCodec::statsBufferSent(int64_t presentationUs) { } // when we get a buffer back from the codec void MediaCodec::statsBufferReceived(int64_t presentationUs) { void MediaCodec::statsBufferReceived(int64_t presentationUs, const sp<MediaCodecBuffer> &buffer) { CHECK_NE(mState, UNINITIALIZED); if (mIsVideo && (mFlags & kFlagIsEncoder)) { int32_t flags = 0; (void) buffer->meta()->findInt32("flags", &flags); // some of these frames, we don't want to count // standalone EOS.... has an invalid timestamp if ((flags & (BUFFER_FLAG_CODECCONFIG|BUFFER_FLAG_EOS)) == 0) { mBytesEncoded += buffer->size(); mFramesEncoded++; Mutex::Autolock al(mOutputStatsLock); int64_t timeUs = 0; if (buffer->meta()->findInt64("timeUs", &timeUs)) { if (timeUs > mLatestEncodedPtsUs) { mLatestEncodedPtsUs = timeUs; } // can't chain as an else-if or this never triggers if (timeUs < mEarliestEncodedPtsUs) { mEarliestEncodedPtsUs = timeUs; } } } } // mutex access to mBuffersInFlight and other stats Mutex::Autolock al(mLatencyLock); Loading Loading @@ -1064,7 +1109,7 @@ void MediaCodec::statsBufferReceived(int64_t presentationUs) { return; } // nowNs start our calculations // now start our calculations const int64_t nowNs = systemTime(SYSTEM_TIME_MONOTONIC); int64_t latencyUs = (nowNs - startdata.startedNs + 500) / 1000; Loading Loading @@ -1337,6 +1382,17 @@ status_t MediaCodec::configure( ALOGE("Invalid size(s), width=%d, height=%d", mVideoWidth, mVideoHeight); return BAD_VALUE; } } else { if (mMetricsHandle != 0) { int32_t channelCount; if (format->findInt32(KEY_CHANNEL_COUNT, &channelCount)) { mediametrics_setInt32(mMetricsHandle, kCodecChannelCount, channelCount); } int32_t sampleRate; if (format->findInt32(KEY_SAMPLE_RATE, &sampleRate)) { mediametrics_setInt32(mMetricsHandle, kCodecSampleRate, sampleRate); } } } updateLowLatency(format); Loading Loading @@ -2183,14 +2239,15 @@ bool MediaCodec::handleDequeueOutputBuffer(const sp<AReplyToken> &replyID, bool int64_t timeUs; CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); statsBufferReceived(timeUs); response->setInt64("timeUs", timeUs); int32_t flags; CHECK(buffer->meta()->findInt32("flags", &flags)); response->setInt32("flags", flags); statsBufferReceived(timeUs, buffer); response->postReply(replyID); } Loading Loading @@ -4337,13 +4394,13 @@ void MediaCodec::onOutputBufferAvailable() { msg->setInt64("timeUs", timeUs); statsBufferReceived(timeUs); int32_t flags; CHECK(buffer->meta()->findInt32("flags", &flags)); msg->setInt32("flags", flags); statsBufferReceived(timeUs, buffer); msg->post(); } } Loading media/libstagefright/include/media/stagefright/MediaCodec.h +9 −1 Original line number Diff line number Diff line Loading @@ -528,6 +528,14 @@ private: std::deque<BufferFlightTiming_t> mBuffersInFlight; Mutex mLatencyLock; int64_t mLatencyUnknown; // buffers for which we couldn't calculate latency Mutex mOutputStatsLock; int64_t mBytesEncoded = 0; int64_t mEarliestEncodedPtsUs = INT64_MAX; int64_t mLatestEncodedPtsUs = INT64_MIN; int32_t mFramesEncoded = 0; int64_t mNumLowLatencyEnables; // how many times low latency mode is enabled int64_t mNumLowLatencyDisables; // how many times low latency mode is disabled bool mIsLowLatencyModeOn; // is low latency mode on currently Loading @@ -544,7 +552,7 @@ private: sp<BatteryChecker> mBatteryChecker; void statsBufferSent(int64_t presentationUs); void statsBufferReceived(int64_t presentationUs); void statsBufferReceived(int64_t presentationUs, const sp<MediaCodecBuffer> &buffer); enum { // the default shape of our latency histogram buckets Loading Loading
drm/libmediadrm/DrmHal.cpp +7 −7 Original line number Diff line number Diff line Loading @@ -16,13 +16,9 @@ //#define LOG_NDEBUG 0 #define LOG_TAG "DrmHal" #include <iomanip> #include <utils/Log.h> #include <android/binder_manager.h> #include <aidl/android/media/BnResourceManagerClient.h> #include <android/binder_manager.h> #include <android/hardware/drm/1.2/types.h> #include <android/hidl/manager/1.2/IServiceManager.h> #include <hidl/ServiceManagement.h> Loading @@ -40,7 +36,9 @@ #include <mediadrm/DrmSessionManager.h> #include <mediadrm/IDrmMetricsConsumer.h> #include <mediadrm/DrmUtils.h> #include <utils/Log.h> #include <iomanip> #include <vector> using drm::V1_0::KeyedVector; Loading Loading @@ -364,7 +362,7 @@ sp<IDrmPlugin> DrmHal::makeDrmPlugin(const sp<IDrmFactory>& factory, Return<void> hResult = factory->createPlugin(uuid, appPackageName.string(), [&](Status status, const sp<IDrmPlugin>& hPlugin) { if (status != Status::OK) { DrmUtils::LOG2BE("Failed to make drm plugin: %d", status); DrmUtils::LOG2BE(uuid, "Failed to make drm plugin: %d", status); return; } plugin = hPlugin; Loading @@ -372,7 +370,8 @@ sp<IDrmPlugin> DrmHal::makeDrmPlugin(const sp<IDrmFactory>& factory, ); if (!hResult.isOk()) { DrmUtils::LOG2BE("createPlugin remote call failed"); DrmUtils::LOG2BE(uuid, "createPlugin remote call failed: %s", hResult.description().c_str()); } return plugin; Loading Loading @@ -580,6 +579,7 @@ status_t DrmHal::createPlugin(const uint8_t uuid[16], } if (mPlugin == NULL) { DrmUtils::LOG2BE(uuid, "No supported hal instance found"); mInitCheck = ERROR_UNSUPPORTED; } else { mInitCheck = OK; Loading
drm/libmediadrm/DrmUtils.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -108,7 +108,7 @@ sp<::V1_0::IDrmPlugin> MakeDrmPlugin(const sp<::V1_0::IDrmFactory> &factory, factory->createPlugin(toHidlArray16(uuid), hidl_string(appPackageName), [&](::V1_0::Status status, const sp<::V1_0::IDrmPlugin> &hPlugin) { if (status != ::V1_0::Status::OK) { LOG2BE("MakeDrmPlugin failed: %d", status); LOG2BE(uuid, "MakeDrmPlugin failed: %d", status); return; } plugin = hPlugin; Loading @@ -123,7 +123,7 @@ sp<::V1_0::ICryptoPlugin> MakeCryptoPlugin(const sp<::V1_0::ICryptoFactory> &fac factory->createPlugin(toHidlArray16(uuid), toHidlVec(initData, initDataSize), [&](::V1_0::Status status, const sp<::V1_0::ICryptoPlugin> &hPlugin) { if (status != ::V1_0::Status::OK) { LOG2BE("MakeCryptoPlugin failed: %d", status); LOG2BE(uuid, "MakeCryptoPlugin failed: %d", status); return; } plugin = hPlugin; Loading
drm/libmediadrm/interface/mediadrm/DrmUtils.h +14 −1 Original line number Diff line number Diff line Loading @@ -33,8 +33,10 @@ #include <cstdint> #include <ctime> #include <deque> #include <endian.h> #include <iterator> #include <mutex> #include <string> #include <vector> Loading Loading @@ -88,6 +90,14 @@ void LogToBuffer(android_LogPriority level, const char *fmt, Args... args) { } } template <typename... Args> void LogToBuffer(android_LogPriority level, const uint8_t uuid[16], const char *fmt, Args... args) { const uint64_t* uuid2 = reinterpret_cast<const uint64_t*>(uuid); std::string uuidFmt("uuid=[%lx %lx] "); uuidFmt += fmt; LogToBuffer(level, uuidFmt.c_str(), htobe64(uuid2[0]), htobe64(uuid2[1]), args...); } #ifndef LOG2BE #define LOG2BE(...) LogToBuffer(ANDROID_LOG_ERROR, __VA_ARGS__) #define LOG2BW(...) LogToBuffer(ANDROID_LOG_WARN, __VA_ARGS__) Loading Loading @@ -196,10 +206,13 @@ status_t GetLogMessages(const sp<U> &obj, Vector<::V1_4::LogMessage> &logs) { hResult = plugin->getLogMessages(cb); } if (!hResult.isOk()) { LOG2BW("%s::getLogMessages remote call failed", T::descriptor); LOG2BW("%s::getLogMessages remote call failed %s", T::descriptor, hResult.description().c_str()); } auto allLogs(gLogBuf.getLogs()); LOG2BI("framework logs size %zu; plugin logs size %zu", allLogs.size(), pluginLogs.size()); std::copy(pluginLogs.begin(), pluginLogs.end(), std::back_inserter(allLogs)); std::sort(allLogs.begin(), allLogs.end(), [](const ::V1_4::LogMessage &a, const ::V1_4::LogMessage &b) { Loading
media/libstagefright/MediaCodec.cpp +63 −6 Original line number Diff line number Diff line Loading @@ -118,6 +118,11 @@ static const char *kCodecQueueInputBufferError = "android.media.mediacodec.queue static const char *kCodecNumLowLatencyModeOn = "android.media.mediacodec.low-latency.on"; /* 0..n */ static const char *kCodecNumLowLatencyModeOff = "android.media.mediacodec.low-latency.off"; /* 0..n */ static const char *kCodecFirstFrameIndexLowLatencyModeOn = "android.media.mediacodec.low-latency.first-frame"; /* 0..n */ static const char *kCodecChannelCount = "android.media.mediacodec.channelCount"; static const char *kCodecSampleRate = "android.media.mediacodec.sampleRate"; static const char *kCodecVideoEncodedBytes = "android.media.mediacodec.vencode.bytes"; static const char *kCodecVideoEncodedFrames = "android.media.mediacodec.vencode.frames"; static const char *kCodecVideoEncodedDurationUs = "android.media.mediacodec.vencode.durationUs"; // the kCodecRecent* fields appear only in getMetrics() results static const char *kCodecRecentLatencyMax = "android.media.mediacodec.recent.max"; /* in us */ Loading Loading @@ -695,6 +700,10 @@ MediaCodec::MediaCodec( mHavePendingInputBuffers(false), mCpuBoostRequested(false), mLatencyUnknown(0), mBytesEncoded(0), mEarliestEncodedPtsUs(INT64_MAX), mLatestEncodedPtsUs(INT64_MIN), mFramesEncoded(0), mNumLowLatencyEnables(0), mNumLowLatencyDisables(0), mIsLowLatencyModeOn(false), Loading Loading @@ -802,6 +811,18 @@ void MediaCodec::updateMediametrics() { mediametrics_setInt64(mMetricsHandle, kCodecLifetimeMs, lifetime); } if (mBytesEncoded) { Mutex::Autolock al(mOutputStatsLock); mediametrics_setInt64(mMetricsHandle, kCodecVideoEncodedBytes, mBytesEncoded); int64_t duration = 0; if (mLatestEncodedPtsUs > mEarliestEncodedPtsUs) { duration = mLatestEncodedPtsUs - mEarliestEncodedPtsUs; } mediametrics_setInt64(mMetricsHandle, kCodecVideoEncodedDurationUs, duration); mediametrics_setInt64(mMetricsHandle, kCodecVideoEncodedFrames, mFramesEncoded); } { Mutex::Autolock al(mLatencyLock); mediametrics_setInt64(mMetricsHandle, kCodecNumLowLatencyModeOn, mNumLowLatencyEnables); Loading Loading @@ -1005,10 +1026,34 @@ void MediaCodec::statsBufferSent(int64_t presentationUs) { } // when we get a buffer back from the codec void MediaCodec::statsBufferReceived(int64_t presentationUs) { void MediaCodec::statsBufferReceived(int64_t presentationUs, const sp<MediaCodecBuffer> &buffer) { CHECK_NE(mState, UNINITIALIZED); if (mIsVideo && (mFlags & kFlagIsEncoder)) { int32_t flags = 0; (void) buffer->meta()->findInt32("flags", &flags); // some of these frames, we don't want to count // standalone EOS.... has an invalid timestamp if ((flags & (BUFFER_FLAG_CODECCONFIG|BUFFER_FLAG_EOS)) == 0) { mBytesEncoded += buffer->size(); mFramesEncoded++; Mutex::Autolock al(mOutputStatsLock); int64_t timeUs = 0; if (buffer->meta()->findInt64("timeUs", &timeUs)) { if (timeUs > mLatestEncodedPtsUs) { mLatestEncodedPtsUs = timeUs; } // can't chain as an else-if or this never triggers if (timeUs < mEarliestEncodedPtsUs) { mEarliestEncodedPtsUs = timeUs; } } } } // mutex access to mBuffersInFlight and other stats Mutex::Autolock al(mLatencyLock); Loading Loading @@ -1064,7 +1109,7 @@ void MediaCodec::statsBufferReceived(int64_t presentationUs) { return; } // nowNs start our calculations // now start our calculations const int64_t nowNs = systemTime(SYSTEM_TIME_MONOTONIC); int64_t latencyUs = (nowNs - startdata.startedNs + 500) / 1000; Loading Loading @@ -1337,6 +1382,17 @@ status_t MediaCodec::configure( ALOGE("Invalid size(s), width=%d, height=%d", mVideoWidth, mVideoHeight); return BAD_VALUE; } } else { if (mMetricsHandle != 0) { int32_t channelCount; if (format->findInt32(KEY_CHANNEL_COUNT, &channelCount)) { mediametrics_setInt32(mMetricsHandle, kCodecChannelCount, channelCount); } int32_t sampleRate; if (format->findInt32(KEY_SAMPLE_RATE, &sampleRate)) { mediametrics_setInt32(mMetricsHandle, kCodecSampleRate, sampleRate); } } } updateLowLatency(format); Loading Loading @@ -2183,14 +2239,15 @@ bool MediaCodec::handleDequeueOutputBuffer(const sp<AReplyToken> &replyID, bool int64_t timeUs; CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); statsBufferReceived(timeUs); response->setInt64("timeUs", timeUs); int32_t flags; CHECK(buffer->meta()->findInt32("flags", &flags)); response->setInt32("flags", flags); statsBufferReceived(timeUs, buffer); response->postReply(replyID); } Loading Loading @@ -4337,13 +4394,13 @@ void MediaCodec::onOutputBufferAvailable() { msg->setInt64("timeUs", timeUs); statsBufferReceived(timeUs); int32_t flags; CHECK(buffer->meta()->findInt32("flags", &flags)); msg->setInt32("flags", flags); statsBufferReceived(timeUs, buffer); msg->post(); } } Loading
media/libstagefright/include/media/stagefright/MediaCodec.h +9 −1 Original line number Diff line number Diff line Loading @@ -528,6 +528,14 @@ private: std::deque<BufferFlightTiming_t> mBuffersInFlight; Mutex mLatencyLock; int64_t mLatencyUnknown; // buffers for which we couldn't calculate latency Mutex mOutputStatsLock; int64_t mBytesEncoded = 0; int64_t mEarliestEncodedPtsUs = INT64_MAX; int64_t mLatestEncodedPtsUs = INT64_MIN; int32_t mFramesEncoded = 0; int64_t mNumLowLatencyEnables; // how many times low latency mode is enabled int64_t mNumLowLatencyDisables; // how many times low latency mode is disabled bool mIsLowLatencyModeOn; // is low latency mode on currently Loading @@ -544,7 +552,7 @@ private: sp<BatteryChecker> mBatteryChecker; void statsBufferSent(int64_t presentationUs); void statsBufferReceived(int64_t presentationUs); void statsBufferReceived(int64_t presentationUs, const sp<MediaCodecBuffer> &buffer); enum { // the default shape of our latency histogram buckets Loading