1da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/* 2da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Copyright (C) 2012 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> 25da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <gui/BufferItemConsumer.h> 267b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/CameraMetadata.h> 277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/CameraDeviceBase.h" 297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/ZslProcessorInterface.h" 307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/FrameProcessor.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; 397b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Parameters; 40da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 41da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/*** 42da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * ZSL queue processing 43da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 44da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaclass ZslProcessor: 45da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual public Thread, 46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual public BufferItemConsumer::FrameAvailableListener, 47da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual public FrameProcessor::FilteredListener, 48ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual public CameraDeviceBase::BufferReleasedListener, 49ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin public ZslProcessorInterface { 50da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala public: 51d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala ZslProcessor(sp<Camera2Client> client, wp<CaptureSequencer> sequencer); 52da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ~ZslProcessor(); 53da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // From mZslConsumer 55da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual void onFrameAvailable(); 56da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // From FrameProcessor 57f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual void onFrameAvailable(int32_t requestId, const CameraMetadata &frame); 58da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 59da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual void onBufferReleased(buffer_handle_t *handle); 60da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 61ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin /** 62ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin **************************************** 63ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * ZslProcessorInterface implementation * 64ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin **************************************** 65ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin */ 66ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 67da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t updateStream(const Parameters ¶ms); 68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t deleteStream(); 69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int getStreamId() const; 70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t pushToReprocess(int32_t requestId); 72768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala status_t clearZslQueue(); 73da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala void dump(int fd, const Vector<String16>& args) const; 75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala private: 76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala static const nsecs_t kWaitDuration = 10000000; // 10 ms 77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 78da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala enum { 79da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala RUNNING, 80da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala LOCKED 81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } mState; 82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 83da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala wp<Camera2Client> mClient; 84d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala wp<CameraDeviceBase> mDevice; 85da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala wp<CaptureSequencer> mSequencer; 86d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala int mId; 87da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 88da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mutable Mutex mInputMutex; 89da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mZslBufferAvailable; 90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Condition mZslBufferAvailableSignal; 91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala enum { 93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala NO_STREAM = -1 94da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala }; 95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int mZslStreamId; 97da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int mZslReprocessStreamId; 98da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<BufferItemConsumer> mZslConsumer; 99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<ANativeWindow> mZslWindow; 100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala struct ZslPair { 102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala BufferItemConsumer::BufferItem buffer; 103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CameraMetadata frame; 104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala }; 105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 106bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala static const size_t kZslBufferDepth = 4; 107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala static const size_t kFrameListDepth = kZslBufferDepth * 2; 108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Vector<CameraMetadata> mFrameList; 109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t mFrameListHead; 110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZslPair mNextPair; 112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Vector<ZslPair> mZslQueue; 114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t mZslQueueHead; 115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t mZslQueueTail; 116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 117ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala CameraMetadata mLatestCapturedRequest; 118ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual bool threadLoop(); 120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 121d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala status_t processNewZslBuffer(); 122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Match up entries from frame list to buffers in ZSL queue 124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala void findMatchesLocked(); 12597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 126768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala status_t clearZslQueueLocked(); 127768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala 12897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala void dumpZslQueue(int id) const; 129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; 130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; //namespace camera2 133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; //namespace android 134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#endif 136