stagefright: verbose logging for media connect/disconnect
bug: 35364355
Change-Id: I7b5f0aecf98733255cc27b091fea78298fa7e602
diff --git a/include/media/stagefright/SurfaceUtils.h b/include/media/stagefright/SurfaceUtils.h
index 13d580c..a7747c7 100644
--- a/include/media/stagefright/SurfaceUtils.h
+++ b/include/media/stagefright/SurfaceUtils.h
@@ -33,6 +33,8 @@
ANativeWindow *nativeWindow /* nonnull */,
int width, int height, int format, int rotation, int usage, bool reconnect);
status_t pushBlankBuffersToNativeWindow(ANativeWindow *nativeWindow /* nonnull */);
+status_t nativeWindowConnect(ANativeWindow *surface, const char *reason);
+status_t nativeWindowDisconnect(ANativeWindow *surface, const char *reason);
} // namespace android
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index dbc7e21..a8b6c66 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -60,6 +60,7 @@
#include <media/stagefright/Utils.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ALooperRoster.h>
+#include <media/stagefright/SurfaceUtils.h>
#include <mediautils/BatteryNotifier.h>
#include <memunreachable/memunreachable.h>
@@ -903,11 +904,11 @@
void MediaPlayerService::Client::disconnectNativeWindow() {
if (mConnectedWindow != NULL) {
- status_t err = native_window_api_disconnect(mConnectedWindow.get(),
- NATIVE_WINDOW_API_MEDIA);
+ status_t err = nativeWindowDisconnect(
+ mConnectedWindow.get(), "disconnectNativeWindow");
if (err != OK) {
- ALOGW("native_window_api_disconnect returned an error: %s (%d)",
+ ALOGW("nativeWindowDisconnect returned an error: %s (%d)",
strerror(-err), err);
}
}
@@ -929,8 +930,7 @@
sp<ANativeWindow> anw;
if (bufferProducer != NULL) {
anw = new Surface(bufferProducer, true /* controlledByApp */);
- status_t err = native_window_api_connect(anw.get(),
- NATIVE_WINDOW_API_MEDIA);
+ status_t err = nativeWindowConnect(anw.get(), "setVideoSurfaceTexture");
if (err != OK) {
ALOGE("setVideoSurfaceTexture failed: %d", err);
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
index 5689e95..9a2224e 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
@@ -37,7 +37,7 @@
#include <media/stagefright/MediaCodec.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaErrors.h>
-
+#include <media/stagefright/SurfaceUtils.h>
#include <gui/Surface.h>
#include "avc_utils.h"
@@ -232,21 +232,21 @@
//
// at this point MediaPlayerService::client has already connected to the
// surface, which MediaCodec does not expect
- err = native_window_api_disconnect(surface.get(), NATIVE_WINDOW_API_MEDIA);
+ err = nativeWindowDisconnect(surface.get(), "kWhatSetVideoSurface(surface)");
if (err == OK) {
err = mCodec->setSurface(surface);
ALOGI_IF(err, "codec setSurface returned: %d", err);
if (err == OK) {
// reconnect to the old surface as MPS::Client will expect to
// be able to disconnect from it.
- (void)native_window_api_connect(mSurface.get(), NATIVE_WINDOW_API_MEDIA);
+ (void)nativeWindowConnect(mSurface.get(), "kWhatSetVideoSurface(mSurface)");
mSurface = surface;
}
}
if (err != OK) {
// reconnect to the new surface on error as MPS::Client will expect to
// be able to disconnect from it.
- (void)native_window_api_connect(surface.get(), NATIVE_WINDOW_API_MEDIA);
+ (void)nativeWindowConnect(surface.get(), "kWhatSetVideoSurface(err)");
}
}
@@ -313,8 +313,7 @@
status_t err;
if (mSurface != NULL) {
// disconnect from surface as MediaCodec will reconnect
- err = native_window_api_disconnect(
- mSurface.get(), NATIVE_WINDOW_API_MEDIA);
+ err = nativeWindowDisconnect(mSurface.get(), "onConfigure");
// We treat this as a warning, as this is a preparatory step.
// Codec will try to connect to the surface, which is where
// any error signaling will occur.
@@ -510,8 +509,7 @@
if (mSurface != NULL) {
// reconnect to surface as MediaCodec disconnected from it
- status_t error =
- native_window_api_connect(mSurface.get(), NATIVE_WINDOW_API_MEDIA);
+ status_t error = nativeWindowConnect(mSurface.get(), "onShutdown");
ALOGW_IF(error != NO_ERROR,
"[%s] failed to connect to native window, error=%d",
mComponentName.c_str(), error);
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp
index cbd5802..03010ab 100644
--- a/media/libstagefright/MediaCodec.cpp
+++ b/media/libstagefright/MediaCodec.cpp
@@ -2914,7 +2914,7 @@
return ALREADY_EXISTS;
}
- err = native_window_api_connect(surface.get(), NATIVE_WINDOW_API_MEDIA);
+ err = nativeWindowConnect(surface.get(), "connectToSurface");
if (err == OK) {
// Require a fresh set of buffers after each connect by using a unique generation
// number. Rely on the fact that max supported process id by Linux is 2^22.
@@ -2929,12 +2929,12 @@
// This is needed as the consumer may be holding onto stale frames that it can reattach
// to this surface after disconnect/connect, and those free frames would inherit the new
// generation number. Disconnecting after setting a unique generation prevents this.
- native_window_api_disconnect(surface.get(), NATIVE_WINDOW_API_MEDIA);
- err = native_window_api_connect(surface.get(), NATIVE_WINDOW_API_MEDIA);
+ nativeWindowDisconnect(surface.get(), "connectToSurface(reconnect)");
+ err = nativeWindowConnect(surface.get(), "connectToSurface(reconnect)");
}
if (err != OK) {
- ALOGE("native_window_api_connect returned an error: %s (%d)", strerror(-err), err);
+ ALOGE("nativeWindowConnect returned an error: %s (%d)", strerror(-err), err);
}
}
// do not return ALREADY_EXISTS unless surfaces are the same
@@ -2946,9 +2946,9 @@
if (mSurface != NULL) {
// Resetting generation is not technically needed, but there is no need to keep it either
mSurface->setGenerationNumber(0);
- err = native_window_api_disconnect(mSurface.get(), NATIVE_WINDOW_API_MEDIA);
+ err = nativeWindowDisconnect(mSurface.get(), "disconnectFromSurface");
if (err != OK) {
- ALOGW("native_window_api_disconnect returned an error: %s (%d)", strerror(-err), err);
+ ALOGW("nativeWindowDisconnect returned an error: %s (%d)", strerror(-err), err);
}
// assume disconnected even on error
mSurface.clear();
diff --git a/media/libstagefright/SurfaceUtils.cpp b/media/libstagefright/SurfaceUtils.cpp
index 568837a..82e959e 100644
--- a/media/libstagefright/SurfaceUtils.cpp
+++ b/media/libstagefright/SurfaceUtils.cpp
@@ -31,15 +31,15 @@
// In some cases we need to reconnect so that we can dequeue all buffers
if (reconnect) {
- err = native_window_api_disconnect(nativeWindow, NATIVE_WINDOW_API_MEDIA);
+ err = nativeWindowDisconnect(nativeWindow, "setNativeWindowSizeFormatAndUsage");
if (err != NO_ERROR) {
- ALOGE("native_window_api_disconnect failed: %s (%d)", strerror(-err), -err);
+ ALOGE("nativeWindowDisconnect failed: %s (%d)", strerror(-err), -err);
return err;
}
- err = native_window_api_connect(nativeWindow, NATIVE_WINDOW_API_MEDIA);
+ err = nativeWindowConnect(nativeWindow, "setNativeWindowSizeFormatAndUsage");
if (err != NO_ERROR) {
- ALOGE("native_window_api_connect failed: %s (%d)", strerror(-err), -err);
+ ALOGE("nativeWindowConnect failed: %s (%d)", strerror(-err), -err);
return err;
}
}
@@ -127,7 +127,7 @@
// We need to reconnect to the ANativeWindow as a CPU client to ensure that
// no frames get dropped by SurfaceFlinger assuming that these are video
// frames.
- err = native_window_api_disconnect(nativeWindow, NATIVE_WINDOW_API_MEDIA);
+ err = nativeWindowDisconnect(nativeWindow, "pushBlankBuffersToNativeWindow");
if (err != NO_ERROR) {
ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)", strerror(-err), -err);
return err;
@@ -136,7 +136,7 @@
err = native_window_api_connect(nativeWindow, NATIVE_WINDOW_API_CPU);
if (err != NO_ERROR) {
ALOGE("error pushing blank frames: api_connect failed: %s (%d)", strerror(-err), -err);
- (void)native_window_api_connect(nativeWindow, NATIVE_WINDOW_API_MEDIA);
+ (void)nativeWindowConnect(nativeWindow, "pushBlankBuffersToNativeWindow(err)");
return err;
}
@@ -219,7 +219,7 @@
}
}
- err2 = native_window_api_connect(nativeWindow, NATIVE_WINDOW_API_MEDIA);
+ err2 = nativeWindowConnect(nativeWindow, "pushBlankBuffersToNativeWindow(err2)");
if (err2 != NO_ERROR) {
ALOGE("error pushing blank frames: api_connect failed: %s (%d)", strerror(-err), -err);
if (err == NO_ERROR) {
@@ -230,5 +230,22 @@
return err;
}
+status_t nativeWindowConnect(ANativeWindow *surface, const char *reason) {
+ ALOGD("connecting to surface %p, reason %s", surface, reason);
+
+ status_t err = native_window_api_connect(surface, NATIVE_WINDOW_API_MEDIA);
+ ALOGE_IF(err != OK, "Failed to connect to surface %p, err %d", surface, err);
+
+ return err;
+}
+
+status_t nativeWindowDisconnect(ANativeWindow *surface, const char *reason) {
+ ALOGD("disconnecting from surface %p, reason %s", surface, reason);
+
+ status_t err = native_window_api_disconnect(surface, NATIVE_WINDOW_API_MEDIA);
+ ALOGE_IF(err != OK, "Failed to disconnect from surface %p, err %d", surface, err);
+
+ return err;
+}
} // namespace android