Loading media/libstagefright/MediaCodec.cpp +8 −1 Original line number Diff line number Diff line Loading @@ -1110,6 +1110,9 @@ status_t MediaCodec::configure( reset(); } if (!isResourceError(err)) { if (err == OK) { disableLegacyBufferDropPostQ(surface); } break; } } Loading Loading @@ -1175,7 +1178,11 @@ status_t MediaCodec::setSurface(const sp<Surface> &surface) { msg->setObject("surface", surface); sp<AMessage> response; return PostAndAwaitResponse(msg, &response); status_t result = PostAndAwaitResponse(msg, &response); if (result == OK) { disableLegacyBufferDropPostQ(surface); } return result; } status_t MediaCodec::createInputSurface( Loading media/libstagefright/SurfaceUtils.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -18,10 +18,13 @@ #define LOG_TAG "SurfaceUtils" #include <utils/Log.h> #include <android/api-level.h> #include <media/hardware/VideoAPI.h> #include <media/stagefright/SurfaceUtils.h> #include <gui/Surface.h> extern "C" int android_get_application_target_sdk_version(); namespace android { status_t setNativeWindowSizeFormatAndUsage( Loading Loading @@ -291,5 +294,28 @@ status_t nativeWindowDisconnect(ANativeWindow *surface, const char *reason) { return err; } status_t disableLegacyBufferDropPostQ(const sp<Surface> &surface) { sp<IGraphicBufferProducer> igbp = surface ? surface->getIGraphicBufferProducer() : nullptr; if (igbp) { int targetSdk = android_get_application_target_sdk_version(); // When the caller is not an app (e.g. MediaPlayer in mediaserver) // targetSdk is __ANDROID_API_FUTURE__. bool drop = targetSdk < __ANDROID_API_Q__ || targetSdk == __ANDROID_API_FUTURE__; if (!drop) { status_t err = igbp->setLegacyBufferDrop(false); if (err == NO_ERROR) { ALOGD("legacy buffer drop disabled: target sdk (%d)", targetSdk); } else { ALOGD("disabling legacy buffer drop failed: %d", err); } } } return NO_ERROR; } } // namespace android media/libstagefright/include/media/stagefright/SurfaceUtils.h +11 −0 Original line number Diff line number Diff line Loading @@ -19,8 +19,10 @@ #define SURFACE_UTILS_H_ #include <utils/Errors.h> #include <utils/StrongPointer.h> struct ANativeWindow; class Surface; namespace android { Loading @@ -40,6 +42,15 @@ status_t pushBlankBuffersToNativeWindow(ANativeWindow *nativeWindow /* nonnull * status_t nativeWindowConnect(ANativeWindow *surface, const char *reason); status_t nativeWindowDisconnect(ANativeWindow *surface, const char *reason); /** * Disable buffer dropping behavior of BufferQueue if target sdk of application * is Q or later. If the caller is not an app (e.g. MediaPlayer in mediaserver) * retain buffer dropping behavior. * * @return NO_ERROR */ status_t disableLegacyBufferDropPostQ(const sp<Surface> &surface); } // namespace android #endif // SURFACE_UTILS_H_ Loading
media/libstagefright/MediaCodec.cpp +8 −1 Original line number Diff line number Diff line Loading @@ -1110,6 +1110,9 @@ status_t MediaCodec::configure( reset(); } if (!isResourceError(err)) { if (err == OK) { disableLegacyBufferDropPostQ(surface); } break; } } Loading Loading @@ -1175,7 +1178,11 @@ status_t MediaCodec::setSurface(const sp<Surface> &surface) { msg->setObject("surface", surface); sp<AMessage> response; return PostAndAwaitResponse(msg, &response); status_t result = PostAndAwaitResponse(msg, &response); if (result == OK) { disableLegacyBufferDropPostQ(surface); } return result; } status_t MediaCodec::createInputSurface( Loading
media/libstagefright/SurfaceUtils.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -18,10 +18,13 @@ #define LOG_TAG "SurfaceUtils" #include <utils/Log.h> #include <android/api-level.h> #include <media/hardware/VideoAPI.h> #include <media/stagefright/SurfaceUtils.h> #include <gui/Surface.h> extern "C" int android_get_application_target_sdk_version(); namespace android { status_t setNativeWindowSizeFormatAndUsage( Loading Loading @@ -291,5 +294,28 @@ status_t nativeWindowDisconnect(ANativeWindow *surface, const char *reason) { return err; } status_t disableLegacyBufferDropPostQ(const sp<Surface> &surface) { sp<IGraphicBufferProducer> igbp = surface ? surface->getIGraphicBufferProducer() : nullptr; if (igbp) { int targetSdk = android_get_application_target_sdk_version(); // When the caller is not an app (e.g. MediaPlayer in mediaserver) // targetSdk is __ANDROID_API_FUTURE__. bool drop = targetSdk < __ANDROID_API_Q__ || targetSdk == __ANDROID_API_FUTURE__; if (!drop) { status_t err = igbp->setLegacyBufferDrop(false); if (err == NO_ERROR) { ALOGD("legacy buffer drop disabled: target sdk (%d)", targetSdk); } else { ALOGD("disabling legacy buffer drop failed: %d", err); } } } return NO_ERROR; } } // namespace android
media/libstagefright/include/media/stagefright/SurfaceUtils.h +11 −0 Original line number Diff line number Diff line Loading @@ -19,8 +19,10 @@ #define SURFACE_UTILS_H_ #include <utils/Errors.h> #include <utils/StrongPointer.h> struct ANativeWindow; class Surface; namespace android { Loading @@ -40,6 +42,15 @@ status_t pushBlankBuffersToNativeWindow(ANativeWindow *nativeWindow /* nonnull * status_t nativeWindowConnect(ANativeWindow *surface, const char *reason); status_t nativeWindowDisconnect(ANativeWindow *surface, const char *reason); /** * Disable buffer dropping behavior of BufferQueue if target sdk of application * is Q or later. If the caller is not an app (e.g. MediaPlayer in mediaserver) * retain buffer dropping behavior. * * @return NO_ERROR */ status_t disableLegacyBufferDropPostQ(const sp<Surface> &surface); } // namespace android #endif // SURFACE_UTILS_H_