12fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin/* 22fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * Copyright (C) 2013 The Android Open Source Project 32fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * 42fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 52fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * you may not use this file except in compliance with the License. 62fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * You may obtain a copy of the License at 72fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * 82fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 92fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * 102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * Unless required by applicable law or agreed to in writing, software 112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * See the License for the specific language governing permissions and 142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * limitations under the License. 152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin */ 162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR3_H 182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#define ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR3_H 192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/Thread.h> 212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/String16.h> 222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/Vector.h> 232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/Mutex.h> 242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/Condition.h> 252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <gui/BufferItemConsumer.h> 262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "Parameters.h" 272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "FrameProcessor.h" 282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "camera/CameraMetadata.h" 292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "Camera2Heap.h" 302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "../CameraDeviceBase.h" 312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "ZslProcessorInterface.h" 322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "../camera3/Camera3ZslStream.h" 332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinnamespace android { 352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinclass Camera2Client; 372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinnamespace camera2 { 392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinclass CaptureSequencer; 412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin/*** 432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * ZSL queue processing 442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin */ 452fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinclass ZslProcessor3 : 462fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin public ZslProcessorInterface, 472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin public camera3::Camera3StreamBufferListener, 482fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual public Thread, 492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual public FrameProcessor::FilteredListener { 502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin public: 512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ZslProcessor3(sp<Camera2Client> client, wp<CaptureSequencer> sequencer); 522fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ~ZslProcessor3(); 532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // From FrameProcessor 552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual void onFrameAvailable(int32_t frameId, const CameraMetadata &frame); 562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /** 582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin **************************************** 592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * ZslProcessorInterface implementation * 602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin **************************************** 612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin */ 622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual status_t updateStream(const Parameters ¶ms); 642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual status_t deleteStream(); 652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual int getStreamId() const; 662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual status_t pushToReprocess(int32_t requestId); 682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual status_t clearZslQueue(); 692fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 702fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin void dump(int fd, const Vector<String16>& args) const; 712fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin protected: 732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /** 742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ********************************************** 752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * Camera3StreamBufferListener implementation * 762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ********************************************** 772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin */ 782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin typedef camera3::Camera3StreamBufferListener::BufferInfo BufferInfo; 792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Buffer was acquired by the HAL 802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual void onBufferAcquired(const BufferInfo& bufferInfo); 812fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Buffer was released by the HAL 822fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual void onBufferReleased(const BufferInfo& bufferInfo); 832fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin private: 852fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin static const nsecs_t kWaitDuration = 10000000; // 10 ms 862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin enum { 882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin RUNNING, 892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin LOCKED 902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } mState; 912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin wp<Camera2Client> mClient; 932fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin wp<CaptureSequencer> mSequencer; 942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 952fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin const int mId; 962fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mutable Mutex mInputMutex; 982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin enum { 1002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin NO_STREAM = -1 1012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin }; 1022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int mZslStreamId; 1042fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<camera3::Camera3ZslStream> mZslStream; 1052fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1062fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin struct ZslPair { 1072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin BufferItemConsumer::BufferItem buffer; 1082fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin CameraMetadata frame; 1092fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin }; 1102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin static const size_t kZslBufferDepth = 4; 1122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin static const size_t kFrameListDepth = kZslBufferDepth * 2; 1132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<CameraMetadata> mFrameList; 1142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin size_t mFrameListHead; 1152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ZslPair mNextPair; 1172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<ZslPair> mZslQueue; 1192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin size_t mZslQueueHead; 1202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin size_t mZslQueueTail; 1212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin CameraMetadata mLatestCapturedRequest; 1232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual bool threadLoop(); 1252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t clearZslQueueLocked(); 1272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin void dumpZslQueue(int id) const; 1292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin nsecs_t getCandidateTimestampLocked(size_t* metadataIdx) const; 1312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin}; 1322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin}; //namespace camera2 1352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin}; //namespace android 1362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#endif 138