TaskChainedCompressImageToJpeg.java revision 6e981cafa9cc57ebc7100cb84f68fb74dbd163da
1ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin/* 2ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Copyright (C) 2014 The Android Open Source Project 3ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * 4ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * you may not use this file except in compliance with the License. 6ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * You may obtain a copy of the License at 7ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * 8ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * http://www.apache.org/licenses/LICENSE-2.0 9ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * 10ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Unless required by applicable law or agreed to in writing, software 11ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * distributed under the License is distributed on an "AS IS" BASIS, 12ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * See the License for the specific language governing permissions and 14ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * limitations under the License. 15ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin */ 16ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 173830d419691ef865f01b362fee9618bac2aa8888Sascha Haeberlingpackage com.android.camera.processing.imagebackend; 18ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 19ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Linimport android.graphics.ImageFormat; 20ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 21ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Linimport com.android.camera.debug.Log; 226e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Linimport com.android.camera.one.v2.camera2proxy.ImageProxy; 2330ccdac56450e5b1927e14a6eede2b86a30c42ebI-Jong Linimport com.android.camera.session.CaptureSession; 24ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 256e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Linimport java.util.List; 26ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Linimport java.util.concurrent.Executor; 27ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 28ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin/** 296e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin * Implements the conversion of a YUV_420_888 image to compressed JPEG byte 306e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin * array, as two separate tasks: the first to copy from the image to NV21 memory 316e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin * layout, and the second to convert the image into JPEG, using the built-in 326e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin * Android compressor. 33ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin */ 34ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Linclass TaskChainedCompressImageToJpeg extends TaskJpegEncode { 35ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin private final static Log.Tag TAG = new Log.Tag("TaskChainJpg"); 36ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 373830d419691ef865f01b362fee9618bac2aa8888Sascha Haeberling TaskChainedCompressImageToJpeg(ImageToProcess image, Executor executor, 383c7b7ec6aa2e51859718a6d6dead3c12d10ea370I-Jong Lin ImageTaskManager imageTaskManager, CaptureSession captureSession) { 393c7b7ec6aa2e51859718a6d6dead3c12d10ea370I-Jong Lin super(image, executor, imageTaskManager, ProcessingPriority.SLOW, captureSession); 40ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 41ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 42ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin private void logWrapper(String message) { 43ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin // Do nothing. 44ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 45ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 46ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin @Override 47ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin public void run() { 483830d419691ef865f01b362fee9618bac2aa8888Sascha Haeberling ImageToProcess img = mImage; 496e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin final List<ImageProxy.Plane> planeList = img.proxy.getPlanes(); 50ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 513830d419691ef865f01b362fee9618bac2aa8888Sascha Haeberling final TaskImage inputImage = new TaskImage(mImage.rotation, img.proxy.getWidth(), 523830d419691ef865f01b362fee9618bac2aa8888Sascha Haeberling img.proxy.getHeight(), img.proxy.getFormat()); 533830d419691ef865f01b362fee9618bac2aa8888Sascha Haeberling final TaskImage resultImage = new TaskImage(mImage.rotation, img.proxy.getWidth(), 543830d419691ef865f01b362fee9618bac2aa8888Sascha Haeberling img.proxy.getHeight(), ImageFormat.JPEG); 55ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 563830d419691ef865f01b362fee9618bac2aa8888Sascha Haeberling onStart(mId, inputImage, resultImage); 57ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 58ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin int[] strides = new int[3]; 59ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin // Do the byte copy 606e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin strides[0] = planeList.get(0).getRowStride() 616e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin / planeList.get(0).getPixelStride(); 626e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin strides[1] = planeList.get(1).getRowStride() 636e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin / planeList.get(1).getPixelStride(); 646e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin strides[2] = 2 * planeList.get(2).getRowStride() 656e981cafa9cc57ebc7100cb84f68fb74dbd163daI-Jong Lin / planeList.get(2).getPixelStride(); 66ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 673c7b7ec6aa2e51859718a6d6dead3c12d10ea370I-Jong Lin // TODO: For performance, use a cache subsystem for buffer reuse. 683c7b7ec6aa2e51859718a6d6dead3c12d10ea370I-Jong Lin byte[] dataCopy = convertYUV420ImageToPackedNV21(img.proxy); 69ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 70ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin // Release the image now that you have a usable copy 713c7b7ec6aa2e51859718a6d6dead3c12d10ea370I-Jong Lin mImageTaskManager.releaseSemaphoreReference(img, mExecutor); 72ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 73ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final byte[] chainedDataCopy = dataCopy; 74ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final int[] chainedStrides = strides; 75ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 76ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin // This task drops the image reference. 77ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin TaskImageContainer chainedTask = new TaskJpegEncode(this, ProcessingPriority.SLOW) { 78ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 79ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin @Override 80ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin public void run() { 81ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin // Image is closed by now. Do NOT reference image directly. 82ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin byte[] compressedData = convertNv21toJpeg(chainedDataCopy, 83ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin resultImage.height, resultImage.width, chainedStrides); 84ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin onJpegEncodeDone(mId, inputImage, resultImage, compressedData); 85ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin logWrapper("Finished off a chained task now that image is released."); 86ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 87ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin }; 88ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 89ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin // Passed null, since the image has already been released. 903c7b7ec6aa2e51859718a6d6dead3c12d10ea370I-Jong Lin mImageTaskManager.appendTasks(null, chainedTask); 91ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin logWrapper("Kicking off a chained task now that image is released."); 92ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 93ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin} 94