1b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall/* 2b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * Copyright (C) 2015 The Android Open Source Project 3b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * 4b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * Licensed under the Apache License, Version 2.0 (the "License"); 5b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * you may not use this file except in compliance with the License. 6b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * You may obtain a copy of the License at 7b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * 8b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * http://www.apache.org/licenses/LICENSE-2.0 9b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * 10b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * Unless required by applicable law or agreed to in writing, software 11b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * distributed under the License is distributed on an "AS IS" BASIS, 12b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * See the License for the specific language governing permissions and 14b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * limitations under the License. 15b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall */ 16b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 17b8397360d318edf3093b20b2b102207d76730e1bPuneet Lallpackage com.android.camera.one.v2.camera2proxy; 18b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 19b8397360d318edf3093b20b2b102207d76730e1bPuneet Lallimport android.graphics.ImageFormat; 201738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lallimport android.media.Image; 21b8397360d318edf3093b20b2b102207d76730e1bPuneet Lallimport android.os.Handler; 22b8397360d318edf3093b20b2b102207d76730e1bPuneet Lallimport android.view.Surface; 23b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 24b8397360d318edf3093b20b2b102207d76730e1bPuneet Lallimport com.google.common.base.Objects; 25b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 26b8397360d318edf3093b20b2b102207d76730e1bPuneet Lallimport javax.annotation.Nonnull; 27b8397360d318edf3093b20b2b102207d76730e1bPuneet Lallimport javax.annotation.Nullable; 281738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lallimport javax.annotation.concurrent.GuardedBy; 29b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 30b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall/** 31b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * A replacement for {@link android.media.ImageReader}. 32b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall */ 33b8397360d318edf3093b20b2b102207d76730e1bPuneet Lallpublic final class AndroidImageReaderProxy implements ImageReaderProxy { 341738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall private final Object mLock; 351738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall @GuardedBy("mLock") 36b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall private final android.media.ImageReader mDelegate; 37b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 38b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall public AndroidImageReaderProxy(android.media.ImageReader delegate) { 391738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall mLock = new Object(); 40b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall mDelegate = delegate; 41b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 42b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 43b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall /** 44b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall * @See {@link android.media.ImageReader} 45b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall */ 46b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall public static ImageReaderProxy newInstance(int width, int height, int format, int maxImages) { 47b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall return new AndroidImageReaderProxy(android.media.ImageReader.newInstance(width, height, 48b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall format, maxImages)); 49b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 50b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 51b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall private static String imageFormatToString(int imageFormat) { 52b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall switch (imageFormat) { 53b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall case ImageFormat.JPEG: 54b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall return "JPEG"; 55b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall case ImageFormat.NV16: 56b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall return "NV16"; 57b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall case ImageFormat.NV21: 58b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall return "NV21"; 59b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall case ImageFormat.RAW10: 60b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall return "RAW10"; 61b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall case ImageFormat.RAW_SENSOR: 62b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall return "RAW_SENSOR"; 63b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall case ImageFormat.RGB_565: 64b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall return "RGB_565"; 65b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall case ImageFormat.UNKNOWN: 66b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall return "UNKNOWN"; 67b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall case ImageFormat.YUV_420_888: 68b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall return "YUV_420_888"; 69b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall case ImageFormat.YUY2: 70b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall return "YUY2"; 71b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall case ImageFormat.YV12: 72b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall return "YV12"; 73b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 74b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall return Integer.toString(imageFormat); 75b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 76b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 77b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall @Override 78b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall public int getWidth() { 791738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall synchronized (mLock) { 801738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall return mDelegate.getWidth(); 811738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } 82b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 83b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 84b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall @Override 85b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall public int getHeight() { 861738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall synchronized (mLock) { 871738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall return mDelegate.getHeight(); 881738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } 89b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 90b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 91b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall @Override 92b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall public int getImageFormat() { 931738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall synchronized (mLock) { 941738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall return mDelegate.getImageFormat(); 951738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } 96b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 97b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 98b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall @Override 99b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall public int getMaxImages() { 1001738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall synchronized (mLock) { 1011738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall return mDelegate.getMaxImages(); 1021738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } 103b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 104b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 105b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall @Override 106b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall @Nonnull 107b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall public Surface getSurface() { 1081738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall synchronized (mLock) { 1091738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall return mDelegate.getSurface(); 1101738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } 111b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 112b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 113b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall @Override 114b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall @Nullable 115b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall public ImageProxy acquireLatestImage() { 1161738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall synchronized (mLock) { 1171738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall Image image = mDelegate.acquireLatestImage(); 1181738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall if (image == null) { 1191738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall return null; 1201738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } else { 1211738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall return new AndroidImageProxy(image); 1221738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } 1231738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } 124b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 125b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 126b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall @Override 127b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall @Nullable 128b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall public ImageProxy acquireNextImage() { 1291738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall synchronized (mLock) { 1301738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall Image image = mDelegate.acquireNextImage(); 1311738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall if (image == null) { 1321738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall return null; 1331738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } else { 1341738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall return new AndroidImageProxy(image); 1351738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } 1361738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } 137b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 138b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 139b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall @Override 140b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall public void setOnImageAvailableListener(@Nonnull 141b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall final ImageReaderProxy.OnImageAvailableListener listener, 142b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall Handler handler) { 1431738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall synchronized (mLock) { 1441738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall mDelegate.setOnImageAvailableListener( 1451738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall new android.media.ImageReader.OnImageAvailableListener() { 1461738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall @Override 1471738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall public void onImageAvailable(android.media.ImageReader imageReader) { 1481738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall listener.onImageAvailable(); 1491738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } 1501738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall }, handler); 1511738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } 152b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 153b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 154b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall @Override 155b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall public void close() { 1561738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall synchronized (mLock) { 1571738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall mDelegate.close(); 1581738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } 159b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 160b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall 161b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall @Override 162b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall public String toString() { 1631738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall Objects.ToStringHelper tsh; 1641738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall synchronized (mLock) { 1651738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall tsh = Objects.toStringHelper(mDelegate); 1661738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall } 1671738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall return tsh.add("width", getWidth()) 168b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall .add("height", getHeight()) 169b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall .add("format", imageFormatToString(getImageFormat())) 170b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall .toString(); 171b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall } 172b8397360d318edf3093b20b2b102207d76730e1bPuneet Lall} 173