summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Eino-Ville Talvala <etalvala@google.com> 2016-07-22 21:52:51 +0000
committer android-build-merger <android-build-merger@google.com> 2016-07-22 21:52:51 +0000
commitbc20c106df3977e57bc55aaa7351d6b51d092d20 (patch)
treed59129c306e6051dc9654fc7e6c347fe36f5db25
parent0ff1dc6b443cb5a66203e65b7ef2d2a0d03b94f8 (diff)
parent2e2aaf6e0497302bc03c218949d29b01f469316e (diff)
ImageReader: Add discardFreeBuffers method
am: 2e2aaf6e04 Change-Id: I142f1b011a045aa0f5af7c33eb76b059eb67e30d
-rw-r--r--media/java/android/media/ImageReader.java26
-rw-r--r--media/jni/android_media_ImageReader.cpp18
2 files changed, 44 insertions, 0 deletions
diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java
index 682512c91708..2cbeb3a260be 100644
--- a/media/java/android/media/ImageReader.java
+++ b/media/java/android/media/ImageReader.java
@@ -520,6 +520,31 @@ public class ImageReader implements AutoCloseable {
}
}
+ /**
+ * Discard any free buffers owned by this ImageReader.
+ *
+ * <p>
+ * Generally, the ImageReader caches buffers for reuse once they have been
+ * allocated, for best performance. However, sometimes it may be important to
+ * release all the cached, unused buffers to save on memory.
+ * </p>
+ * <p>
+ * Calling this method will discard all free cached buffers. This does not include any buffers
+ * associated with Images acquired from the ImageReader, any filled buffers waiting to be
+ * acquired, and any buffers currently in use by the source rendering buffers into the
+ * ImageReader's Surface.
+ * <p>
+ * The ImageReader continues to be usable after this call, but may need to reallocate buffers
+ * when more buffers are needed for rendering.
+ * </p>
+ * @hide
+ */
+ public void discardFreeBuffers() {
+ synchronized (mCloseLock) {
+ nativeDiscardFreeBuffers();
+ }
+ }
+
@Override
protected void finalize() throws Throwable {
try {
@@ -872,6 +897,7 @@ public class ImageReader implements AutoCloseable {
private synchronized native void nativeReleaseImage(Image i);
private synchronized native Surface nativeGetSurface();
private synchronized native int nativeDetachImage(Image i);
+ private synchronized native void nativeDiscardFreeBuffers();
/**
* @return A return code {@code ACQUIRE_*}
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index c3993ae20183..724fc02271e3 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -611,6 +611,23 @@ static jint ImageReader_detachImage(JNIEnv* env, jobject thiz, jobject image) {
return OK;
}
+static void ImageReader_discardFreeBuffers(JNIEnv* env, jobject thiz) {
+ ALOGV("%s:", __FUNCTION__);
+ JNIImageReaderContext* ctx = ImageReader_getContext(env, thiz);
+ if (ctx == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", "ImageReader was already closed");
+ return;
+ }
+
+ BufferItemConsumer* bufferConsumer = ctx->getBufferConsumer();
+ status_t res = bufferConsumer->discardFreeBuffers();
+ if (res != OK) {
+ ALOGE("Buffer discard failed: %s (%d)", strerror(-res), res);
+ jniThrowRuntimeException(env,
+ "nativeDicardFreebuffers failed");
+ }
+}
+
static jobject ImageReader_getSurface(JNIEnv* env, jobject thiz)
{
ALOGV("%s: ", __FUNCTION__);
@@ -773,6 +790,7 @@ static const JNINativeMethod gImageReaderMethods[] = {
{"nativeImageSetup", "(Landroid/media/Image;)I", (void*)ImageReader_imageSetup },
{"nativeGetSurface", "()Landroid/view/Surface;", (void*)ImageReader_getSurface },
{"nativeDetachImage", "(Landroid/media/Image;)I", (void*)ImageReader_detachImage },
+ {"nativeDiscardFreeBuffers", "()V", (void*)ImageReader_discardFreeBuffers }
};
static const JNINativeMethod gImageMethods[] = {