169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/*
269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala *
469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * you may not use this file except in compliance with the License.
669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * You may obtain a copy of the License at
769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala *
869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala *
1069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
1169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
1269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * See the License for the specific language governing permissions and
1469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * limitations under the License.
1569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala */
1669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
1769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR_H
1869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#define ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR_H
1969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
2069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Thread.h>
2169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/String16.h>
2269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Vector.h>
2369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Mutex.h>
2469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Condition.h>
2569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <gui/BufferItemConsumer.h>
2669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "Parameters.h"
2769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "FrameProcessor.h"
28bd02dd1bf1f34eb4e100d0d058f1fe5a2790d67eIgor Murashkin#include "camera/CameraMetadata.h"
2969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "Camera2Heap.h"
307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include "../CameraDeviceBase.h"
312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "ZslProcessorInterface.h"
3269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace android {
3469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaclass Camera2Client;
3669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace camera2 {
3869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaclass CaptureSequencer;
4069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
4169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/***
4269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * ZSL queue processing
4369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala */
4469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaclass ZslProcessor:
4569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            virtual public Thread,
4669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            virtual public BufferItemConsumer::FrameAvailableListener,
4769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            virtual public FrameProcessor::FilteredListener,
482fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            virtual public CameraDeviceBase::BufferReleasedListener,
492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                    public ZslProcessorInterface {
5069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala  public:
5102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala    ZslProcessor(sp<Camera2Client> client, wp<CaptureSequencer> sequencer);
5269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ~ZslProcessor();
5369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // From mZslConsumer
5569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    virtual void onFrameAvailable();
5669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // From FrameProcessor
574c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    virtual void onFrameAvailable(int32_t frameId, const CameraMetadata &frame);
5869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    virtual void onBufferReleased(buffer_handle_t *handle);
6069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    /**
622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin     ****************************************
632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin     * ZslProcessorInterface implementation *
642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin     ****************************************
652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin     */
662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t updateStream(const Parameters &params);
6869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t deleteStream();
6969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    int getStreamId() const;
7069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
7169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t pushToReprocess(int32_t requestId);
725a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala    status_t clearZslQueue();
7369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
7469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    void dump(int fd, const Vector<String16>& args) const;
7569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala  private:
7669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    static const nsecs_t kWaitDuration = 10000000; // 10 ms
7769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
7869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    enum {
7969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        RUNNING,
8069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        LOCKED
8169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } mState;
8269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
8369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    wp<Camera2Client> mClient;
8402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala    wp<CameraDeviceBase> mDevice;
8569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    wp<CaptureSequencer> mSequencer;
8602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala    int mId;
8769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
8869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mutable Mutex mInputMutex;
8969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    bool mZslBufferAvailable;
9069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Condition mZslBufferAvailableSignal;
9169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
9269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    enum {
9369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        NO_STREAM = -1
9469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    };
9569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
9669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    int mZslStreamId;
9769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    int mZslReprocessStreamId;
9869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    sp<BufferItemConsumer> mZslConsumer;
9969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    sp<ANativeWindow>      mZslWindow;
10069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
10169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    struct ZslPair {
10269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        BufferItemConsumer::BufferItem buffer;
10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        CameraMetadata frame;
10469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    };
10569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
1062954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    static const size_t kZslBufferDepth = 4;
10769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    static const size_t kFrameListDepth = kZslBufferDepth * 2;
10869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Vector<CameraMetadata> mFrameList;
10969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    size_t mFrameListHead;
11069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
11169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ZslPair mNextPair;
11269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
11369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Vector<ZslPair> mZslQueue;
11469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    size_t mZslQueueHead;
11569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    size_t mZslQueueTail;
11669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
117db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    CameraMetadata mLatestCapturedRequest;
118db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala
11969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    virtual bool threadLoop();
12069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
12102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala    status_t processNewZslBuffer();
12269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
12369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // Match up entries from frame list to buffers in ZSL queue
12469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    void findMatchesLocked();
1252274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala
1265a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala    status_t clearZslQueueLocked();
1275a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala
1282274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala    void dumpZslQueue(int id) const;
12969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala};
13069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
13169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
13269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; //namespace camera2
13369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; //namespace android
13469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
13569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#endif
136