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