Log additional NuPlayer information in bug reports
This change adds more logging from NuPlayer when obtaining
a bug report. NuPlayer's renderer will print whether it has occupied
the wake lock and for how much time. In addition, handlers attached
to the player's looper will also log if they are currently executing
a message (at the time of the bug report).
The above logs will help detect if the NuPlayer's wake lock is kept
acquired because the player looper is blocked on a specific handler.
Test: manual on device test, grabbed a bug-report while playing media
Change-Id: I3e91da9ea45a5fe270a0866054f695f5e844e8c7
Bug: 265531109
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
index 0382df3..9dae16e 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
@@ -478,6 +478,23 @@
msg->postAndAwaitResponse(&response);
}
+void NuPlayer::Renderer::dump(AString& logString) {
+ Mutex::Autolock autoLock(mLock);
+ logString.append("paused(");
+ logString.append(mPaused);
+ logString.append("), offloading(");
+ logString.append(offloadingAudio());
+ logString.append("), wakelock(acquired=");
+ mWakelockAcquireEvent.dump(logString);
+ logString.append(", timeout=");
+ mWakelockTimeoutEvent.dump(logString);
+ logString.append(", release=");
+ mWakelockReleaseEvent.dump(logString);
+ logString.append(", cancel=");
+ mWakelockCancelEvent.dump(logString);
+ logString.append(")");
+}
+
void NuPlayer::Renderer::changeAudioFormat(
const sp<AMessage> &format,
bool offloadOnly,
@@ -792,6 +809,10 @@
{
int32_t generation;
CHECK(msg->findInt32("drainGeneration", &generation));
+ mWakelockTimeoutEvent.updateValues(
+ uptimeMillis(),
+ generation,
+ mAudioOffloadPauseTimeoutGeneration);
if (generation != mAudioOffloadPauseTimeoutGeneration) {
break;
}
@@ -807,6 +828,10 @@
{
int32_t generation;
CHECK(msg->findInt32("drainGeneration", &generation));
+ mWakelockReleaseEvent.updateValues(
+ uptimeMillis(),
+ generation,
+ mAudioOffloadPauseTimeoutGeneration);
if (generation != mAudioOffloadPauseTimeoutGeneration) {
break;
}
@@ -1914,6 +1939,9 @@
void NuPlayer::Renderer::startAudioOffloadPauseTimeout() {
if (offloadingAudio()) {
mWakeLock->acquire();
+ mWakelockAcquireEvent.updateValues(uptimeMillis(),
+ mAudioOffloadPauseTimeoutGeneration,
+ mAudioOffloadPauseTimeoutGeneration);
sp<AMessage> msg = new AMessage(kWhatAudioOffloadPauseTimeout, this);
msg->setInt32("drainGeneration", mAudioOffloadPauseTimeoutGeneration);
msg->post(kOffloadPauseMaxUs);
@@ -1930,6 +1958,9 @@
// Note: The acquired wakelock prevents the device from suspending
// immediately after offload pause (in case a resume happens shortly thereafter).
mWakeLock->release(true);
+ mWakelockCancelEvent.updateValues(uptimeMillis(),
+ mAudioOffloadPauseTimeoutGeneration,
+ mAudioOffloadPauseTimeoutGeneration);
++mAudioOffloadPauseTimeoutGeneration;
}
@@ -2165,4 +2196,14 @@
notify->post();
}
+void NuPlayer::Renderer::WakeLockEvent::dump(AString& logString) {
+ logString.append("[");
+ logString.append(mTimeMs);
+ logString.append(",");
+ logString.append(mEventTimeoutGeneration);
+ logString.append(",");
+ logString.append(mRendererTimeoutGeneration);
+ logString.append("]");
+}
+
} // namespace android