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