Loading media/java/android/media/ImageWriter.java +92 −60 Original line number Diff line number Diff line Loading @@ -100,6 +100,8 @@ public class ImageWriter implements AutoCloseable { private final Object mListenerLock = new Object(); private OnImageReleasedListener mListener; private ListenerHandler mListenerHandler; private final Object mCloseLock = new Object(); private boolean mIsWriterValid = false; private long mNativeContext; private int mWidth; Loading Loading @@ -305,6 +307,8 @@ public class ImageWriter implements AutoCloseable { ImageUtils.getEstimatedNativeAllocBytes(mWidth, mHeight, useLegacyImageFormat ? imageFormat : hardwareBufferFormat, /*buffer count*/ 1); VMRuntime.getRuntime().registerNativeAllocation(mEstimatedNativeAllocBytes); mIsWriterValid = true; } private ImageWriter(Surface surface, int maxImages, boolean useSurfaceImageFormatInfo, Loading Loading @@ -448,8 +452,10 @@ public class ImageWriter implements AutoCloseable { * @see Image#close */ public Image dequeueInputImage() { synchronized (mCloseLock) { if (mDequeuedImages.size() >= mMaxImages) { throw new IllegalStateException("Already dequeued max number of Images " + mMaxImages); throw new IllegalStateException( "Already dequeued max number of Images " + mMaxImages); } WriterSurfaceImage newImage = new WriterSurfaceImage(this); nativeDequeueInputImage(mNativeContext, newImage); Loading @@ -457,6 +463,7 @@ public class ImageWriter implements AutoCloseable { newImage.mIsImageValid = true; return newImage; } } /** * <p> Loading Loading @@ -513,6 +520,8 @@ public class ImageWriter implements AutoCloseable { if (image == null) { throw new IllegalArgumentException("image shouldn't be null"); } synchronized (mCloseLock) { boolean ownedByMe = isImageOwnedByMe(image); if (ownedByMe && !(((WriterSurfaceImage) image).mIsImageValid)) { throw new IllegalStateException("Image from ImageWriter is invalid"); Loading @@ -526,7 +535,8 @@ public class ImageWriter implements AutoCloseable { prevOwner.detachImage(image); } else if (image.getOwner() != null) { throw new IllegalArgumentException("Only images from ImageReader can be queued to" throw new IllegalArgumentException( "Only images from ImageReader can be queued to" + " ImageWriter, other image source is not supported yet!"); } Loading Loading @@ -558,6 +568,7 @@ public class ImageWriter implements AutoCloseable { wi.mIsImageValid = false; } } } /** * Get the ImageWriter format. Loading Loading @@ -691,6 +702,10 @@ public class ImageWriter implements AutoCloseable { */ @Override public void close() { synchronized (mCloseLock) { if (!mIsWriterValid) { return; } setOnImageReleasedListener(null, null); for (Image image : mDequeuedImages) { image.close(); Loading @@ -703,6 +718,8 @@ public class ImageWriter implements AutoCloseable { VMRuntime.getRuntime().registerNativeFree(mEstimatedNativeAllocBytes); mEstimatedNativeAllocBytes = 0; } mIsWriterValid = false; } } @Override Loading Loading @@ -790,10 +807,16 @@ public class ImageWriter implements AutoCloseable { @Override public void handleMessage(Message msg) { OnImageReleasedListener listener; synchronized (mListenerLock) { boolean isWriterValid; synchronized (ImageWriter.this.mListenerLock) { listener = mListener; } if (listener != null) { // Check to make sure we don't accidentally queue images after the writer is // closed or closing synchronized (ImageWriter.this.mCloseLock) { isWriterValid = ImageWriter.this.mIsWriterValid; } if (listener != null && isWriterValid) { listener.onImageReleased(ImageWriter.this); } } Loading @@ -813,10 +836,14 @@ public class ImageWriter implements AutoCloseable { } final Handler handler; final boolean isWriterValid; synchronized (iw.mListenerLock) { handler = iw.mListenerHandler; } if (handler != null) { synchronized (iw.mCloseLock) { isWriterValid = iw.mIsWriterValid; } if (handler != null && isWriterValid) { handler.sendEmptyMessage(0); } } Loading Loading @@ -1050,6 +1077,9 @@ public class ImageWriter implements AutoCloseable { private int mTransform = 0; //Default no transform private int mScalingMode = 0; //Default frozen scaling mode private final Object mCloseLock = new Object(); // lock to protect against multiple // simultaneous calls to close() public WriterSurfaceImage(ImageWriter writer) { mOwner = writer; mWidth = writer.mWidth; Loading Loading @@ -1192,10 +1222,12 @@ public class ImageWriter implements AutoCloseable { @Override public void close() { synchronized (mCloseLock) { if (mIsImageValid) { getOwner().abortImage(this); } } } @Override protected final void finalize() throws Throwable { Loading Loading
media/java/android/media/ImageWriter.java +92 −60 Original line number Diff line number Diff line Loading @@ -100,6 +100,8 @@ public class ImageWriter implements AutoCloseable { private final Object mListenerLock = new Object(); private OnImageReleasedListener mListener; private ListenerHandler mListenerHandler; private final Object mCloseLock = new Object(); private boolean mIsWriterValid = false; private long mNativeContext; private int mWidth; Loading Loading @@ -305,6 +307,8 @@ public class ImageWriter implements AutoCloseable { ImageUtils.getEstimatedNativeAllocBytes(mWidth, mHeight, useLegacyImageFormat ? imageFormat : hardwareBufferFormat, /*buffer count*/ 1); VMRuntime.getRuntime().registerNativeAllocation(mEstimatedNativeAllocBytes); mIsWriterValid = true; } private ImageWriter(Surface surface, int maxImages, boolean useSurfaceImageFormatInfo, Loading Loading @@ -448,8 +452,10 @@ public class ImageWriter implements AutoCloseable { * @see Image#close */ public Image dequeueInputImage() { synchronized (mCloseLock) { if (mDequeuedImages.size() >= mMaxImages) { throw new IllegalStateException("Already dequeued max number of Images " + mMaxImages); throw new IllegalStateException( "Already dequeued max number of Images " + mMaxImages); } WriterSurfaceImage newImage = new WriterSurfaceImage(this); nativeDequeueInputImage(mNativeContext, newImage); Loading @@ -457,6 +463,7 @@ public class ImageWriter implements AutoCloseable { newImage.mIsImageValid = true; return newImage; } } /** * <p> Loading Loading @@ -513,6 +520,8 @@ public class ImageWriter implements AutoCloseable { if (image == null) { throw new IllegalArgumentException("image shouldn't be null"); } synchronized (mCloseLock) { boolean ownedByMe = isImageOwnedByMe(image); if (ownedByMe && !(((WriterSurfaceImage) image).mIsImageValid)) { throw new IllegalStateException("Image from ImageWriter is invalid"); Loading @@ -526,7 +535,8 @@ public class ImageWriter implements AutoCloseable { prevOwner.detachImage(image); } else if (image.getOwner() != null) { throw new IllegalArgumentException("Only images from ImageReader can be queued to" throw new IllegalArgumentException( "Only images from ImageReader can be queued to" + " ImageWriter, other image source is not supported yet!"); } Loading Loading @@ -558,6 +568,7 @@ public class ImageWriter implements AutoCloseable { wi.mIsImageValid = false; } } } /** * Get the ImageWriter format. Loading Loading @@ -691,6 +702,10 @@ public class ImageWriter implements AutoCloseable { */ @Override public void close() { synchronized (mCloseLock) { if (!mIsWriterValid) { return; } setOnImageReleasedListener(null, null); for (Image image : mDequeuedImages) { image.close(); Loading @@ -703,6 +718,8 @@ public class ImageWriter implements AutoCloseable { VMRuntime.getRuntime().registerNativeFree(mEstimatedNativeAllocBytes); mEstimatedNativeAllocBytes = 0; } mIsWriterValid = false; } } @Override Loading Loading @@ -790,10 +807,16 @@ public class ImageWriter implements AutoCloseable { @Override public void handleMessage(Message msg) { OnImageReleasedListener listener; synchronized (mListenerLock) { boolean isWriterValid; synchronized (ImageWriter.this.mListenerLock) { listener = mListener; } if (listener != null) { // Check to make sure we don't accidentally queue images after the writer is // closed or closing synchronized (ImageWriter.this.mCloseLock) { isWriterValid = ImageWriter.this.mIsWriterValid; } if (listener != null && isWriterValid) { listener.onImageReleased(ImageWriter.this); } } Loading @@ -813,10 +836,14 @@ public class ImageWriter implements AutoCloseable { } final Handler handler; final boolean isWriterValid; synchronized (iw.mListenerLock) { handler = iw.mListenerHandler; } if (handler != null) { synchronized (iw.mCloseLock) { isWriterValid = iw.mIsWriterValid; } if (handler != null && isWriterValid) { handler.sendEmptyMessage(0); } } Loading Loading @@ -1050,6 +1077,9 @@ public class ImageWriter implements AutoCloseable { private int mTransform = 0; //Default no transform private int mScalingMode = 0; //Default frozen scaling mode private final Object mCloseLock = new Object(); // lock to protect against multiple // simultaneous calls to close() public WriterSurfaceImage(ImageWriter writer) { mOwner = writer; mWidth = writer.mWidth; Loading Loading @@ -1192,10 +1222,12 @@ public class ImageWriter implements AutoCloseable { @Override public void close() { synchronized (mCloseLock) { if (mIsImageValid) { getOwner().abortImage(this); } } } @Override protected final void finalize() throws Throwable { Loading