diff options
| author | 2016-07-22 21:52:51 +0000 | |
|---|---|---|
| committer | 2016-07-22 21:52:51 +0000 | |
| commit | bc20c106df3977e57bc55aaa7351d6b51d092d20 (patch) | |
| tree | d59129c306e6051dc9654fc7e6c347fe36f5db25 | |
| parent | 0ff1dc6b443cb5a66203e65b7ef2d2a0d03b94f8 (diff) | |
| parent | 2e2aaf6e0497302bc03c218949d29b01f469316e (diff) | |
ImageReader: Add discardFreeBuffers method
am: 2e2aaf6e04
Change-Id: I142f1b011a045aa0f5af7c33eb76b059eb67e30d
| -rw-r--r-- | media/java/android/media/ImageReader.java | 26 | ||||
| -rw-r--r-- | media/jni/android_media_ImageReader.cpp | 18 |
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[] = { |