From 733dba7fd3612f7fb64bb8a7bb055d5adaa14cce Mon Sep 17 00:00:00 2001 From: Santiago Seifert Date: Wed, 11 Nov 2020 23:49:28 +0000 Subject: [PATCH] Log MediaExtractor entry point to MediaMetrics Bug: 170386720 Test: atest libctsmediav2extractor_jni Test: atest CtsMediaTestCases Change-Id: I648e27b1b483a646df77e2a88ec5ac8af01a0bb9 Merged-In: I648e27b1b483a646df77e2a88ec5ac8af01a0bb9 --- cmds/stagefright/SimplePlayer.cpp | 2 +- cmds/stagefright/codec.cpp | 2 +- cmds/stagefright/mediafilter.cpp | 3 +- cmds/stagefright/muxer.cpp | 2 +- media/libmedia/IMediaExtractor.cpp | 20 +++++++++++- .../include/android/IMediaExtractor.h | 9 ++++++ media/libstagefright/NuMediaExtractor.cpp | 18 +++++++++-- media/libstagefright/RemoteMediaExtractor.cpp | 31 +++++++++++++++++++ .../media/stagefright/NuMediaExtractor.h | 8 ++++- .../media/stagefright/RemoteMediaExtractor.h | 1 + media/ndk/NdkMediaExtractor.cpp | 6 +++- services/mediametrics/statsd_extractor.cpp | 16 ++++++++++ 12 files changed, 109 insertions(+), 9 deletions(-) diff --git a/cmds/stagefright/SimplePlayer.cpp b/cmds/stagefright/SimplePlayer.cpp index f4b8164970..e000633b36 100644 --- a/cmds/stagefright/SimplePlayer.cpp +++ b/cmds/stagefright/SimplePlayer.cpp @@ -272,7 +272,7 @@ void SimplePlayer::onMessageReceived(const sp &msg) { status_t SimplePlayer::onPrepare() { CHECK_EQ(mState, UNPREPARED); - mExtractor = new NuMediaExtractor; + mExtractor = new NuMediaExtractor(NuMediaExtractor::EntryPoint::OTHER); status_t err = mExtractor->setDataSource( NULL /* httpService */, mPath.c_str()); diff --git a/cmds/stagefright/codec.cpp b/cmds/stagefright/codec.cpp index c26e0b90a5..33c46635e2 100644 --- a/cmds/stagefright/codec.cpp +++ b/cmds/stagefright/codec.cpp @@ -79,7 +79,7 @@ static int decode( static int64_t kTimeout = 500ll; - sp extractor = new NuMediaExtractor; + sp extractor = new NuMediaExtractor(NuMediaExtractor::EntryPoint::OTHER); if (extractor->setDataSource(NULL /* httpService */, path) != OK) { fprintf(stderr, "unable to instantiate extractor.\n"); return 1; diff --git a/cmds/stagefright/mediafilter.cpp b/cmds/stagefright/mediafilter.cpp index b894545089..ca058ab4c5 100644 --- a/cmds/stagefright/mediafilter.cpp +++ b/cmds/stagefright/mediafilter.cpp @@ -319,7 +319,8 @@ static int decode( static int64_t kTimeout = 500ll; - sp extractor = new NuMediaExtractor; + sp extractor = new NuMediaExtractor(NuMediaExtractor::EntryPoint::OTHER); + if (extractor->setDataSource(NULL /* httpService */, path) != OK) { fprintf(stderr, "unable to instantiate extractor.\n"); return 1; diff --git a/cmds/stagefright/muxer.cpp b/cmds/stagefright/muxer.cpp index 4a83a4aac8..bc7e41e968 100644 --- a/cmds/stagefright/muxer.cpp +++ b/cmds/stagefright/muxer.cpp @@ -62,7 +62,7 @@ static int muxing( int trimEndTimeMs, int rotationDegrees, MediaMuxer::OutputFormat container = MediaMuxer::OUTPUT_FORMAT_MPEG_4) { - sp extractor = new NuMediaExtractor; + sp extractor = new NuMediaExtractor(NuMediaExtractor::EntryPoint::OTHER); if (extractor->setDataSource(NULL /* httpService */, path) != OK) { fprintf(stderr, "unable to instantiate extractor. %s\n", path); return 1; diff --git a/media/libmedia/IMediaExtractor.cpp b/media/libmedia/IMediaExtractor.cpp index 39caf53004..7ed76d8b20 100644 --- a/media/libmedia/IMediaExtractor.cpp +++ b/media/libmedia/IMediaExtractor.cpp @@ -38,7 +38,8 @@ enum { FLAGS, SETMEDIACAS, NAME, - GETMETRICS + GETMETRICS, + SETENTRYPOINT }; class BpMediaExtractor : public BpInterface { @@ -142,6 +143,13 @@ public: } return nm; } + + virtual status_t setEntryPoint(EntryPoint entryPoint) { + Parcel data, reply; + data.writeInterfaceToken(BpMediaExtractor::getInterfaceDescriptor()); + data.writeInt32(static_cast(entryPoint)); + return remote()->transact(SETENTRYPOINT, data, &reply); + } }; IMPLEMENT_META_INTERFACE(MediaExtractor, "android.media.IMediaExtractor"); @@ -232,6 +240,16 @@ status_t BnMediaExtractor::onTransact( reply->writeString8(nm); return NO_ERROR; } + case SETENTRYPOINT: { + ALOGV("setEntryPoint"); + CHECK_INTERFACE(IMediaExtractor, data, reply); + int32_t entryPoint; + status_t err = data.readInt32(&entryPoint); + if (err == OK) { + setEntryPoint(EntryPoint(entryPoint)); + } + return err; + } default: return BBinder::onTransact(code, data, reply, flags); } diff --git a/media/libmedia/include/android/IMediaExtractor.h b/media/libmedia/include/android/IMediaExtractor.h index 3e035ad304..f9cafdeafd 100644 --- a/media/libmedia/include/android/IMediaExtractor.h +++ b/media/libmedia/include/android/IMediaExtractor.h @@ -63,6 +63,15 @@ public: virtual status_t setMediaCas(const HInterfaceToken &casToken) = 0; virtual String8 name() = 0; + + enum class EntryPoint { + SDK = 1, + NDK_WITH_JVM = 2, + NDK_NO_JVM = 3, + OTHER = 4, + }; + + virtual status_t setEntryPoint(EntryPoint entryPoint) = 0; }; diff --git a/media/libstagefright/NuMediaExtractor.cpp b/media/libstagefright/NuMediaExtractor.cpp index 050d7c2e65..c6385079dd 100644 --- a/media/libstagefright/NuMediaExtractor.cpp +++ b/media/libstagefright/NuMediaExtractor.cpp @@ -50,8 +50,9 @@ NuMediaExtractor::Sample::Sample(MediaBufferBase *buffer, int64_t timeUs) mSampleTimeUs(timeUs) { } -NuMediaExtractor::NuMediaExtractor() - : mTotalBitrate(-1LL), +NuMediaExtractor::NuMediaExtractor(EntryPoint entryPoint) + : mEntryPoint(entryPoint), + mTotalBitrate(-1LL), mDurationUs(-1LL) { } @@ -93,6 +94,7 @@ status_t NuMediaExtractor::setDataSource( if (mImpl == NULL) { return ERROR_UNSUPPORTED; } + setEntryPointToRemoteMediaExtractor(); status_t err = OK; if (!mCasToken.empty()) { @@ -134,6 +136,7 @@ status_t NuMediaExtractor::setDataSource(int fd, off64_t offset, off64_t size) { if (mImpl == NULL) { return ERROR_UNSUPPORTED; } + setEntryPointToRemoteMediaExtractor(); if (!mCasToken.empty()) { err = mImpl->setMediaCas(mCasToken); @@ -168,6 +171,7 @@ status_t NuMediaExtractor::setDataSource(const sp &source) { if (mImpl == NULL) { return ERROR_UNSUPPORTED; } + setEntryPointToRemoteMediaExtractor(); if (!mCasToken.empty()) { err = mImpl->setMediaCas(mCasToken); @@ -468,6 +472,16 @@ void NuMediaExtractor::releaseAllTrackSamples() { } } +void NuMediaExtractor::setEntryPointToRemoteMediaExtractor() { + if (mImpl == NULL) { + return; + } + status_t err = mImpl->setEntryPoint(mEntryPoint); + if (err != OK) { + ALOGW("Failed to set entry point with error %d.", err); + } +} + ssize_t NuMediaExtractor::fetchAllTrackSamples( int64_t seekTimeUs, MediaSource::ReadOptions::SeekMode mode) { TrackInfo *minInfo = NULL; diff --git a/media/libstagefright/RemoteMediaExtractor.cpp b/media/libstagefright/RemoteMediaExtractor.cpp index 25e43c28e1..381eb1ad95 100644 --- a/media/libstagefright/RemoteMediaExtractor.cpp +++ b/media/libstagefright/RemoteMediaExtractor.cpp @@ -39,6 +39,12 @@ static const char *kKeyExtractor = "extractor"; static const char *kExtractorFormat = "android.media.mediaextractor.fmt"; static const char *kExtractorMime = "android.media.mediaextractor.mime"; static const char *kExtractorTracks = "android.media.mediaextractor.ntrk"; +static const char *kExtractorEntryPoint = "android.media.mediaextractor.entry"; + +static const char *kEntryPointSdk = "sdk"; +static const char *kEntryPointWithJvm = "ndk-with-jvm"; +static const char *kEntryPointNoJvm = "ndk-no-jvm"; +static const char *kEntryPointOther = "other"; RemoteMediaExtractor::RemoteMediaExtractor( MediaExtractor *extractor, @@ -74,6 +80,9 @@ RemoteMediaExtractor::RemoteMediaExtractor( } // what else is interesting and not already available? } + // By default, we set the entry point to be "other". Clients of this + // class will override this value by calling setEntryPoint. + mMetricsItem->setCString(kExtractorEntryPoint, kEntryPointOther); } } @@ -143,6 +152,28 @@ String8 RemoteMediaExtractor::name() { return String8(mExtractor->name()); } +status_t RemoteMediaExtractor::setEntryPoint(EntryPoint entryPoint) { + const char* entryPointString; + switch (entryPoint) { + case EntryPoint::SDK: + entryPointString = kEntryPointSdk; + break; + case EntryPoint::NDK_WITH_JVM: + entryPointString = kEntryPointWithJvm; + break; + case EntryPoint::NDK_NO_JVM: + entryPointString = kEntryPointNoJvm; + break; + case EntryPoint::OTHER: + entryPointString = kEntryPointOther; + break; + default: + return BAD_VALUE; + } + mMetricsItem->setCString(kExtractorEntryPoint, entryPointString); + return OK; +} + //////////////////////////////////////////////////////////////////////////////// // static diff --git a/media/libstagefright/include/media/stagefright/NuMediaExtractor.h b/media/libstagefright/include/media/stagefright/NuMediaExtractor.h index 227cead0e8..d8f2b001b9 100644 --- a/media/libstagefright/include/media/stagefright/NuMediaExtractor.h +++ b/media/libstagefright/include/media/stagefright/NuMediaExtractor.h @@ -47,12 +47,14 @@ struct NuMediaExtractor : public RefBase { SAMPLE_FLAG_ENCRYPTED = 2, }; + typedef IMediaExtractor::EntryPoint EntryPoint; + // identical to IMediaExtractor::GetTrackMetaDataFlags enum GetTrackFormatFlags { kIncludeExtensiveMetaData = 1, // reads sample table and possibly stream headers }; - NuMediaExtractor(); + explicit NuMediaExtractor(EntryPoint entryPoint); status_t setDataSource( const sp &httpService, @@ -128,6 +130,8 @@ private: uint32_t mTrackFlags; // bitmask of "TrackFlags" }; + const EntryPoint mEntryPoint; + mutable Mutex mLock; sp mDataSource; @@ -139,6 +143,8 @@ private: int64_t mTotalBitrate; // in bits/sec int64_t mDurationUs; + void setEntryPointToRemoteMediaExtractor(); + ssize_t fetchAllTrackSamples( int64_t seekTimeUs = -1ll, MediaSource::ReadOptions::SeekMode mode = diff --git a/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h b/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h index 2ce7bc7b6f..25125f2659 100644 --- a/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h +++ b/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h @@ -42,6 +42,7 @@ public: virtual uint32_t flags() const; virtual status_t setMediaCas(const HInterfaceToken &casToken); virtual String8 name(); + virtual status_t setEntryPoint(EntryPoint entryPoint); private: MediaExtractor *mExtractor; diff --git a/media/ndk/NdkMediaExtractor.cpp b/media/ndk/NdkMediaExtractor.cpp index 0da0740fc9..0c65e9e552 100644 --- a/media/ndk/NdkMediaExtractor.cpp +++ b/media/ndk/NdkMediaExtractor.cpp @@ -22,6 +22,7 @@ #include #include #include +#include "NdkJavaVMHelperPriv.h" #include "NdkMediaDataSourcePriv.h" @@ -63,7 +64,10 @@ EXPORT AMediaExtractor* AMediaExtractor_new() { ALOGV("ctor"); AMediaExtractor *mData = new AMediaExtractor(); - mData->mImpl = new NuMediaExtractor(); + mData->mImpl = new NuMediaExtractor( + NdkJavaVMHelper::getJNIEnv() != nullptr + ? NuMediaExtractor::EntryPoint::NDK_WITH_JVM + : NuMediaExtractor::EntryPoint::NDK_NO_JVM ); return mData; } diff --git a/services/mediametrics/statsd_extractor.cpp b/services/mediametrics/statsd_extractor.cpp index 3d5739fc8b..fb0924cafb 100644 --- a/services/mediametrics/statsd_extractor.cpp +++ b/services/mediametrics/statsd_extractor.cpp @@ -71,6 +71,22 @@ bool statsd_extractor(const mediametrics::Item *item) metrics_proto.set_tracks(ntrk); } + // android.media.mediaextractor.entry string + std::string entry_point_string; + if (item->getString("android.media.mediaextractor.entry", &entry_point_string)) { + stats::mediametrics::ExtractorData::EntryPoint entry_point; + if (entry_point_string == "sdk") { + entry_point = stats::mediametrics::ExtractorData_EntryPoint_SDK; + } else if (entry_point_string == "ndk-with-jvm") { + entry_point = stats::mediametrics::ExtractorData_EntryPoint_NDK_WITH_JVM; + } else if (entry_point_string == "ndk-no-jvm") { + entry_point = stats::mediametrics::ExtractorData_EntryPoint_NDK_NO_JVM; + } else { + entry_point = stats::mediametrics::ExtractorData_EntryPoint_OTHER; + } + metrics_proto.set_entry_point(entry_point); + } + std::string serialized; if (!metrics_proto.SerializeToString(&serialized)) { ALOGE("Failed to serialize extractor metrics");