12fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin/*
22fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * Copyright (C) 2013 The Android Open Source Project
32fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin *
42fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
52fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * you may not use this file except in compliance with the License.
62fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * You may obtain a copy of the License at
72fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin *
82fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
92fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin *
102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * Unless required by applicable law or agreed to in writing, software
112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * See the License for the specific language governing permissions and
142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * limitations under the License.
152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin */
162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR3_H
182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#define ANDROID_SERVERS_CAMERA_CAMERA2_ZSLPROCESSOR3_H
192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/Thread.h>
212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/String16.h>
222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/Vector.h>
232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/Mutex.h>
242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/Condition.h>
252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <gui/BufferItemConsumer.h>
262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "Parameters.h"
272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "FrameProcessor.h"
282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "camera/CameraMetadata.h"
292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "Camera2Heap.h"
302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "../CameraDeviceBase.h"
312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "ZslProcessorInterface.h"
322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "../camera3/Camera3ZslStream.h"
332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinnamespace android {
352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinclass Camera2Client;
372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinnamespace camera2 {
392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinclass CaptureSequencer;
412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin/***
432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * ZSL queue processing
442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin */
452fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinclass ZslProcessor3 :
462fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                    public ZslProcessorInterface,
472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                    public camera3::Camera3StreamBufferListener,
482fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            virtual public Thread,
492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            virtual public FrameProcessor::FilteredListener {
502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin  public:
512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    ZslProcessor3(sp<Camera2Client> client, wp<CaptureSequencer> sequencer);
522fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    ~ZslProcessor3();
532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    // From FrameProcessor
552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    virtual void onFrameAvailable(int32_t frameId, const CameraMetadata &frame);
562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    /**
582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin     ****************************************
592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin     * ZslProcessorInterface implementation *
602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin     ****************************************
612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin     */
622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    virtual status_t updateStream(const Parameters &params);
642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    virtual status_t deleteStream();
652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    virtual int getStreamId() const;
662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    virtual status_t pushToReprocess(int32_t requestId);
682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    virtual status_t clearZslQueue();
692fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
702fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void dump(int fd, const Vector<String16>& args) const;
712fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin  protected:
732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    /**
742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin     **********************************************
752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin     * Camera3StreamBufferListener implementation *
762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin     **********************************************
772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin     */
782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    typedef camera3::Camera3StreamBufferListener::BufferInfo BufferInfo;
792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    // Buffer was acquired by the HAL
802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    virtual void onBufferAcquired(const BufferInfo& bufferInfo);
812fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    // Buffer was released by the HAL
822fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    virtual void onBufferReleased(const BufferInfo& bufferInfo);
832fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin  private:
852fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    static const nsecs_t kWaitDuration = 10000000; // 10 ms
862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    enum {
882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        RUNNING,
892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        LOCKED
902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    } mState;
912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    wp<Camera2Client> mClient;
932fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    wp<CaptureSequencer> mSequencer;
942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
952fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    const int mId;
962fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    mutable Mutex mInputMutex;
982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    enum {
1002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        NO_STREAM = -1
1012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    };
1022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    int mZslStreamId;
1042fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    sp<camera3::Camera3ZslStream> mZslStream;
1052fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1062fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    struct ZslPair {
1072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        BufferItemConsumer::BufferItem buffer;
1082fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        CameraMetadata frame;
1092fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    };
1102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    static const size_t kZslBufferDepth = 4;
1122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    static const size_t kFrameListDepth = kZslBufferDepth * 2;
1132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    Vector<CameraMetadata> mFrameList;
1142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    size_t mFrameListHead;
1152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    ZslPair mNextPair;
1172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    Vector<ZslPair> mZslQueue;
1192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    size_t mZslQueueHead;
1202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    size_t mZslQueueTail;
1212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    CameraMetadata mLatestCapturedRequest;
1232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    virtual bool threadLoop();
1252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    status_t clearZslQueueLocked();
1272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void dumpZslQueue(int id) const;
1292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    nsecs_t getCandidateTimestampLocked(size_t* metadataIdx) const;
1312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin};
1322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin}; //namespace camera2
1352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin}; //namespace android
1362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#endif
138