169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/* 269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * 469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * you may not use this file except in compliance with the License. 669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * You may obtain a copy of the License at 769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * 869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * 1069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 1169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 1269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * See the License for the specific language governing permissions and 1469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * limitations under the License. 1569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala */ 1669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 1769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR_H 1869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#define ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR_H 1969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 2069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Thread.h> 2169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/String16.h> 2269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Vector.h> 2369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Mutex.h> 2469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Condition.h> 2569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <gui/BufferItemConsumer.h> 2669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "Parameters.h" 2769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "FrameProcessor.h" 28bd02dd1bf1f34eb4e100d0d058f1fe5a2790d67eIgor Murashkin#include "camera/CameraMetadata.h" 2969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "Camera2Heap.h" 307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include "../CameraDeviceBase.h" 312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "ZslProcessorInterface.h" 3269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace android { 3469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaclass Camera2Client; 3669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace camera2 { 3869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaclass CaptureSequencer; 4069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 4169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/*** 4269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * ZSL queue processing 4369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala */ 4469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaclass ZslProcessor: 4569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala virtual public Thread, 4669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala virtual public BufferItemConsumer::FrameAvailableListener, 4769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala virtual public FrameProcessor::FilteredListener, 482fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual public CameraDeviceBase::BufferReleasedListener, 492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin public ZslProcessorInterface { 5069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala public: 5102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ZslProcessor(sp<Camera2Client> client, wp<CaptureSequencer> sequencer); 5269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ~ZslProcessor(); 5369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 5469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // From mZslConsumer 5569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala virtual void onFrameAvailable(); 5669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // From FrameProcessor 574c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala virtual void onFrameAvailable(int32_t frameId, const CameraMetadata &frame); 5869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 5969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala virtual void onBufferReleased(buffer_handle_t *handle); 6069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /** 622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin **************************************** 632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * ZslProcessorInterface implementation * 642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin **************************************** 652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin */ 662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 6769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t updateStream(const Parameters ¶ms); 6869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t deleteStream(); 6969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala int getStreamId() const; 7069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 7169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t pushToReprocess(int32_t requestId); 725a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala status_t clearZslQueue(); 7369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 7469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala void dump(int fd, const Vector<String16>& args) const; 7569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala private: 7669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala static const nsecs_t kWaitDuration = 10000000; // 10 ms 7769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 7869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala enum { 7969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala RUNNING, 8069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala LOCKED 8169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } mState; 8269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 8369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala wp<Camera2Client> mClient; 8402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala wp<CameraDeviceBase> mDevice; 8569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala wp<CaptureSequencer> mSequencer; 8602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala int mId; 8769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 8869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mutable Mutex mInputMutex; 8969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala bool mZslBufferAvailable; 9069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Condition mZslBufferAvailableSignal; 9169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 9269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala enum { 9369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala NO_STREAM = -1 9469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala }; 9569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 9669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala int mZslStreamId; 9769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala int mZslReprocessStreamId; 9869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<BufferItemConsumer> mZslConsumer; 9969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<ANativeWindow> mZslWindow; 10069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 10169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala struct ZslPair { 10269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala BufferItemConsumer::BufferItem buffer; 10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CameraMetadata frame; 10469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala }; 10569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 1062954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala static const size_t kZslBufferDepth = 4; 10769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala static const size_t kFrameListDepth = kZslBufferDepth * 2; 10869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Vector<CameraMetadata> mFrameList; 10969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala size_t mFrameListHead; 11069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 11169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ZslPair mNextPair; 11269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 11369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Vector<ZslPair> mZslQueue; 11469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala size_t mZslQueueHead; 11569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala size_t mZslQueueTail; 11669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 117db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala CameraMetadata mLatestCapturedRequest; 118db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala 11969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala virtual bool threadLoop(); 12069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 12102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala status_t processNewZslBuffer(); 12269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 12369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // Match up entries from frame list to buffers in ZSL queue 12469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala void findMatchesLocked(); 1252274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala 1265a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala status_t clearZslQueueLocked(); 1275a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala 1282274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala void dumpZslQueue(int id) const; 12969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; 13069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 13169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 13269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; //namespace camera2 13369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; //namespace android 13469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 13569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#endif 136