1ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin/* 2ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * Copyright (C) 2013 The Android Open Source Project 3ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * 4ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 5ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * you may not use this file except in compliance with the License. 6ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * You may obtain a copy of the License at 7ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * 8ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 9ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * 10ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * Unless required by applicable law or agreed to in writing, software 11ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 12ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * See the License for the specific language governing permissions and 14ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * limitations under the License. 15ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin */ 16ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 17ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR3_H 18ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#define ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR3_H 19ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 20ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <utils/Thread.h> 21ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <utils/String16.h> 22ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <utils/Vector.h> 23ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <utils/Mutex.h> 24ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <utils/Condition.h> 25549e735c2ca22d16eea32fda418ba80da32a8558Dan Stoza#include <gui/BufferItem.h> 26ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <gui/BufferItemConsumer.h> 277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/CameraMetadata.h> 287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/FrameProcessor.h" 307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/ZslProcessorInterface.h" 317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3ZslStream.h" 32ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 33ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinnamespace android { 34ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 35ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinclass Camera2Client; 36ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 37ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinnamespace camera2 { 38ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 39ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinclass CaptureSequencer; 407b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Parameters; 41ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 42ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin/*** 43ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * ZSL queue processing 44ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin */ 45ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinclass ZslProcessor3 : 46ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin public ZslProcessorInterface, 47ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin public camera3::Camera3StreamBufferListener, 48ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual public Thread, 49ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual public FrameProcessor::FilteredListener { 50ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin public: 51ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin ZslProcessor3(sp<Camera2Client> client, wp<CaptureSequencer> sequencer); 52ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin ~ZslProcessor3(); 53ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 54cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // From FrameProcessor::FilteredListener 55cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual void onResultAvailable(const CaptureResult &result); 56ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 57ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin /** 58ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin **************************************** 59ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * ZslProcessorInterface implementation * 60ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin **************************************** 61ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin */ 62ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 63ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual status_t updateStream(const Parameters ¶ms); 64ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual status_t deleteStream(); 65ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual int getStreamId() const; 66ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 67ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual status_t pushToReprocess(int32_t requestId); 68ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual status_t clearZslQueue(); 69ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 70ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin void dump(int fd, const Vector<String16>& args) const; 71ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 72ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin protected: 73ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin /** 74ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin ********************************************** 75ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * Camera3StreamBufferListener implementation * 76ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin ********************************************** 77ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin */ 78ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin typedef camera3::Camera3StreamBufferListener::BufferInfo BufferInfo; 79ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin // Buffer was acquired by the HAL 80ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual void onBufferAcquired(const BufferInfo& bufferInfo); 81ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin // Buffer was released by the HAL 82ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual void onBufferReleased(const BufferInfo& bufferInfo); 83ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 84ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin private: 85ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin static const nsecs_t kWaitDuration = 10000000; // 10 ms 866b7a2294b9e4da784cfe4b562ee1720ad606c852Yin-Chia Yeh nsecs_t mLatestClearedBufferTimestamp; 87ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 88ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin enum { 89ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin RUNNING, 90ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin LOCKED 91ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin } mState; 92ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 93ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin wp<Camera2Client> mClient; 94ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin wp<CaptureSequencer> mSequencer; 95ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 96ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin const int mId; 97ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 98ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin mutable Mutex mInputMutex; 99ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 100ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin enum { 101ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin NO_STREAM = -1 102ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin }; 103ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 104ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin int mZslStreamId; 105ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin sp<camera3::Camera3ZslStream> mZslStream; 106ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 107ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin struct ZslPair { 108549e735c2ca22d16eea32fda418ba80da32a8558Dan Stoza BufferItem buffer; 109ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin CameraMetadata frame; 110ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin }; 111ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 112f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He static const int32_t kDefaultMaxPipelineDepth = 4; 113f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He size_t mBufferQueueDepth; 114f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He size_t mFrameListDepth; 115ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin Vector<CameraMetadata> mFrameList; 116ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin size_t mFrameListHead; 117ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 118ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin ZslPair mNextPair; 119ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 120ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin Vector<ZslPair> mZslQueue; 121ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin size_t mZslQueueHead; 122ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin size_t mZslQueueTail; 123ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 124ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin CameraMetadata mLatestCapturedRequest; 125ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 126754fb0225369123ef6e369fd91c48071dcf6057cYin-Chia Yeh bool mHasFocuser; 127754fb0225369123ef6e369fd91c48071dcf6057cYin-Chia Yeh 128ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual bool threadLoop(); 129ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 130ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin status_t clearZslQueueLocked(); 131ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 132f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He void clearZslResultQueueLocked(); 133f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He 134ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin void dumpZslQueue(int id) const; 135ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 136ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin nsecs_t getCandidateTimestampLocked(size_t* metadataIdx) const; 137dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh 138dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh bool isFixedFocusMode(uint8_t afMode) const; 139a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He 140a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He // Update the post-processing metadata with the default still capture request template 141a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He status_t updateRequestWithDefaultStillRequest(CameraMetadata &request) const; 142ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin}; 143ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 144ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 145ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin}; //namespace camera2 146ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin}; //namespace android 147ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 148ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#endif 149