130ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin/* 230ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * Copyright (C) 2014 The Android Open Source Project 330ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * 430ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * Licensed under the Apache License, Version 2.0 (the "License"); 530ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * you may not use this file except in compliance with the License. 630ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * You may obtain a copy of the License at 730ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * 830ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * http://www.apache.org/licenses/LICENSE-2.0 930ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * 1030ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * Unless required by applicable law or agreed to in writing, software 1130ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * distributed under the License is distributed on an "AS IS" BASIS, 1230ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1330ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * See the License for the specific language governing permissions and 1430ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * limitations under the License. 1530ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin */ 1630ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 1730ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Linpackage com.android.camera.processing.imagebackend; 1830ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 19725059d4d1ab78b5ffaa99cbba397b2dafc717d2I-Jong Linimport android.graphics.Rect; 20de2c5f84c216d91a366d3361be78a8c8710bd65dPaul Rohde 21de2c5f84c216d91a366d3361be78a8c8710bd65dPaul Rohdeimport com.android.camera.processing.memory.LruResourcePool; 2230ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Linimport com.android.camera.session.CaptureSession; 2330ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Linimport com.android.camera.util.Size; 2430ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 25de2c5f84c216d91a366d3361be78a8c8710bd65dPaul Rohdeimport java.nio.ByteBuffer; 2630ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Linimport java.util.concurrent.Executor; 2730ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 2830ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin/** 2930ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * Implements the conversion of a YUV_420_888 image to subsampled image 3030ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * inscribed in a circle. 3130ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin */ 3230ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Linpublic class TaskPreviewChainedJpeg extends TaskConvertImageToRGBPreview { 33de2c5f84c216d91a366d3361be78a8c8710bd65dPaul Rohde private final LruResourcePool<Integer, ByteBuffer> mByteBufferDirectPool; 34de2c5f84c216d91a366d3361be78a8c8710bd65dPaul Rohde 3530ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin /** 3630ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * Constructor 3730ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * 3830ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * @param image Image that the computation is dependent on 3930ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * @param executor Executor to fire off an events 4030ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * @param imageTaskManager Image task manager that allows reference counting 4130ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * and task spawning 4230ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * @param captureSession Capture session that bound to this image 4330ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * @param targetSize Approximate viewable pixel demensions of the desired 4430ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin * preview Image */ 45de2c5f84c216d91a366d3361be78a8c8710bd65dPaul Rohde TaskPreviewChainedJpeg(ImageToProcess image, 46de2c5f84c216d91a366d3361be78a8c8710bd65dPaul Rohde Executor executor, 47de2c5f84c216d91a366d3361be78a8c8710bd65dPaul Rohde ImageTaskManager imageTaskManager, 48de2c5f84c216d91a366d3361be78a8c8710bd65dPaul Rohde CaptureSession captureSession, 49de2c5f84c216d91a366d3361be78a8c8710bd65dPaul Rohde Size targetSize, 50de2c5f84c216d91a366d3361be78a8c8710bd65dPaul Rohde LruResourcePool<Integer, ByteBuffer> byteBufferResourcePool) { 5195a80b6bd97d306cafc74fb96be00ea0eeba1842Paul Rohde super(image, executor, imageTaskManager, ProcessingPriority.AVERAGE, captureSession, 5230ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin targetSize , ThumbnailShape.MAINTAIN_ASPECT_NO_INSET); 53de2c5f84c216d91a366d3361be78a8c8710bd65dPaul Rohde mByteBufferDirectPool = byteBufferResourcePool; 5430ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin } 5530ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 5630ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin public void logWrapper(String message) { 574dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin // final Log.Tag TAG = new Log.Tag("TaskPreviewChainedJpeg"); 584dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin // Log.v(TAG, message); 5930ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin } 6030ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 6130ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin @Override 6230ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin public void run() { 6330ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin ImageToProcess img = mImage; 64725059d4d1ab78b5ffaa99cbba397b2dafc717d2I-Jong Lin Rect safeCrop = guaranteedSafeCrop(img.proxy, img.crop); 6530ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 66725059d4d1ab78b5ffaa99cbba397b2dafc717d2I-Jong Lin final TaskImage inputImage = calculateInputImage(img, safeCrop); 6730ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin final int subsample = calculateBestSubsampleFactor( 68725059d4d1ab78b5ffaa99cbba397b2dafc717d2I-Jong Lin new Size(safeCrop.width(), safeCrop.height()), 6930ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin mTargetSize); 7030ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin final TaskImage resultImage = calculateResultImage(img, subsample); 714dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin final int[] convertedImage; 7230ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 734dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin try { 744dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin onStart(mId, inputImage, resultImage, TaskInfo.Destination.INTERMEDIATE_THUMBNAIL); 7530ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 764dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin logWrapper("TIMER_END Rendering preview YUV buffer available, w=" + img.proxy.getWidth() 774dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin / subsample + " h=" + img.proxy.getHeight() / subsample + " of subsample " 784dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin + subsample); 7930ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 80725059d4d1ab78b5ffaa99cbba397b2dafc717d2I-Jong Lin convertedImage = runSelectedConversion(img.proxy, safeCrop, subsample); 8130ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 824dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin // Chain JPEG task 834dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin TaskImageContainer jpegTask = new TaskCompressImageToJpeg(img, mExecutor, 84de2c5f84c216d91a366d3361be78a8c8710bd65dPaul Rohde mImageTaskManager, mSession, mByteBufferDirectPool); 854dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin mImageTaskManager.appendTasks(img, jpegTask); 864dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin } finally { 874dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin // Signal backend that reference has been released 884dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin mImageTaskManager.releaseSemaphoreReference(img, mExecutor); 894dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin } 9030ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 9130ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin onPreviewDone(resultImage, inputImage, convertedImage, 9230ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin TaskInfo.Destination.INTERMEDIATE_THUMBNAIL); 9330ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin } 9430ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 9530ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin 9630ef96534cc65c0ba4665f6da2fc36e879edf196I-Jong Lin} 97