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