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