Merge "Camera service: Add support for camera.device@3.3" into oc-mr1-dev

am: b45ee92406

Change-Id: I763feede1a7787cb81712e68c59ad905713eea8b
gugelfrei
Eino-Ville Talvala 7 years ago committed by android-build-merger
commit b09212ce76

@ -77,7 +77,8 @@ LOCAL_SHARED_LIBRARIES:= \
android.hardware.camera.common@1.0 \
android.hardware.camera.provider@2.4 \
android.hardware.camera.device@1.0 \
android.hardware.camera.device@3.2
android.hardware.camera.device@3.2 \
android.hardware.camera.device@3.3
LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libbinder libcamera_client libfmq

@ -324,7 +324,7 @@ status_t StreamingProcessor::recordingStreamNeedsUpdate(
streamInfo.width != (uint32_t)params.videoWidth ||
streamInfo.height != (uint32_t)params.videoHeight ||
!streamInfo.matchFormat((uint32_t)params.videoFormat) ||
streamInfo.dataSpace != params.videoDataSpace) {
!streamInfo.matchDataSpace(params.videoDataSpace)) {
*needsUpdate = true;
return res;
}
@ -356,7 +356,7 @@ status_t StreamingProcessor::updateRecordingStream(const Parameters &params) {
if (streamInfo.width != (uint32_t)params.videoWidth ||
streamInfo.height != (uint32_t)params.videoHeight ||
!streamInfo.matchFormat((uint32_t)params.videoFormat) ||
streamInfo.dataSpace != params.videoDataSpace) {
!streamInfo.matchDataSpace(params.videoDataSpace)) {
// TODO: Should wait to be sure previous recording has finished
res = device->deleteStream(mRecordingStreamId);

@ -145,23 +145,42 @@ class CameraDeviceBase : public virtual RefBase {
struct StreamInfo {
uint32_t width;
uint32_t height;
uint32_t format;
bool formatOverridden;
uint32_t originalFormat;
android_dataspace dataSpace;
bool dataSpaceOverridden;
android_dataspace originalDataSpace;
StreamInfo() : width(0), height(0), format(0), formatOverridden(false), originalFormat(0),
dataSpace(HAL_DATASPACE_UNKNOWN) {}
dataSpace(HAL_DATASPACE_UNKNOWN), dataSpaceOverridden(false),
originalDataSpace(HAL_DATASPACE_UNKNOWN) {}
/**
* Check whether the format matches the current or the original one in case
* it got overridden.
*/
bool matchFormat(uint32_t clientFormat) {
bool matchFormat(uint32_t clientFormat) const {
if ((formatOverridden && (originalFormat == clientFormat)) ||
(format == clientFormat)) {
return true;
}
return false;
}
/**
* Check whether the dataspace matches the current or the original one in case
* it got overridden.
*/
bool matchDataSpace(android_dataspace clientDataSpace) const {
if ((dataSpaceOverridden && (originalDataSpace == clientDataSpace)) ||
(dataSpace == clientDataSpace)) {
return true;
}
return false;
}
};
/**

@ -154,6 +154,15 @@ status_t Camera3Device::initialize(sp<CameraProviderManager> manager) {
resultQueueRet.description().c_str());
return DEAD_OBJECT;
}
IF_ALOGV() {
session->interfaceChain([](
::android::hardware::hidl_vec<::android::hardware::hidl_string> interfaceChain) {
ALOGV("Session interface chain:");
for (auto iface : interfaceChain) {
ALOGV(" %s", iface.c_str());
}
});
}
mInterface = new HalInterface(session, queue);
std::string providerType;
@ -460,6 +469,11 @@ int Camera3Device::mapToFrameworkFormat(
return static_cast<uint32_t>(pixelFormat);
}
android_dataspace Camera3Device::mapToFrameworkDataspace(
DataspaceFlags dataSpace) {
return static_cast<android_dataspace>(dataSpace);
}
uint64_t Camera3Device::mapConsumerToFrameworkUsage(
BufferUsageFlags usage) {
return usage;
@ -1382,6 +1396,8 @@ status_t Camera3Device::getStreamInfo(int id, StreamInfo *streamInfo) {
streamInfo->dataSpace = mOutputStreams[idx]->getDataSpace();
streamInfo->formatOverridden = mOutputStreams[idx]->isFormatOverridden();
streamInfo->originalFormat = mOutputStreams[idx]->getOriginalFormat();
streamInfo->dataSpaceOverridden = mOutputStreams[idx]->isDataSpaceOverridden();
streamInfo->originalDataSpace = mOutputStreams[idx]->getOriginalDataSpace();
return OK;
}
@ -3196,17 +3212,51 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat
// Invoke configureStreams
HalStreamConfiguration finalConfiguration;
device::V3_3::HalStreamConfiguration finalConfiguration;
common::V1_0::Status status;
auto err = mHidlSession->configureStreams(requestedConfiguration,
// See if we have v3.3 HAL
sp<device::V3_3::ICameraDeviceSession> hidlSession_3_3;
auto castResult = device::V3_3::ICameraDeviceSession::castFrom(mHidlSession);
if (castResult.isOk()) {
hidlSession_3_3 = castResult;
} else {
ALOGE("%s: Transaction error when casting ICameraDeviceSession: %s", __FUNCTION__,
castResult.description().c_str());
}
if (hidlSession_3_3 != nullptr) {
// We do; use v3.3 for the call
ALOGV("%s: v3.3 device found", __FUNCTION__);
auto err = hidlSession_3_3->configureStreams_3_3(requestedConfiguration,
[&status, &finalConfiguration]
(common::V1_0::Status s, const HalStreamConfiguration& halConfiguration) {
(common::V1_0::Status s, const device::V3_3::HalStreamConfiguration& halConfiguration) {
finalConfiguration = halConfiguration;
status = s;
});
if (!err.isOk()) {
ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
return DEAD_OBJECT;
if (!err.isOk()) {
ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
return DEAD_OBJECT;
}
} else {
// We don't; use v3.2 call and construct a v3.3 HalStreamConfiguration
ALOGV("%s: v3.2 device found", __FUNCTION__);
HalStreamConfiguration finalConfiguration_3_2;
auto err = mHidlSession->configureStreams(requestedConfiguration,
[&status, &finalConfiguration_3_2]
(common::V1_0::Status s, const HalStreamConfiguration& halConfiguration) {
finalConfiguration_3_2 = halConfiguration;
status = s;
});
if (!err.isOk()) {
ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
return DEAD_OBJECT;
}
finalConfiguration.streams.resize(finalConfiguration_3_2.streams.size());
for (size_t i = 0; i < finalConfiguration_3_2.streams.size(); i++) {
finalConfiguration.streams[i].v3_2 = finalConfiguration_3_2.streams[i];
finalConfiguration.streams[i].overrideDataSpace =
requestedConfiguration.streams[i].dataSpace;
}
}
if (status != common::V1_0::Status::OK ) {
@ -3223,7 +3273,7 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat
size_t realIdx = i;
bool found = false;
for (size_t idx = 0; idx < finalConfiguration.streams.size(); idx++) {
if (finalConfiguration.streams[realIdx].id == streamId) {
if (finalConfiguration.streams[realIdx].v3_2.id == streamId) {
found = true;
break;
}
@ -3234,42 +3284,51 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat
__FUNCTION__, streamId);
return INVALID_OPERATION;
}
HalStream &src = finalConfiguration.streams[realIdx];
device::V3_3::HalStream &src = finalConfiguration.streams[realIdx];
Camera3Stream* dstStream = Camera3Stream::cast(dst);
dstStream->setFormatOverride(false);
int overrideFormat = mapToFrameworkFormat(src.overrideFormat);
dstStream->setDataSpaceOverride(false);
int overrideFormat = mapToFrameworkFormat(src.v3_2.overrideFormat);
android_dataspace overrideDataSpace = mapToFrameworkDataspace(src.overrideDataSpace);
if (dst->format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
if (dst->format != overrideFormat) {
ALOGE("%s: Stream %d: Format override not allowed for format 0x%x", __FUNCTION__,
streamId, dst->format);
}
if (dst->data_space != overrideDataSpace) {
ALOGE("%s: Stream %d: DataSpace override not allowed for format 0x%x", __FUNCTION__,
streamId, dst->format);
}
} else {
dstStream->setFormatOverride((dst->format != overrideFormat) ? true : false);
dstStream->setOriginalFormat(dst->format);
dstStream->setDataSpaceOverride((dst->data_space != overrideDataSpace) ? true : false);
// Override allowed with IMPLEMENTATION_DEFINED
dst->format = overrideFormat;
dst->data_space = overrideDataSpace;
}
if (dst->stream_type == CAMERA3_STREAM_INPUT) {
if (src.producerUsage != 0) {
if (src.v3_2.producerUsage != 0) {
ALOGE("%s: Stream %d: INPUT streams must have 0 for producer usage",
__FUNCTION__, streamId);
return INVALID_OPERATION;
}
Camera3Stream::cast(dst)->setUsage(
mapConsumerToFrameworkUsage(src.consumerUsage));
dstStream->setUsage(
mapConsumerToFrameworkUsage(src.v3_2.consumerUsage));
} else {
// OUTPUT
if (src.consumerUsage != 0) {
if (src.v3_2.consumerUsage != 0) {
ALOGE("%s: Stream %d: OUTPUT streams must have 0 for consumer usage",
__FUNCTION__, streamId);
return INVALID_OPERATION;
}
Camera3Stream::cast(dst)->setUsage(
mapProducerToFrameworkUsage(src.producerUsage));
dstStream->setUsage(
mapProducerToFrameworkUsage(src.v3_2.producerUsage));
}
dst->max_buffers = src.maxBuffers;
dst->max_buffers = src.v3_2.maxBuffers;
}
return res;

@ -30,6 +30,7 @@
#include <android/hardware/camera/device/3.2/ICameraDevice.h>
#include <android/hardware/camera/device/3.2/ICameraDeviceSession.h>
#include <android/hardware/camera/device/3.3/ICameraDeviceSession.h>
#include <android/hardware/camera/device/3.2/ICameraDeviceCallback.h>
#include <fmq/MessageQueue.h>
#include <hardware/camera3.h>
@ -595,6 +596,8 @@ class Camera3Device :
/*out*/ hardware::camera::device::V3_2::StreamConfigurationMode *mode);
static camera3_buffer_status_t mapHidlBufferStatus(hardware::camera::device::V3_2::BufferStatus status);
static int mapToFrameworkFormat(hardware::graphics::common::V1_0::PixelFormat pixelFormat);
static android_dataspace mapToFrameworkDataspace(
hardware::camera::device::V3_2::DataspaceFlags);
static uint64_t mapConsumerToFrameworkUsage(
hardware::camera::device::V3_2::BufferUsageFlags usage);
static uint64_t mapProducerToFrameworkUsage(

@ -116,18 +116,28 @@ void Camera3Stream::setUsage(uint64_t usage) {
void Camera3Stream::setFormatOverride(bool formatOverridden) {
mFormatOverridden = formatOverridden;
if (formatOverridden) mOriginalFormat = camera3_stream::format;
}
bool Camera3Stream::isFormatOverridden() {
bool Camera3Stream::isFormatOverridden() const {
return mFormatOverridden;
}
void Camera3Stream::setOriginalFormat(int originalFormat) {
mOriginalFormat = originalFormat;
int Camera3Stream::getOriginalFormat() const {
return mOriginalFormat;
}
int Camera3Stream::getOriginalFormat() {
return mOriginalFormat;
void Camera3Stream::setDataSpaceOverride(bool dataSpaceOverridden) {
mDataSpaceOverridden = dataSpaceOverridden;
if (dataSpaceOverridden) mOriginalDataSpace = camera3_stream::data_space;
}
bool Camera3Stream::isDataSpaceOverridden() const {
return mDataSpaceOverridden;
}
android_dataspace Camera3Stream::getOriginalDataSpace() const {
return mOriginalDataSpace;
}
camera3_stream* Camera3Stream::startConfiguration() {

@ -147,9 +147,11 @@ class Camera3Stream :
uint64_t getUsage() const;
void setUsage(uint64_t usage);
void setFormatOverride(bool formatOverriden);
bool isFormatOverridden();
void setOriginalFormat(int originalFormat);
int getOriginalFormat();
bool isFormatOverridden() const;
int getOriginalFormat() const;
void setDataSpaceOverride(bool dataSpaceOverriden);
bool isDataSpaceOverridden() const;
android_dataspace getOriginalDataSpace() const;
camera3_stream* asHalStream() override {
return this;
@ -522,6 +524,11 @@ class Camera3Stream :
//Keep track of original format in case it gets overridden
bool mFormatOverridden;
int mOriginalFormat;
//Keep track of original dataSpace in case it gets overridden
bool mDataSpaceOverridden;
android_dataspace mOriginalDataSpace;
}; // class Camera3Stream
}; // namespace camera3

@ -72,9 +72,11 @@ class Camera3StreamInterface : public virtual RefBase {
virtual int getFormat() const = 0;
virtual android_dataspace getDataSpace() const = 0;
virtual void setFormatOverride(bool formatOverriden) = 0;
virtual bool isFormatOverridden() = 0;
virtual void setOriginalFormat(int originalFormat) = 0;
virtual int getOriginalFormat() = 0;
virtual bool isFormatOverridden() const = 0;
virtual int getOriginalFormat() const = 0;
virtual void setDataSpaceOverride(bool dataSpaceOverriden) = 0;
virtual bool isDataSpaceOverridden() const = 0;
virtual android_dataspace getOriginalDataSpace() const = 0;
/**
* Get a HAL3 handle for the stream, without starting stream configuration.

Loading…
Cancel
Save