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 &params);
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