ZslProcessor3.h revision 754fb0225369123ef6e369fd91c48071dcf6057c
1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * Copyright (C) 2013 The Android Open Source Project
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * you may not use this file except in compliance with the License.
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * You may obtain a copy of the License at
7aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner *
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * See the License for the specific language governing permissions and
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * limitations under the License.
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR3_H
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR3_H
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <utils/Thread.h>
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <utils/String16.h>
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <utils/Vector.h>
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <utils/Mutex.h>
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <utils/Condition.h>
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <gui/BufferItemConsumer.h>
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <camera/CameraMetadata.h>
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "api1/client2/FrameProcessor.h"
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "api1/client2/ZslProcessorInterface.h"
30aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#include "device3/Camera3ZslStream.h"
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectnamespace android {
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectclass Camera2Client;
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
36aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turnernamespace camera2 {
37aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectclass CaptureSequencer;
39aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turnerclass Parameters;
40aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
41aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner/***
42aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner * ZSL queue processing
43aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner */
44aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turnerclass ZslProcessor3 :
45aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                    public ZslProcessorInterface,
46aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                    public camera3::Camera3StreamBufferListener,
47aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner            virtual public Thread,
48aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner            virtual public FrameProcessor::FilteredListener {
49aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  public:
50aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    ZslProcessor3(sp<Camera2Client> client, wp<CaptureSequencer> sequencer);
51aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    ~ZslProcessor3();
52aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
53aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    // From FrameProcessor::FilteredListener
54aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    virtual void onResultAvailable(const CaptureResult &result);
55aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
56aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /**
57aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner     ****************************************
58aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner     * ZslProcessorInterface implementation *
59aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner     ****************************************
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     */
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    virtual status_t updateStream(const Parameters &params);
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    virtual status_t deleteStream();
64aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    virtual int getStreamId() const;
65aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    virtual status_t pushToReprocess(int32_t requestId);
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    virtual status_t clearZslQueue();
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    void dump(int fd, const Vector<String16>& args) const;
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  protected:
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /**
73aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner     **********************************************
74aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner     * Camera3StreamBufferListener implementation *
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     **********************************************
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     */
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    typedef camera3::Camera3StreamBufferListener::BufferInfo BufferInfo;
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    // Buffer was acquired by the HAL
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    virtual void onBufferAcquired(const BufferInfo& bufferInfo);
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    // Buffer was released by the HAL
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    virtual void onBufferReleased(const BufferInfo& bufferInfo);
82aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
83aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  private:
84aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    static const nsecs_t kWaitDuration = 10000000; // 10 ms
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    enum {
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        RUNNING,
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        LOCKED
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } mState;
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    wp<Camera2Client> mClient;
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    wp<CaptureSequencer> mSequencer;
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    const int mId;
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    mutable Mutex mInputMutex;
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    enum {
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        NO_STREAM = -1
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    };
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    int mZslStreamId;
103295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    sp<camera3::Camera3ZslStream> mZslStream;
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
105295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    struct ZslPair {
106aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        BufferItemConsumer::BufferItem buffer;
107aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CameraMetadata frame;
108aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    };
109aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
110aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    static const int32_t kDefaultMaxPipelineDepth = 4;
111aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    size_t mBufferQueueDepth;
112295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    size_t mFrameListDepth;
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Vector<CameraMetadata> mFrameList;
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    size_t mFrameListHead;
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
11641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    ZslPair mNextPair;
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Vector<ZslPair> mZslQueue;
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    size_t mZslQueueHead;
12041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    size_t mZslQueueTail;
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CameraMetadata mLatestCapturedRequest;
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    bool mHasFocuser;
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    virtual bool threadLoop();
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
128295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    status_t clearZslQueueLocked();
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    void clearZslResultQueueLocked();
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    void dumpZslQueue(int id) const;
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    nsecs_t getCandidateTimestampLocked(size_t* metadataIdx) const;
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project};
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
13841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier}; //namespace camera2
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project}; //namespace android
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
14241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier