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