AndroidImageProxy.java revision 6e981cafa9cc57ebc7100cb84f68fb74dbd163da
19c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall/*
29c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * Copyright (C) 2014 The Android Open Source Project
39c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall *
49c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * Licensed under the Apache License, Version 2.0 (the "License");
59c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * you may not use this file except in compliance with the License.
69c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * You may obtain a copy of the License at
79c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall *
89c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall *      http://www.apache.org/licenses/LICENSE-2.0
99c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall *
109c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * Unless required by applicable law or agreed to in writing, software
119c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * distributed under the License is distributed on an "AS IS" BASIS,
129c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * See the License for the specific language governing permissions and
149c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * limitations under the License.
159c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall */
169c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
179c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lallpackage com.android.camera.one.v2.camera2proxy;
189c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
199c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lallimport android.graphics.Rect;
206e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Linimport android.media.Image;
216e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin
226e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Linimport java.nio.ByteBuffer;
236e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Linimport java.util.ArrayList;
246e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Linimport java.util.List;
259c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
269c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall/**
279c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * An {@link ImageProxy} backed by an {@link android.media.Image}.
289c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall */
299c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lallpublic class AndroidImageProxy implements ImageProxy {
306e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin
316e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin    /**
326e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     * An {@link ImageProxy.Plane} backed by an
336e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     * {@link android.media.Image.Plane}.
346e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     */
356e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin    public class Plane implements ImageProxy.Plane {
366e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        private final Image.Plane mPlane;
376e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin
386e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        public Plane(Image.Plane imagePlane) {
396e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin            mPlane = imagePlane;
406e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        }
416e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin
426e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        /**
436e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin         * @see {@link android.media.Image.Plane#getRowStride}
446e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin         */
456e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        @Override
466e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        public int getRowStride() {
476e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin            return mPlane.getRowStride();
486e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        }
496e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin
506e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        /**
516e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin         * @see {@link android.media.Image.Plane#getPixelStride}
526e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin         */
536e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        @Override
546e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        public int getPixelStride() {
556e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin            return mPlane.getPixelStride();
566e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        }
576e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin
586e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        /**
596e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin         * @see {@link android.media.Image.Plane#getBuffer}
606e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin         */
616e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        @Override
626e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        public ByteBuffer getBuffer() {
636e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin            return mPlane.getBuffer();
646e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        }
656e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin
666e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin    }
676e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin
689c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    private final android.media.Image mImage;
699c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
709c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    public AndroidImageProxy(android.media.Image image) {
719c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall        mImage = image;
729c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    }
739c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
749c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    /**
759c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     * @see {@link android.media.Image#getCropRect}
769c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     */
779c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    @Override
789c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    public Rect getCropRect() {
799c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall        return mImage.getCropRect();
809c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    }
819c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
829c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    /**
839c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     * @see {@link android.media.Image#setCropRect}
849c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     */
859c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    @Override
869c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    public void setCropRect(Rect cropRect) {
879c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall        mImage.setCropRect(cropRect);
889c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    }
899c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
909c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    /**
919c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     * @see {@link android.media.Image#getFormat}
929c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     */
939c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    @Override
949c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    public int getFormat() {
959c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall        return mImage.getFormat();
969c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    }
979c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
989c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    /**
999c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     * @see {@link android.media.Image#getHeight}
1009c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     */
1019c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    @Override
1029c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    public int getHeight() {
1039c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall        return mImage.getHeight();
1049c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    }
1059c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
1069c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    /**
1076e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     * <p>
1086e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     * NOTE:This wrapper is functionally correct, but has some performance
1096e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     * implications: it dynamically allocates a small array (usually 1-3
1106e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     * elements) and iteratively constructs each element of this array every
1116e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     * time it is called. This function definitely should <b>NOT</b> be called
1126e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     * within an tight inner loop, as it may litter the GC with lots of little
1136e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     * allocations. However, a proper caching of this object needs to be tied to
1146e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     * the Android Image updates, which would be a little more complex than this
1156e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     * object needs to be. So, just consider the performance when using this
1166e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     * function wrapper.
1176e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin     * </p>
1189c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     * @see {@link android.media.Image#getPlanes}
1199c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     */
1209c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    @Override
1216e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin    public List<ImageProxy.Plane> getPlanes() {
1226e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        Image.Plane[] planes = mImage.getPlanes();
1236e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin
1246e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        List<ImageProxy.Plane> wrappedPlanes = new ArrayList<>(planes.length);
1256e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin
1266e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        for (int i = 0; i < planes.length; i++) {
1276e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin            wrappedPlanes.add(new Plane(planes[i]));
1286e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        }
1296e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin        return wrappedPlanes;
1309c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    }
1319c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
1329c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    /**
1339c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     * @see {@link android.media.Image#getTimestamp}
1349c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     */
1359c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    @Override
1369c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    public long getTimestamp() {
1379c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall        return mImage.getTimestamp();
1389c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    }
1399c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
1409c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    /**
1419c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     * @see {@link android.media.Image#getWidth}
1429c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     */
1439c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    @Override
1449c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    public int getWidth() {
1459c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall        return mImage.getWidth();
1469c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    }
1479c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
1489c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    /**
1499c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     * @see {@link android.media.Image#close}
1509c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     */
1519c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    @Override
1529c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    public void close() {
1539c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall        mImage.close();
1549c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    }
1559c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall}
156