/* * Copyright (C) 2014-2017 Intel Corporation * Copyright (c) 2017, Fuzhou Rockchip Electronics Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _CAMERA3_HAL_CAMERA3REQUEST_H_ #define _CAMERA3_HAL_CAMERA3REQUEST_H_ #include #include #include #include #include #include #include // std::chrono::second #include "CameraStreamNode.h" #include "CameraBuffer.h" USING_METADATA_NAMESPACE; NAMESPACE_DECLARATION { /** * This define is only used for the purpose of the allocation of output buffer * pool * The exact value for this should be coming from the static metadata tag * maxNumOutputStreams. But at this stage we cannot query it because we do * not know the camera id. This value should always be bigger than the static * tag. */ #define MAX_NUMBER_OUTPUT_STREAMS 8 /** * \class IRequestCallback * * This interface is implemented by the ResultProcessor * It is used by CameraStreams to report that an output buffer that belongs to * a particular request is done * It is used by PSL entities to report that part of the result information is * ready */ class IRequestCallback { public: virtual ~IRequestCallback() {} virtual status_t shutterDone(Camera3Request* request, int64_t timestamp) = 0; virtual status_t metadataDone(Camera3Request* request, int resultIndex = -1) = 0; virtual status_t bufferDone(Camera3Request* request, std::shared_ptr buffer) = 0; }; // generic template for objects that are shared among threads // If you see deadlocks with SharedObject, you probably didn't let the previous // incarnation around the same object to go out of scope (destructor releases). template class SharedObject { public: explicit SharedObject(TYPE &p) : mMembers(p.mMembers), mSharedObject(nullptr), mRefSharedObject(p) { mRefSharedObject.mLock.lock(); } explicit SharedObject(TYPE* p) : mMembers(p->mMembers), mSharedObject(p), mRefSharedObject(*p) { mSharedObject->mLock.lock(); } ~SharedObject() { mRefSharedObject.mLock.unlock(); } MEMBERTYPE &mMembers; private: SharedObject(); SharedObject(const SharedObject &); SharedObject &operator=(const SharedObject &); TYPE* mSharedObject; TYPE &mRefSharedObject; }; /** * \class Camera3Request * * Internal representation of a user request (capture or re-process) * Objects of this class are initialized for each capture request received * by the camera device. Once those objects are initialized the request is safe * for processing by the Platform Specific Layer. * * Basic integrity checks are performed on initialization. * The class also has other utility methods to ease the PSL implementations * * */ class Camera3Request { public: Camera3Request(); virtual ~Camera3Request(); status_t init(camera3_capture_request* req, IRequestCallback* cb, CameraMetadata &settings, int cameraId); void deInit(); /* access methods */ unsigned int getNumberOutputBufs(); unsigned int getNumberInputBufs(); int getBufferCountOfFormat(int format) const; int getId(); int getpartialResultCount() { return mPartialResultBuffers.size(); } int getCameraId() {return mCameraId;} CameraMetadata* getPartialResultBuffer(unsigned int index); void notifyFinalmetaFilled(); CameraMetadata* getAndWaitforFilledResults(unsigned int index); const CameraMetadata* getSettings() const; bool isAnyBufActive(); int waitAllBufsSignaled(); const std::vector* getInputBuffers(); const std::vector* getOutputBuffers(); const std::vector* getOutputStreams(); const std::vector* getInputStreams(); std::shared_ptr findBuffer(CameraStreamNode *stream, bool warn = true); bool isInputBuffer(std::shared_ptr buffer); void setSequenceId(int sequenceId) {mSequenceId = sequenceId; } int sequenceId() const {return mSequenceId; } void dumpSetting(); void dumpResults(); // Something wrong when process this request. void setError() {mError = true; } bool getError() const {return mError; } class Members { public: CameraMetadata mSettings; }; IRequestCallback * mCallback; private: /* methods */ bool isRequestValid(camera3_capture_request * request3); status_t checkInputStreams(camera3_capture_request * request3); status_t checkOutputStreams(camera3_capture_request * request3); status_t initPartialResultBuffers(int cameraId); status_t allocatePartialResultBuffers(int partialResultCount); void freePartialResultBuffers(void); void reAllocateResultBuffer(camera_metadata_t* m, int index); private: /* types and members */ // following macro adds the parts that SharedObject template requires, in practice: // mMembers, mLock and friendship with the SharedObject template Members mMembers; mutable std::mutex mLock; /* protects mMembers and SharedObjects */ bool mMetadtaFilled; std::mutex mResultLock; /* for PartialResultBuffers*/ std::condition_variable mCondition; friend class SharedObject; friend class SharedObject; bool mError; bool mInitialized; CameraMetadata mSettings; /* request settings metadata. Always contains a valid metadata buffer even if the request had nullptr */ std::mutex mAccessLock; /* protects mInBuffers, mOutBuffers and mRequestId, to ensure thread safe access to private camera3_capture_request and camera3_stream_buffer members*/ unsigned int mRequestId; /* the frame_count from the original request struct */ int mCameraId; int mSequenceId; camera3_capture_request mRequest3; std::vector mOutBuffers; std::vector mInBuffers; std::vector mOutStreams; std::vector mInStreams; std::shared_ptr mOutputBufferPool[MAX_NUMBER_OUTPUT_STREAMS]; std::vector > mOutputBuffers; std::shared_ptr mInputBuffer; std::map mBuffersPerFormat; /* Partial result support */ bool mResultBufferAllocated; /** * \struct MemoryManagedMetadata * This struct is used to store the metadata buffers that are created from * memory managed by the HAL. * This is needed to avoid continuous allocation/de-allocation of metadata * buffers. The underlying memory for this metadata buffes is allocated * once but the metadata object can be cleared many times. * The need for this struct comes from the fact that there is no API to * clear the contents of a metadata buffer completely. */ typedef struct { CameraMetadata *metaBuf; void *baseBuf; /* ownership mPartialResultBuffers */ size_t size; int dataCap; int entryCap; } MemoryManagedMetadata; std::vector mPartialResultBuffers; }; } NAMESPACE_DECLARATION_END #endif /* _CAMERA3_HAL_CAMERA3REQUEST_H_ */