1da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/* 2d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala * Copyright (C) 2013 The Android Open Source Project 3da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * 4da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * you may not use this file except in compliance with the License. 6da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * You may obtain a copy of the License at 7da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * 8da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * 10da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * See the License for the specific language governing permissions and 14da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * limitations under the License. 15da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 16da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 17da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR_H 18da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#define ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR_H 19da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 20da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Thread.h> 21da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/String16.h> 22da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Vector.h> 23da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Mutex.h> 24da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Condition.h> 25549e735c2ca22d16eea32fda418ba80da32a8558Dan Stoza#include <gui/BufferItem.h> 26da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <gui/BufferItemConsumer.h> 277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/CameraMetadata.h> 287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/FrameProcessor.h" 30d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala#include "device3/Camera3ZslStream.h" 31da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 32da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace android { 33da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 34da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass Camera2Client; 35da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 36da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace camera2 { 37da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 38da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass CaptureSequencer; 39d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvalastruct Parameters; 40da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 41da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/*** 42d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala * ZSL queue processing for HALv3.0 or newer 43da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 44d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvalaclass ZslProcessor : 45d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala public camera3::Camera3StreamBufferListener, 46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual public Thread, 47d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala virtual public FrameProcessor::FilteredListener { 48da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala public: 49d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala ZslProcessor(sp<Camera2Client> client, wp<CaptureSequencer> sequencer); 50da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ~ZslProcessor(); 51da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 52d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // From FrameProcessor::FilteredListener 53cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual void onResultAvailable(const CaptureResult &result); 54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 55ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin /** 56ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin **************************************** 57ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * ZslProcessorInterface implementation * 58ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin **************************************** 59ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin */ 60ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 61d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // Update the streams by recreating them if the size/format has changed 62da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t updateStream(const Parameters ¶ms); 63d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala 64d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // Delete the underlying CameraDevice streams 65da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t deleteStream(); 66d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala 67d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // Get ID for use with android.request.outputStreams / inputStreams 68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int getStreamId() const; 69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 70d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala /** 71d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala * Submits a ZSL capture request (id = requestId) 72d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala * 73d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala * An appropriate ZSL buffer is selected by the closest timestamp, 74d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala * then we push that buffer to be reprocessed by the HAL. 75d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala * A capture request is created and submitted on behalf of the client. 76d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala */ 77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t pushToReprocess(int32_t requestId); 78d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala 79d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // Flush the ZSL buffer queue, freeing up all the buffers 80768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala status_t clearZslQueue(); 81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala void dump(int fd, const Vector<String16>& args) const; 83d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala 84d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala protected: 85d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala /** 86d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala ********************************************** 87d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala * Camera3StreamBufferListener implementation * 88d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala ********************************************** 89d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala */ 90d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala typedef camera3::Camera3StreamBufferListener::BufferInfo BufferInfo; 91d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // Buffer was acquired by the HAL 92d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala virtual void onBufferAcquired(const BufferInfo& bufferInfo); 93d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // Buffer was released by the HAL 94d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala virtual void onBufferReleased(const BufferInfo& bufferInfo); 95d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala 96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala private: 97da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala static const nsecs_t kWaitDuration = 10000000; // 10 ms 98d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala nsecs_t mLatestClearedBufferTimestamp; 99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala enum { 101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala RUNNING, 102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala LOCKED 103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } mState; 104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala wp<Camera2Client> mClient; 106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala wp<CaptureSequencer> mSequencer; 107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 108d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala const int mId; 1096551e1ede59f4a3043fb141159ca67bd2c85a911Ruben Brunk 110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mutable Mutex mInputMutex; 111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala enum { 113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala NO_STREAM = -1 114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala }; 115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int mZslStreamId; 117d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala sp<camera3::Camera3ZslStream> mZslStream; 118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala struct ZslPair { 120549e735c2ca22d16eea32fda418ba80da32a8558Dan Stoza BufferItem buffer; 121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CameraMetadata frame; 122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala }; 123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 124d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala static const int32_t kDefaultMaxPipelineDepth = 4; 125d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala size_t mBufferQueueDepth; 126d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala size_t mFrameListDepth; 127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Vector<CameraMetadata> mFrameList; 128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t mFrameListHead; 129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZslPair mNextPair; 131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Vector<ZslPair> mZslQueue; 133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 134ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala CameraMetadata mLatestCapturedRequest; 135ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 136d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala bool mHasFocuser; 137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 138d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala virtual bool threadLoop(); 13997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 140768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala status_t clearZslQueueLocked(); 141768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala 142d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala void clearZslResultQueueLocked(); 143d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala 14497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala void dumpZslQueue(int id) const; 145d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala 146d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala nsecs_t getCandidateTimestampLocked(size_t* metadataIdx) const; 147d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala 148d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala bool isFixedFocusMode(uint8_t afMode) const; 149d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala 150d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // Update the post-processing metadata with the default still capture request template 151d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala status_t updateRequestWithDefaultStillRequest(CameraMetadata &request) const; 152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; 153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; //namespace camera2 156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; //namespace android 157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#endif 159