MediaPlayer2 using the new mediametrics stable interface

converts mediaplayer2 to use the new interface.

Bug: 112555455
Test: boot / relevant ctsMediaTests
Change-Id: I186c1931408414e9fd42bbc501e636a9624b6a6e
gugelfrei
Ray Essick 6 years ago
parent ba8c48429d
commit 89269d69b4

@ -214,6 +214,8 @@ public:
virtual status_t setParameter(int key, const Parcel &request) = 0;
virtual status_t getParameter(int key, Parcel *reply) = 0;
virtual status_t getMetrics(char **buffer, size_t *length) = 0;
// Invoke a generic method on the player by using opaque parcels
// for the request and reply.
//

@ -102,6 +102,7 @@ public:
status_t setAudioAttributes(const jobject attributes);
jobject getAudioAttributes();
status_t getParameter(int key, Parcel* reply);
status_t getMetrics(char **buffer, size_t *length);
// Modular DRM
status_t prepareDrm(int64_t srcId,

@ -21,7 +21,6 @@
#include <android/binder_ibinder.h>
#include <media/AudioSystem.h>
#include <media/DataSourceDesc.h>
#include <media/MediaAnalyticsItem.h>
#include <media/MemoryLeakTrackUtil.h>
#include <media/NdkWrapper.h>
#include <media/stagefright/foundation/ADebug.h>
@ -979,6 +978,22 @@ status_t MediaPlayer2::getParameter(int key, Parcel *reply) {
return status;
}
// for mediametrics
status_t MediaPlayer2::getMetrics(char **buffer, size_t *length) {
ALOGD("MediaPlayer2::getMetrics()");
Mutex::Autolock _l(mLock);
if (mPlayer == NULL) {
ALOGV("getMetrics: no active player");
return INVALID_OPERATION;
}
status_t status = mPlayer->getMetrics(buffer, length);
if (status != OK) {
ALOGD("getMetrics returns %d", status);
}
return status;
}
void MediaPlayer2::notify(int64_t srcId, int msg, int ext1, int ext2, const PlayerMessage *obj) {
ALOGV("message received srcId=%lld, msg=%d, ext1=%d, ext2=%d",
(long long)srcId, msg, ext1, ext2);

@ -51,6 +51,7 @@ cc_library_static {
"libui",
"libgui",
"libmedia",
"libmediametrics",
"libmediandk",
"libmediandk_utils",
"libpowermanager",

@ -107,6 +107,8 @@ sp<AMessage> NuPlayer2::Decoder::getStats() const {
mStats->setInt64("frames-total", mNumFramesTotal);
mStats->setInt64("frames-dropped-input", mNumInputFramesDropped);
mStats->setInt64("frames-dropped-output", mNumOutputFramesDropped);
mStats->setFloat("frame-rate-total", mFrameRateTotal);
return mStats;
}

@ -92,6 +92,7 @@ static const char *kPlayerWidth = "android.media.mediaplayer.width";
static const char *kPlayerHeight = "android.media.mediaplayer.height";
static const char *kPlayerFrames = "android.media.mediaplayer.frames";
static const char *kPlayerFramesDropped = "android.media.mediaplayer.dropped";
static const char *kPlayerFrameRate = "android.media.mediaplayer.fps";
static const char *kPlayerAMime = "android.media.mediaplayer.audio.mime";
static const char *kPlayerACodec = "android.media.mediaplayer.audio.codec";
static const char *kPlayerDuration = "android.media.mediaplayer.durationMs";
@ -125,7 +126,7 @@ NuPlayer2Driver::NuPlayer2Driver(pid_t pid, uid_t uid, const sp<JObjectHolder> &
mMediaClock(new MediaClock),
mPlayer(new NuPlayer2(pid, uid, mMediaClock, context)),
mPlayerFlags(0),
mAnalyticsItem(NULL),
mMetricsHandle(0),
mClientUid(uid),
mAtEOS(false),
mLooping(false),
@ -136,9 +137,9 @@ NuPlayer2Driver::NuPlayer2Driver(pid_t pid, uid_t uid, const sp<JObjectHolder> &
mMediaClock->init();
// set up an analytics record
mAnalyticsItem = new MediaAnalyticsItem(kKeyPlayer);
mAnalyticsItem->setUid(mClientUid);
// set up media metrics record
mMetricsHandle = mediametrics_create(kKeyPlayer);
mediametrics_setUid(mMetricsHandle, mClientUid);
mNuPlayer2Looper->start(
false, /* runOnCallingThread */
@ -159,10 +160,7 @@ NuPlayer2Driver::~NuPlayer2Driver() {
updateMetrics("destructor");
logMetrics("destructor");
if (mAnalyticsItem != NULL) {
delete mAnalyticsItem;
mAnalyticsItem = NULL;
}
mediametrics_delete(mMetricsHandle);
}
status_t NuPlayer2Driver::initCheck() {
@ -453,15 +451,15 @@ void NuPlayer2Driver::updateMetrics(const char *where) {
if (mime.startsWith("video/")) {
int32_t width, height;
mAnalyticsItem->setCString(kPlayerVMime, mime.c_str());
mediametrics_setCString(mMetricsHandle, kPlayerVMime, mime.c_str());
if (!name.empty()) {
mAnalyticsItem->setCString(kPlayerVCodec, name.c_str());
mediametrics_setCString(mMetricsHandle, kPlayerVCodec, name.c_str());
}
if (stats->findInt32("width", &width)
&& stats->findInt32("height", &height)) {
mAnalyticsItem->setInt32(kPlayerWidth, width);
mAnalyticsItem->setInt32(kPlayerHeight, height);
mediametrics_setInt32(mMetricsHandle, kPlayerWidth, width);
mediametrics_setInt32(mMetricsHandle, kPlayerHeight, height);
}
int64_t numFramesTotal = 0;
@ -469,14 +467,18 @@ void NuPlayer2Driver::updateMetrics(const char *where) {
stats->findInt64("frames-total", &numFramesTotal);
stats->findInt64("frames-dropped-output", &numFramesDropped);
mAnalyticsItem->setInt64(kPlayerFrames, numFramesTotal);
mAnalyticsItem->setInt64(kPlayerFramesDropped, numFramesDropped);
mediametrics_setInt64(mMetricsHandle, kPlayerFrames, numFramesTotal);
mediametrics_setInt64(mMetricsHandle, kPlayerFramesDropped, numFramesDropped);
float frameRate = 0;
if (stats->findFloat("frame-rate-output", &frameRate)) {
mediametrics_setInt64(mMetricsHandle, kPlayerFrameRate, frameRate);
}
} else if (mime.startsWith("audio/")) {
mAnalyticsItem->setCString(kPlayerAMime, mime.c_str());
mediametrics_setCString(mMetricsHandle, kPlayerAMime, mime.c_str());
if (!name.empty()) {
mAnalyticsItem->setCString(kPlayerACodec, name.c_str());
mediametrics_setCString(mMetricsHandle, kPlayerACodec, name.c_str());
}
}
}
@ -487,17 +489,17 @@ void NuPlayer2Driver::updateMetrics(const char *where) {
// getDuration() uses mLock for mutex -- careful where we use it.
int64_t duration_ms = -1;
getDuration(&duration_ms);
mAnalyticsItem->setInt64(kPlayerDuration, duration_ms);
mediametrics_setInt64(mMetricsHandle, kPlayerDuration, duration_ms);
mAnalyticsItem->setInt64(kPlayerPlaying, (mPlayingTimeUs+500)/1000 );
mediametrics_setInt64(mMetricsHandle, kPlayerPlaying, (mPlayingTimeUs+500)/1000 );
if (mRebufferingEvents != 0) {
mAnalyticsItem->setInt64(kPlayerRebuffering, (mRebufferingTimeUs+500)/1000 );
mAnalyticsItem->setInt32(kPlayerRebufferingCount, mRebufferingEvents);
mAnalyticsItem->setInt32(kPlayerRebufferingAtExit, mRebufferingAtExit);
mediametrics_setInt64(mMetricsHandle, kPlayerRebuffering, (mRebufferingTimeUs+500)/1000 );
mediametrics_setInt32(mMetricsHandle, kPlayerRebufferingCount, mRebufferingEvents);
mediametrics_setInt32(mMetricsHandle, kPlayerRebufferingAtExit, mRebufferingAtExit);
}
mAnalyticsItem->setCString(kPlayerDataSourceType, mPlayer->getDataSourceType());
mediametrics_setCString(mMetricsHandle, kPlayerDataSourceType, mPlayer->getDataSourceType());
}
@ -507,7 +509,7 @@ void NuPlayer2Driver::logMetrics(const char *where) {
}
ALOGV("logMetrics(%p) from %s at state %d", this, where, mState);
if (mAnalyticsItem == NULL || mAnalyticsItem->isEnabled() == false) {
if (mMetricsHandle == 0 || mediametrics_isEnabled() == false) {
return;
}
@ -516,16 +518,12 @@ void NuPlayer2Driver::logMetrics(const char *where) {
// and that always injects 3 fields (duration, playing time, and
// datasource) into the record.
// So the canonical "empty" record has 3 elements in it.
if (mAnalyticsItem->count() > 3) {
mAnalyticsItem->selfrecord();
if (mediametrics_count(mMetricsHandle) > 3) {
mediametrics_selfRecord(mMetricsHandle);
// re-init in case we prepare() and start() again.
delete mAnalyticsItem ;
mAnalyticsItem = new MediaAnalyticsItem(kKeyPlayer);
if (mAnalyticsItem) {
mAnalyticsItem->setUid(mClientUid);
}
mediametrics_delete(mMetricsHandle);
mMetricsHandle = mediametrics_create(kKeyPlayer);
mediametrics_setUid(mMetricsHandle, mClientUid);
} else {
ALOGV("did not have anything to record");
}
@ -649,17 +647,16 @@ status_t NuPlayer2Driver::setParameter(
return INVALID_OPERATION;
}
status_t NuPlayer2Driver::getParameter(int key, Parcel *reply) {
status_t NuPlayer2Driver::getParameter(int key __unused, Parcel *reply __unused) {
return INVALID_OPERATION;
}
if (key == FOURCC('m','t','r','X')) {
// mtrX -- a play on 'metrics' (not matrix)
// gather current info all together, parcel it, and send it back
updateMetrics("api");
mAnalyticsItem->writeToParcel(reply);
status_t NuPlayer2Driver::getMetrics(char **buffer, size_t *length) {
updateMetrics("api");
if (mediametrics_getAttributes(mMetricsHandle, buffer, length))
return OK;
}
return INVALID_OPERATION;
else
return FAILED_TRANSACTION;
}
void NuPlayer2Driver::notifyResetComplete(int64_t /* srcId */) {
@ -867,11 +864,11 @@ void NuPlayer2Driver::notifyListener_l(
// ext1 is our primary 'error type' value. Only add ext2 when non-zero.
// [test against msg is due to fall through from previous switch value]
if (msg == MEDIA2_ERROR) {
mAnalyticsItem->setInt32(kPlayerError, ext1);
mediametrics_setInt32(mMetricsHandle, kPlayerError, ext1);
if (ext2 != 0) {
mAnalyticsItem->setInt32(kPlayerErrorCode, ext2);
mediametrics_setInt32(mMetricsHandle, kPlayerErrorCode, ext2);
}
mAnalyticsItem->setCString(kPlayerErrorState, stateString(mState).c_str());
mediametrics_setCString(mMetricsHandle, kPlayerErrorState, stateString(mState).c_str());
}
mAtEOS = true;
break;

@ -16,7 +16,7 @@
#include <mediaplayer2/MediaPlayer2Interface.h>
#include <media/MediaAnalyticsItem.h>
#include <media/MediaMetrics.h>
#include <media/stagefright/foundation/ABase.h>
#include <mediaplayer2/JObjectHolder.h>
@ -61,6 +61,7 @@ struct NuPlayer2Driver : public MediaPlayer2Interface {
virtual void setAudioSink(const sp<AudioSink> &audioSink) override;
virtual status_t setParameter(int key, const Parcel &request) override;
virtual status_t getParameter(int key, Parcel *reply) override;
virtual status_t getMetrics(char **buf, size_t *length) override;
virtual status_t dump(int fd, const Vector<String16> &args) const override;
@ -132,7 +133,7 @@ private:
sp<AudioSink> mAudioSink;
uint32_t mPlayerFlags;
MediaAnalyticsItem *mAnalyticsItem;
mediametrics_handle_t mMetricsHandle;
uid_t mClientUid;
bool mAtEOS;

Loading…
Cancel
Save