@ -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 ) ,
m AnalyticsItem( NULL ) ,
m MetricsHandle( 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 analyt ics record
m AnalyticsItem = new MediaAnalyticsItem ( kKeyPlayer ) ;
m AnalyticsItem- > setUid ( mClientUid ) ;
// set up media metr ics record
m MetricsHandle = mediametrics_create ( kKeyPlayer ) ;
m ediametrics_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 ;
m AnalyticsItem- > setCString ( kPlayerVMime , mime . c_str ( ) ) ;
m ediametrics_setCString( mMetricsHandle , kPlayerVMime , mime . c_str ( ) ) ;
if ( ! name . empty ( ) ) {
m AnalyticsItem- > setCString ( kPlayerVCodec , name . c_str ( ) ) ;
m ediametrics_setCString( mMetricsHandle , kPlayerVCodec , name . c_str ( ) ) ;
}
if ( stats - > findInt32 ( " width " , & width )
& & stats - > findInt32 ( " height " , & height ) ) {
m AnalyticsItem- > setInt32 ( kPlayerWidth , width ) ;
m AnalyticsItem- > setInt32 ( kPlayerHeight , height ) ;
m ediametrics_setInt32( mMetricsHandle , kPlayerWidth , width ) ;
m ediametrics_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 ) ;
m AnalyticsItem- > setInt64 ( kPlayerFrames , numFramesTotal ) ;
m AnalyticsItem- > setInt64 ( kPlayerFramesDropped , numFramesDropped ) ;
m ediametrics_setInt64( mMetricsHandle , kPlayerFrames , numFramesTotal ) ;
m ediametrics_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 ( ) ) ;
m ediametrics_setCString( mMetricsHandle , kPlayerAMime , mime . c_str ( ) ) ;
if ( ! name . empty ( ) ) {
m AnalyticsItem- > setCString ( kPlayerACodec , name . c_str ( ) ) ;
m ediametrics_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 ) ;
m AnalyticsItem- > setInt64 ( kPlayerDuration , duration_ms ) ;
m ediametrics_setInt64( mMetricsHandle , kPlayerDuration , duration_ms ) ;
m AnalyticsItem- > setInt64 ( kPlayerPlaying , ( mPlayingTimeUs + 500 ) / 1000 ) ;
m ediametrics_setInt64( mMetricsHandle , kPlayerPlaying , ( mPlayingTimeUs + 500 ) / 1000 ) ;
if ( mRebufferingEvents ! = 0 ) {
m AnalyticsItem- > setInt64 ( kPlayerRebuffering , ( mRebufferingTimeUs + 500 ) / 1000 ) ;
m AnalyticsItem- > setInt32 ( kPlayerRebufferingCount , mRebufferingEvents ) ;
m AnalyticsItem- > setInt32 ( kPlayerRebufferingAtExit , mRebufferingAtExit ) ;
m ediametrics_setInt64( mMetricsHandle , kPlayerRebuffering , ( mRebufferingTimeUs + 500 ) / 1000 ) ;
m ediametrics_setInt32( mMetricsHandle , kPlayerRebufferingCount , mRebufferingEvents ) ;
m ediametrics_setInt32( mMetricsHandle , kPlayerRebufferingAtExit , mRebufferingAtExit ) ;
}
m AnalyticsItem- > setCString ( kPlayerDataSourceType , mPlayer - > getDataSourceType ( ) ) ;
m ediametrics_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 ( m AnalyticsItem = = NULL | | mAnalyticsItem - > isEnabled( ) = = false ) {
if ( m MetricsHandle = = 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 ) {
m AnalyticsItem- > setInt32 ( kPlayerError , ext1 ) ;
m ediametrics_setInt32( mMetricsHandle , kPlayerError , ext1 ) ;
if ( ext2 ! = 0 ) {
m AnalyticsItem- > setInt32 ( kPlayerErrorCode , ext2 ) ;
m ediametrics_setInt32( mMetricsHandle , kPlayerErrorCode , ext2 ) ;
}
m AnalyticsItem- > setCString ( kPlayerErrorState , stateString ( mState ) . c_str ( ) ) ;
m ediametrics_setCString( mMetricsHandle , kPlayerErrorState , stateString ( mState ) . c_str ( ) ) ;
}
mAtEOS = true ;
break ;