blob: 8e5cf6e25f819668d364774e62d0ea10c90067ee [file] [log] [blame]
/*
* Copyright (C) 2017-2018 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 "iutils/RWLock.h"
#include "CameraMetadata.h"
namespace icamera {
class Parameters;
/**
* \class ParameterHelper
*
* There are two main purposes of this class:
* 1. Provide some wrapper functions for the implementation of Parameters.
* 2. Provide some interface for HAL to access and modify Parameters internal data.
*/
class ParameterHelper {
public:
/**
* \brief Merge and update dst parameter buffer with another parameter instance.
*
* \param[in] Parameters src: the source parameter.
* \param[out] Parameters dst: the parameter to be updated.
*
* \return void
*/
static void merge(const Parameters& src, Parameters* dst);
/**
* \brief Merge and update dst parameter buffer by using metadata.
*
* \param[in] CameraMetadata metadata: the source metadata.
* \param[out] Parameters dst: the parameter to be updated.
*
* \return void
*/
static void merge(const CameraMetadata& metadata, Parameters* dst);
/**
* \brief Copy metadata from parameter buffer.
*
* Some HAL V3 style parameters are not returned in the getParameter()
* because it is not used inside the HAL.
* Provide this function to assist upperlayer to return metadata
* to applications.
*
* \param[in] Parameters source: the parameter to provide metadata.
* \param[out] CameraMetadata metadata: the metadata to be updated.
*
* \return void
*/
static void copyMetadata(const Parameters& source, CameraMetadata* metadata);
private:
// The definitions and interfaces in this private section are only for Parameters internal
// use, HAL other code shouldn't and cannot access them.
friend class Parameters;
/**
* \class ParameterData
*
* \brief The definition of Parameters' internal data structure used to hide implementation
* details of Parameters.
*/
class ParameterData {
public:
ParameterData() {}
~ParameterData() {}
ParameterData(const ParameterData& other) : mMetadata(other.mMetadata) {}
ParameterData& operator=(const ParameterData& other) {
mMetadata = other.mMetadata;
return *this;
}
CameraMetadata mMetadata; // The data structure to save all of the parameters.
RWLock mRwLock; // Read-write lock to make Parameters class thread-safe
};
// Customized wrappers of RWLock to make the implementation of Parameters much cleaner.
class AutoRLock {
public:
AutoRLock(void* data) : mLock(getInternalData(data).mRwLock) { mLock.readLock(); }
~AutoRLock() { mLock.unlock(); }
private:
RWLock& mLock;
};
class AutoWLock {
public:
AutoWLock(void* data) : mLock(getInternalData(data).mRwLock) { mLock.writeLock(); }
~AutoWLock() { mLock.unlock(); }
private:
RWLock& mLock;
};
static ParameterData& getInternalData(void* data) {
return *reinterpret_cast<ParameterData*>(data);
}
static void* createParameterData() {
return new ParameterData();
}
static void* createParameterData(void* data) {
return new ParameterData(getInternalData(data));
}
static void releaseParameterData(void* data) {
delete &getInternalData(data);
}
static void deepCopy(void* srcData, void* dstData) {
getInternalData(dstData) = getInternalData(srcData);
}
static CameraMetadata& getMetadata(void* data) {
return getInternalData(data).mMetadata;
}
static icamera_metadata_ro_entry_t getMetadataEntry(void* data, uint32_t tag) {
return const_cast<const CameraMetadata*>(&getMetadata(data))->find(tag);
}
};
} // namespace icamera