1da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/*
2d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala * Copyright (C) 2013 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>
25549e735c2ca22d16eea32fda418ba80da32a8558Dan Stoza#include <gui/BufferItem.h>
26da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <gui/BufferItemConsumer.h>
277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/CameraMetadata.h>
287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/FrameProcessor.h"
30d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala#include "device3/Camera3ZslStream.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;
39d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvalastruct Parameters;
40da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
41da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/***
42d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala * ZSL queue processing for HALv3.0 or newer
43da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */
44d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvalaclass ZslProcessor :
45d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                    public camera3::Camera3StreamBufferListener,
46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            virtual public Thread,
47d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala            virtual public FrameProcessor::FilteredListener {
48da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala  public:
49d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala    ZslProcessor(sp<Camera2Client> client, wp<CaptureSequencer> sequencer);
50da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ~ZslProcessor();
51da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
52d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // From FrameProcessor::FilteredListener
53cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual void onResultAvailable(const CaptureResult &result);
54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
55ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    /**
56ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     ****************************************
57ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     * ZslProcessorInterface implementation *
58ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     ****************************************
59ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     */
60ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
61d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // Update the streams by recreating them if the size/format has changed
62da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t updateStream(const Parameters &params);
63d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala
64d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // Delete the underlying CameraDevice streams
65da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t deleteStream();
66d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala
67d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // Get ID for use with android.request.outputStreams / inputStreams
68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int getStreamId() const;
69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
70d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    /**
71d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala     * Submits a ZSL capture request (id = requestId)
72d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala     *
73d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala     * An appropriate ZSL buffer is selected by the closest timestamp,
74d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala     * then we push that buffer to be reprocessed by the HAL.
75d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala     * A capture request is created and submitted on behalf of the client.
76d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala     */
77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t pushToReprocess(int32_t requestId);
78d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala
79d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // Flush the ZSL buffer queue, freeing up all the buffers
80768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala    status_t clearZslQueue();
81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    void dump(int fd, const Vector<String16>& args) const;
83d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala
84d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala  protected:
85d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    /**
86d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala     **********************************************
87d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala     * Camera3StreamBufferListener implementation *
88d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala     **********************************************
89d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala     */
90d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    typedef camera3::Camera3StreamBufferListener::BufferInfo BufferInfo;
91d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // Buffer was acquired by the HAL
92d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    virtual void onBufferAcquired(const BufferInfo& bufferInfo);
93d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // Buffer was released by the HAL
94d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    virtual void onBufferReleased(const BufferInfo& bufferInfo);
95d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala
96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala  private:
97da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static const nsecs_t kWaitDuration = 10000000; // 10 ms
98d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    nsecs_t mLatestClearedBufferTimestamp;
99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    enum {
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        RUNNING,
102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        LOCKED
103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } mState;
104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    wp<Camera2Client> mClient;
106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    wp<CaptureSequencer> mSequencer;
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
108d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    const int mId;
1096551e1ede59f4a3043fb141159ca67bd2c85a911Ruben Brunk
110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mutable Mutex mInputMutex;
111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    enum {
113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        NO_STREAM = -1
114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    };
115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int mZslStreamId;
117d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    sp<camera3::Camera3ZslStream> mZslStream;
118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    struct ZslPair {
120549e735c2ca22d16eea32fda418ba80da32a8558Dan Stoza        BufferItem buffer;
121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        CameraMetadata frame;
122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    };
123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
124d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    static const int32_t kDefaultMaxPipelineDepth = 4;
125d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    size_t mBufferQueueDepth;
126d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    size_t mFrameListDepth;
127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Vector<CameraMetadata> mFrameList;
128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    size_t mFrameListHead;
129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ZslPair mNextPair;
131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Vector<ZslPair> mZslQueue;
133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
134ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    CameraMetadata mLatestCapturedRequest;
135ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala
136d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    bool mHasFocuser;
137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
138d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    virtual bool threadLoop();
13997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala
140768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala    status_t clearZslQueueLocked();
141768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala
142d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    void clearZslResultQueueLocked();
143d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala
14497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala    void dumpZslQueue(int id) const;
145d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala
146d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    nsecs_t getCandidateTimestampLocked(size_t* metadataIdx) const;
147d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala
148d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    bool isFixedFocusMode(uint8_t afMode) const;
149d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala
150d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // Update the post-processing metadata with the default still capture request template
151d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    status_t updateRequestWithDefaultStillRequest(CameraMetadata &request) const;
152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala};
153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; //namespace camera2
156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; //namespace android
157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#endif
159