connect APIs to mediaextractor getMetrics()
plumbing so that user level android.media.MediaExtractor.getMetrics()
will get down to where we keep the metrics and then haul them back
to the application. Includes the right hooks so that per-container-type
metrics will also be managed.
Bug: 35094936
Test: monitor dumpsys output, augmented CTS examination
diff --git a/include/media/IMediaExtractor.h b/include/media/IMediaExtractor.h
index e0a81f1..06db359 100644
--- a/include/media/IMediaExtractor.h
+++ b/include/media/IMediaExtractor.h
@@ -42,6 +42,8 @@
// returns an empty metadata object.
virtual sp<MetaData> getMetaData() = 0;
+ virtual status_t getMetrics(Parcel *reply) = 0;
+
enum Flags {
CAN_SEEK_BACKWARD = 1, // the "seek 10secs back button"
CAN_SEEK_FORWARD = 2, // the "seek 10secs forward button"
diff --git a/include/media/stagefright/MediaExtractor.h b/include/media/stagefright/MediaExtractor.h
index 211f794..9ce6cc5 100644
--- a/include/media/stagefright/MediaExtractor.h
+++ b/include/media/stagefright/MediaExtractor.h
@@ -48,6 +48,8 @@
// returns an empty metadata object.
virtual sp<MetaData> getMetaData();
+ status_t getMetrics(Parcel *reply);
+
enum Flags {
CAN_SEEK_BACKWARD = 1, // the "seek 10secs back button"
CAN_SEEK_FORWARD = 2, // the "seek 10secs forward button"
@@ -74,6 +76,8 @@
MediaAnalyticsItem *mAnalyticsItem;
+ virtual void populateMetrics();
+
private:
typedef bool (*SnifferFunc)(
diff --git a/include/media/stagefright/NuMediaExtractor.h b/include/media/stagefright/NuMediaExtractor.h
index e414757..ad0d37b 100644
--- a/include/media/stagefright/NuMediaExtractor.h
+++ b/include/media/stagefright/NuMediaExtractor.h
@@ -78,6 +78,7 @@
status_t getSampleTrackIndex(size_t *trackIndex);
status_t getSampleTime(int64_t *sampleTimeUs);
status_t getSampleMeta(sp<MetaData> *sampleMeta);
+ status_t getMetrics(Parcel *reply);
bool getCachedDuration(int64_t *durationUs, bool *eos) const;
diff --git a/media/libmedia/IMediaExtractor.cpp b/media/libmedia/IMediaExtractor.cpp
index 0f4f092..bfc43a6 100644
--- a/media/libmedia/IMediaExtractor.cpp
+++ b/media/libmedia/IMediaExtractor.cpp
@@ -36,7 +36,8 @@
FLAGS,
GETDRMTRACKINFO,
SETUID,
- NAME
+ NAME,
+ GETMETRICS
};
class BpMediaExtractor : public BpInterface<IMediaExtractor> {
@@ -94,6 +95,16 @@
return NULL;
}
+ virtual status_t getMetrics(Parcel * reply) {
+ Parcel data;
+ data.writeInterfaceToken(BpMediaExtractor::getInterfaceDescriptor());
+ status_t ret = remote()->transact(GETMETRICS, data, reply);
+ if (ret == NO_ERROR) {
+ return OK;
+ }
+ return UNKNOWN_ERROR;
+ }
+
virtual uint32_t flags() const {
ALOGV("flags NOT IMPLEMENTED");
return 0;
@@ -169,6 +180,11 @@
}
return UNKNOWN_ERROR;
}
+ case GETMETRICS: {
+ CHECK_INTERFACE(IMediaExtractor, data, reply);
+ status_t ret = getMetrics(reply);
+ return ret;
+ }
default:
return BBinder::onTransact(code, data, reply, flags);
}
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp
index 87d7d3c..5f9c167 100644
--- a/media/libstagefright/MPEG4Extractor.cpp
+++ b/media/libstagefright/MPEG4Extractor.cpp
@@ -5066,6 +5066,10 @@
return NULL;
}
+void MPEG4Extractor::populateMetrics() {
+ ALOGV("MPEG4Extractor::populateMetrics");
+}
+
static bool LegacySniffMPEG4(
const sp<DataSource> &source, String8 *mimeType, float *confidence) {
uint8_t header[8];
diff --git a/media/libstagefright/MediaExtractor.cpp b/media/libstagefright/MediaExtractor.cpp
index 677d43e..62c0d8a 100644
--- a/media/libstagefright/MediaExtractor.cpp
+++ b/media/libstagefright/MediaExtractor.cpp
@@ -55,7 +55,7 @@
namespace android {
// key for media statistics
-static const char *KeyName_Extractor = "extractor";
+static const char *kKeyExtractor = "extractor";
// attrs for media statistics
MediaExtractor::MediaExtractor() {
@@ -67,7 +67,7 @@
mAnalyticsItem = NULL;
if (MEDIA_LOG) {
- mAnalyticsItem = new MediaAnalyticsItem(KeyName_Extractor);
+ mAnalyticsItem = new MediaAnalyticsItem(kKeyExtractor);
(void) mAnalyticsItem->generateSessionID();
}
}
@@ -93,6 +93,23 @@
return new MetaData;
}
+status_t MediaExtractor::getMetrics(Parcel *reply) {
+
+ if (mAnalyticsItem == NULL || reply == NULL) {
+ return UNKNOWN_ERROR;
+ }
+
+ populateMetrics();
+ mAnalyticsItem->writeToParcel(reply);
+
+ return OK;
+}
+
+void MediaExtractor::populateMetrics() {
+ ALOGV("MediaExtractor::populateMetrics");
+ // normally overridden in subclasses
+}
+
uint32_t MediaExtractor::flags() const {
return CAN_SEEK_BACKWARD | CAN_SEEK_FORWARD | CAN_PAUSE | CAN_SEEK;
}
@@ -247,24 +264,23 @@
// track the container format (mpeg, aac, wvm, etc)
if (MEDIA_LOG) {
if (ret->mAnalyticsItem != NULL) {
+ size_t ntracks = ret->countTracks();
ret->mAnalyticsItem->setCString("fmt", ret->name());
// tracks (size_t)
- ret->mAnalyticsItem->setInt32("ntrk", ret->countTracks());
+ ret->mAnalyticsItem->setInt32("ntrk", ntracks);
// metadata
sp<MetaData> pMetaData = ret->getMetaData();
if (pMetaData != NULL) {
String8 xx = pMetaData->toString();
- ALOGD("metadata says: %s", xx.string());
- // can grab various fields like:
// 'titl' -- but this verges into PII
// 'mime'
const char *mime = NULL;
if (pMetaData->findCString(kKeyMIMEType, &mime)) {
ret->mAnalyticsItem->setCString("mime", mime);
}
- // what else is interesting here?
+ // what else is interesting and not already available?
}
- }
+ }
}
}
diff --git a/media/libstagefright/NuMediaExtractor.cpp b/media/libstagefright/NuMediaExtractor.cpp
index d25ce6c..1c1acb0 100644
--- a/media/libstagefright/NuMediaExtractor.cpp
+++ b/media/libstagefright/NuMediaExtractor.cpp
@@ -569,6 +569,11 @@
return OK;
}
+status_t NuMediaExtractor::getMetrics(Parcel *reply) {
+ status_t status = mImpl->getMetrics(reply);
+ return status;
+}
+
bool NuMediaExtractor::getTotalBitrate(int64_t *bitrate) const {
if (mTotalBitrate >= 0) {
*bitrate = mTotalBitrate;
diff --git a/media/libstagefright/include/MPEG4Extractor.h b/media/libstagefright/include/MPEG4Extractor.h
index fa05886..f847119 100644
--- a/media/libstagefright/include/MPEG4Extractor.h
+++ b/media/libstagefright/include/MPEG4Extractor.h
@@ -66,6 +66,8 @@
protected:
virtual ~MPEG4Extractor();
+ virtual void populateMetrics();
+
private:
struct PsshInfo {