blob: 16452c65c806574186a9e61b7a889fabb19e343a [file] [log] [blame]
/*
* Copyright (C) 2019-2020 Intel Corporation
*
* 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.
*/
#pragma once
#include <map>
#include <vector>
#include <memory>
#include <string>
#include <utility> // For std::pair, std::make_pair
#include "Parameters.h"
#include "CameraBuffer.h"
#include "BufferQueue.h"
#include "psysprocessor/PGCommon.h"
#include "PolicyManager.h"
#include "ShareReferBufferPool.h"
#include "IspParamAdaptor.h"
#include "GraphConfig.h"
namespace icamera {
class PSysDAG;
typedef std::map<Port, std::shared_ptr<CameraBuffer>> CameraBufferPortMap;
class PipeLiteExecutor : public BufferQueue {
public:
PipeLiteExecutor(int cameraId, const ExecutorPolicy &policy,
std::vector<std::string> exclusivePGs,
PSysDAG *psysDag, std::shared_ptr<IGraphConfig> gc);
virtual ~PipeLiteExecutor();
virtual int start();
virtual void stop();
virtual int initPipe();
void notifyStop();
virtual bool fetchTnrOutBuffer(int64_t seq, std::shared_ptr<CameraBuffer> buf) { return false; }
virtual bool isBypassStillTnr(int64_t seq) { return true; }
int releaseStatsBuffer(const std::shared_ptr<CameraBuffer> &statsBuf);
void setStreamId(int streamId) { mStreamId = streamId; }
void setIspParamAdaptor(IspParamAdaptor* adaptor) { mAdaptor = adaptor; }
void setPolicyManager(PolicyManager* policyManager) { mPolicyManager = policyManager; }
void setNotifyPolicy(ExecutorNotifyPolicy notifyPolicy) { mNotifyPolicy = notifyPolicy; }
void setShareReferPool(std::shared_ptr<ShareReferBufferPool> referPool) {
mShareReferPool = referPool;
}
void getOutputTerminalPorts(std::map<ia_uid, Port>& outputTerminals) const;
void getInputTerminalPorts(std::map<ia_uid, Port>& terminals) const;
bool hasOutputTerminal(ia_uid sinkTerminal);
// Link output terminals of producer to its input terminals
int setInputTerminals(const std::map<ia_uid, Port>& sourceTerminals);
int registerOutBuffers(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
int registerInBuffers(Port port, const std::shared_ptr<CameraBuffer> &inBuf);
/**
* Check if the two given stream configs are the same.
*/
bool isSameStreamConfig(const stream_t& internal, const stream_t& external,
ConfigMode configMode, bool checkStreamId) const;
bool isInputEdge() { return mIsInputEdge; }
bool isOutputEdge() { return mIsOutputEdge; }
const char* getName() const { return mName.c_str(); }
private:
DISALLOW_COPY_AND_ASSIGN(PipeLiteExecutor);
protected:
struct TerminalDescriptor{
ia_uid terminal;
ia_uid stageId;
ia_uid sourceTerminal;
ia_uid sinkTerminal;
ia_uid sourceStage;
ia_uid sinkStage;
FrameInfo frameDesc;
bool enabled;
bool hasConnection; // has related sink or source
// expection: sis output, sink = source
Port assignedPort; // INVALID_PORT for terminal without connection
int usrStreamId;
};
struct ExecutorUnit {
// Initialized during creation/configuration
int pgId;
ia_uid stageId;
std::shared_ptr<PGCommon> pg;
std::vector<ia_uid> statKernelUids;
std::vector<ia_uid> sisKernelUids;
// Initialized during connection analysis
std::vector<ia_uid> inputTerminals; // including disabled terminals
std::vector<ia_uid> outputTerminals;
// Initialized during buffer allocation
std::map<ia_uid, std::shared_ptr<CameraBuffer>> inputBuffers;
std::map<ia_uid, std::shared_ptr<CameraBuffer>> outputBuffers;
};
protected:
int analyzeConnections(const std::vector<IGraphType::PipelineConnection>& connVector);
int assignDefaultPortsForTerminals();
int notifyFrameDone(const v4l2_buffer_t& inV4l2Buf, const CameraBufferPortMap& outBuf);
/**
* Check if there is any valid buffer(not null) in the given port/buffer pairs.
*/
bool hasValidBuffers(const CameraBufferPortMap& buffers);
void dumpPGs() const;
private:
int processNewFrame();
int runPipe(std::map<Port, std::shared_ptr<CameraBuffer>> &inBuffers,
std::map<Port, std::shared_ptr<CameraBuffer>> &outBuffers,
std::vector<std::shared_ptr<CameraBuffer>> &outStatsBuffers,
std::vector<EventType> &eventType);
int notifyStatsDone(TuningMode tuningMode, const v4l2_buffer_t& inV4l2Buf,
const std::vector<std::shared_ptr<CameraBuffer>> &outStatsBuffers,
const std::vector<EventType> &eventType);
int createPGs();
int configurePGs();
int allocBuffers();
void releaseBuffers();
int storeTerminalInfo(const IGraphType::PipelineConnection& connection);
int getStatKernels(int pgId, std::vector<ia_uid>& kernels);
int getSisKernels(int pgId, std::vector<ia_uid>& kernels);
ExecutorUnit* findPGExecutor(ia_uid stageId);
void getDisabledTerminalsForPG(ia_uid stageId, std::vector<ia_uid>& terminals) const;
void getTerminalFrameInfos(const std::vector<ia_uid>& terminals,
std::map<ia_uid, FrameInfo>& infos) const;
void getTerminalPorts(const std::vector<ia_uid>& terminals,
std:: map<ia_uid, Port>& terminalPortMap) const;
void getTerminalBuffersFromExternal(
const std::vector<ia_uid>& terminals,
const std::map<Port, std::shared_ptr<CameraBuffer> >& externals,
std::map<ia_uid, std::shared_ptr<CameraBuffer> >& internals) const;
int handleSisStats(std::map<ia_uid, std::shared_ptr<CameraBuffer>>& frameBuffers,
const std::shared_ptr<CameraBuffer> &outStatsBuffers);
protected:
int mCameraId;
int mStreamId;
std::string mName;
std::vector<std::string> mPGNames;
std::vector<int> mOpModes;
std::shared_ptr<IGraphConfig> mGraphConfig;
bool mIsInputEdge;
bool mIsOutputEdge;
ExecutorNotifyPolicy mNotifyPolicy;
std::vector<ExecutorUnit> mPGExecutors;
IspParamAdaptor* mAdaptor;
PolicyManager* mPolicyManager;
std::shared_ptr<ShareReferBufferPool> mShareReferPool;
// For internal connections (between PGs)
std::map<ia_uid, std::shared_ptr<CameraBuffer> > mPGBuffers; // Buffers between PGs
std::map<ia_uid, ia_uid> mConnectionMap; // <sink, source>
std::map<ia_uid, TerminalDescriptor> mTerminalsDesc;
int64_t mLastStatsSequence;
CameraBufQ mStatsBuffers;
Mutex mStatsBuffersLock;
std::vector<std::string> mExclusivePGs;
PSysDAG *mPSysDag;
CameraBufferPortMap mInternalOutputBuffers;
int mkernelsCountWithStats;
};
typedef PipeLiteExecutor PipeExecutor;
}