1ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin/*
2ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * Copyright (C) 2013 The Android Open Source Project
3ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin *
4ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * you may not use this file except in compliance with the License.
6ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * You may obtain a copy of the License at
7ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin *
8ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin *
10ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * Unless required by applicable law or agreed to in writing, software
11ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * See the License for the specific language governing permissions and
14ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * limitations under the License.
15ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin */
16ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
17ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR3_H
18ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#define ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR3_H
19ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
20ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <utils/Thread.h>
21ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <utils/String16.h>
22ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <utils/Vector.h>
23ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <utils/Mutex.h>
24ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <utils/Condition.h>
25549e735c2ca22d16eea32fda418ba80da32a8558Dan Stoza#include <gui/BufferItem.h>
26ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <gui/BufferItemConsumer.h>
277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/CameraMetadata.h>
287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/FrameProcessor.h"
307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/ZslProcessorInterface.h"
317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3ZslStream.h"
32ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
33ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinnamespace android {
34ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
35ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinclass Camera2Client;
36ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
37ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinnamespace camera2 {
38ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
39ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinclass CaptureSequencer;
407b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Parameters;
41ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
42ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin/***
43ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * ZSL queue processing
44ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin */
45ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinclass ZslProcessor3 :
46ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin                    public ZslProcessorInterface,
47ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin                    public camera3::Camera3StreamBufferListener,
48ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            virtual public Thread,
49ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin            virtual public FrameProcessor::FilteredListener {
50ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin  public:
51ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    ZslProcessor3(sp<Camera2Client> client, wp<CaptureSequencer> sequencer);
52ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    ~ZslProcessor3();
53ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
54cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    // From FrameProcessor::FilteredListener
55cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual void onResultAvailable(const CaptureResult &result);
56ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
57ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    /**
58ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     ****************************************
59ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     * ZslProcessorInterface implementation *
60ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     ****************************************
61ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     */
62ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
63ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    virtual status_t updateStream(const Parameters &params);
64ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    virtual status_t deleteStream();
65ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    virtual int getStreamId() const;
66ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
67ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    virtual status_t pushToReprocess(int32_t requestId);
68ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    virtual status_t clearZslQueue();
69ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
70ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    void dump(int fd, const Vector<String16>& args) const;
71ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
72ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin  protected:
73ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    /**
74ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     **********************************************
75ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     * Camera3StreamBufferListener implementation *
76ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     **********************************************
77ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     */
78ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    typedef camera3::Camera3StreamBufferListener::BufferInfo BufferInfo;
79ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    // Buffer was acquired by the HAL
80ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    virtual void onBufferAcquired(const BufferInfo& bufferInfo);
81ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    // Buffer was released by the HAL
82ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    virtual void onBufferReleased(const BufferInfo& bufferInfo);
83ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
84ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin  private:
85ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    static const nsecs_t kWaitDuration = 10000000; // 10 ms
866b7a2294b9e4da784cfe4b562ee1720ad606c852Yin-Chia Yeh    nsecs_t mLatestClearedBufferTimestamp;
87ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
88ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    enum {
89ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        RUNNING,
90ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        LOCKED
91ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    } mState;
92ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
93ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    wp<Camera2Client> mClient;
94ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    wp<CaptureSequencer> mSequencer;
95ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
96ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    const int mId;
97ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
98ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    mutable Mutex mInputMutex;
99ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
100ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    enum {
101ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        NO_STREAM = -1
102ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    };
103ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
104ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    int mZslStreamId;
105ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    sp<camera3::Camera3ZslStream> mZslStream;
106ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
107ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    struct ZslPair {
108549e735c2ca22d16eea32fda418ba80da32a8558Dan Stoza        BufferItem buffer;
109ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        CameraMetadata frame;
110ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    };
111ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
112f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He    static const int32_t kDefaultMaxPipelineDepth = 4;
113f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He    size_t mBufferQueueDepth;
114f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He    size_t mFrameListDepth;
115ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    Vector<CameraMetadata> mFrameList;
116ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    size_t mFrameListHead;
117ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
118ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    ZslPair mNextPair;
119ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
120ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    Vector<ZslPair> mZslQueue;
121ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    size_t mZslQueueHead;
122ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    size_t mZslQueueTail;
123ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
124ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    CameraMetadata mLatestCapturedRequest;
125ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
126754fb0225369123ef6e369fd91c48071dcf6057cYin-Chia Yeh    bool mHasFocuser;
127754fb0225369123ef6e369fd91c48071dcf6057cYin-Chia Yeh
128ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    virtual bool threadLoop();
129ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
130ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    status_t clearZslQueueLocked();
131ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
132f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He    void clearZslResultQueueLocked();
133f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He
134ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    void dumpZslQueue(int id) const;
135ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
136ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    nsecs_t getCandidateTimestampLocked(size_t* metadataIdx) const;
137dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh
138dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh    bool isFixedFocusMode(uint8_t afMode) const;
139a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He
140a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He    // Update the post-processing metadata with the default still capture request template
141a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He    status_t updateRequestWithDefaultStillRequest(CameraMetadata &request) const;
142ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin};
143ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
144ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
145ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin}; //namespace camera2
146ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin}; //namespace android
147ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
148ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#endif
149