Revert "Revert "Revert "Extend EVS interfaces and data types"""
This reverts commit 47b45af32cdea1788a1fd3e316f97d89aeddac2b.
diff --git a/automotive/evs/1.1/Android.bp b/automotive/evs/1.1/Android.bp
index c850c91..d2e85f1 100644
--- a/automotive/evs/1.1/Android.bp
+++ b/automotive/evs/1.1/Android.bp
@@ -10,15 +10,13 @@
"types.hal",
"IEvsCamera.hal",
"IEvsCameraStream.hal",
- "IEvsEnumerator.hal",
],
interfaces: [
"android.hardware.automotive.evs@1.0",
- "android.hardware.camera.device@3.2",
"android.hardware.graphics.common@1.0",
"android.hardware.graphics.common@1.1",
"android.hardware.graphics.common@1.2",
"android.hidl.base@1.0",
],
- gen_java: false,
+ gen_java: true,
}
diff --git a/automotive/evs/1.1/IEvsCamera.hal b/automotive/evs/1.1/IEvsCamera.hal
index 975b6c6..21ca79e 100644
--- a/automotive/evs/1.1/IEvsCamera.hal
+++ b/automotive/evs/1.1/IEvsCamera.hal
@@ -26,14 +26,6 @@
*/
interface IEvsCamera extends @1.0::IEvsCamera {
/**
- * Returns the description of this camera.
- *
- * @return info The description of this camera. This must be the same value as
- * reported by EvsEnumerator::getCameraList_1_1().
- */
- getCameraInfo_1_1() generates (CameraDesc info);
-
- /**
* Requests to pause EVS camera stream events.
*
* Like stopVideoStream(), events may continue to arrive for some time
@@ -108,27 +100,7 @@
unsetMaster() generates (EvsResult result);
/**
- * Retrieves a list of parameters this camera supports.
- *
- * @return params A list of CameraParam that this camera supports.
- */
- getParameterList() generates (vec<CameraParam> params);
-
- /**
- * Requests a valid value range of a camera parameter
- *
- * @param id The identifier of camera parameter, CameraParam enum.
- *
- * @return min The lower bound of valid parameter value range.
- * @return max The upper bound of valid parameter value range.
- * @return step The resolution of values in valid range.
- */
- getIntParameterRange(CameraParam id)
- generates (int32_t min, int32_t max, int32_t step);
-
- /**
- * Requests to set a camera parameter. Only a request from the master
- * client will be processed successfully.
+ * Requests to set a camera parameter.
*
* @param id The identifier of camera parameter, CameraParam enum.
* value A desired parameter value.
@@ -142,7 +114,7 @@
* from what the client gives if, for example, the
* driver does not support a target parameter.
*/
- setIntParameter(CameraParam id, int32_t value)
+ setParameter(CameraParam id, int32_t value)
generates (EvsResult result, int32_t effectiveValue);
/**
@@ -154,5 +126,5 @@
* not supported.
* value A value of requested camera parameter.
*/
- getIntParameter(CameraParam id) generates(EvsResult result, int32_t value);
+ getParameter(CameraParam id) generates(EvsResult result, int32_t value);
};
diff --git a/automotive/evs/1.1/IEvsCameraStream.hal b/automotive/evs/1.1/IEvsCameraStream.hal
index 9e4ea19..7c7f832 100644
--- a/automotive/evs/1.1/IEvsCameraStream.hal
+++ b/automotive/evs/1.1/IEvsCameraStream.hal
@@ -17,32 +17,15 @@
package android.hardware.automotive.evs@1.1;
import @1.0::IEvsCameraStream;
-import @1.1::BufferDesc;
-import @1.1::EvsEvent;
/**
* Implemented on client side to receive asynchronous streaming event deliveries.
*/
interface IEvsCameraStream extends @1.0::IEvsCameraStream {
-
- /**
- * Receives calls from the HAL each time a video frame is ready for inspection.
- * Buffer handles received by this method must be returned via calls to
- * IEvsCamera::doneWithFrame_1_1(). When the video stream is stopped via a call
- * to IEvsCamera::stopVideoStream(), this callback may continue to happen for
- * some time as the pipeline drains. Each frame must still be returned.
- * When the last frame in the stream has been delivered, STREAM_STOPPED
- * event must be delivered. No further frame deliveries may happen
- * thereafter.
- *
- * @param buffer a buffer descriptor of a delivered image frame.
- */
- oneway deliverFrame_1_1(BufferDesc buffer);
-
/**
* Receives calls from the HAL each time an event happens.
*
* @param event EVS event with possible event information.
*/
- oneway notify(EvsEvent event);
+ oneway notifyEvent(EvsEvent event);
};
diff --git a/automotive/evs/1.1/IEvsEnumerator.hal b/automotive/evs/1.1/IEvsEnumerator.hal
deleted file mode 100644
index 1695821..0000000
--- a/automotive/evs/1.1/IEvsEnumerator.hal
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * 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.
- */
-
-package android.hardware.automotive.evs@1.1;
-
-import IEvsCamera;
-import @1.0::IEvsEnumerator;
-import @1.0::EvsResult;
-import android.hardware.camera.device@3.2::Stream;
-
-/**
- * Provides the mechanism for EVS camera discovery
- */
-interface IEvsEnumerator extends @1.0::IEvsEnumerator {
- /**
- * Returns a list of all EVS cameras available to the system
- *
- * @return cameras A list of cameras availale for EVS service.
- */
- getCameraList_1_1() generates (vec<CameraDesc> cameras);
-
- /**
- * Gets the IEvsCamera associated with a cameraId from a CameraDesc
- *
- * Given a camera's unique cameraId from CameraDesc, returns the
- * IEvsCamera interface associated with the specified camera. When
- * done using the camera, the caller may release it by calling closeCamera().
- *
- * @param cameraId A unique identifier of the camera.
- * @param streamCfg A stream configuration the client wants to use.
- * @return evsCamera EvsCamera object associated with a given cameraId.
- * Returned object would be null if a camera device does
- * not support a given stream configuration or is already
- * configured differently by another client.
- */
- openCamera_1_1(string cameraId, Stream streamCfg) generates (IEvsCamera evsCamera);
-};
diff --git a/automotive/evs/1.1/default/Android.bp b/automotive/evs/1.1/default/Android.bp
index 41cb426..a463471 100644
--- a/automotive/evs/1.1/default/Android.bp
+++ b/automotive/evs/1.1/default/Android.bp
@@ -7,41 +7,25 @@
"service.cpp",
"EvsCamera.cpp",
"EvsEnumerator.cpp",
- "EvsDisplay.cpp",
- "ConfigManager.cpp",
- "ConfigManagerUtil.cpp",
+ "EvsDisplay.cpp"
],
init_rc: ["android.hardware.automotive.evs@1.1-service.rc"],
shared_libs: [
"android.hardware.automotive.evs@1.0",
"android.hardware.automotive.evs@1.1",
- "android.hardware.camera.device@3.2",
"libbase",
"libbinder",
- "liblog",
+ "libcutils",
"libhardware",
"libhidlbase",
"liblog",
"libui",
"libutils",
- "libcamera_metadata",
- "libtinyxml2",
],
cflags: [
"-O0",
"-g",
],
-
- required: [
- "evs_default_configuration.xml",
- ],
-}
-
-prebuilt_etc {
- name: "evs_default_configuration.xml",
-
- src: "resources/evs_default_configuration.xml",
- sub_dir: "automotive/evs",
}
diff --git a/automotive/evs/1.1/default/ConfigManager.cpp b/automotive/evs/1.1/default/ConfigManager.cpp
deleted file mode 100644
index 4f46f9d..0000000
--- a/automotive/evs/1.1/default/ConfigManager.cpp
+++ /dev/null
@@ -1,487 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * 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.
- */
-
-#include <sstream>
-#include <fstream>
-#include <thread>
-
-#include <hardware/gralloc.h>
-#include <utils/SystemClock.h>
-#include <android/hardware/camera/device/3.2/ICameraDevice.h>
-
-#include "ConfigManager.h"
-
-using ::android::hardware::camera::device::V3_2::StreamRotation;
-
-
-ConfigManager::~ConfigManager() {
- /* Nothing to do */
-}
-
-
-void ConfigManager::readCameraInfo(const XMLElement * const aCameraElem) {
- if (aCameraElem == nullptr) {
- ALOGW("XML file does not have required camera element");
- return;
- }
-
- const XMLElement *curElem = aCameraElem->FirstChildElement();
- while (curElem != nullptr) {
- if (!strcmp(curElem->Name(), "group")) {
- /* camera group identifier */
- const char *group_id = curElem->FindAttribute("group_id")->Value();
-
- /* create CameraGroup */
- unique_ptr<ConfigManager::CameraGroup> aCameraGroup(new ConfigManager::CameraGroup());
-
- /* add a camera device to its group */
- addCameraDevices(curElem->FindAttribute("device_id")->Value(), aCameraGroup);
-
- /* a list of camera stream configurations */
- const XMLElement *childElem =
- curElem->FirstChildElement("caps")->FirstChildElement("stream");
- while (childElem != nullptr) {
- /* read 5 attributes */
- const XMLAttribute *idAttr = childElem->FindAttribute("id");
- const XMLAttribute *widthAttr = childElem->FindAttribute("width");
- const XMLAttribute *heightAttr = childElem->FindAttribute("height");
- const XMLAttribute *fmtAttr = childElem->FindAttribute("format");
- const XMLAttribute *fpsAttr = childElem->FindAttribute("framerate");
-
- const int32_t id = stoi(idAttr->Value());
- int32_t framerate = 0;
- if (fpsAttr != nullptr) {
- framerate = stoi(fpsAttr->Value());
- }
-
- int32_t pixFormat;
- if (ConfigManagerUtil::convertToPixelFormat(fmtAttr->Value(),
- pixFormat)) {
- RawStreamConfiguration cfg = {
- id,
- stoi(widthAttr->Value()),
- stoi(heightAttr->Value()),
- pixFormat,
- ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
- framerate
- };
- aCameraGroup->streamConfigurations[id] = cfg;
- }
-
- childElem = childElem->NextSiblingElement("stream");
- }
-
- /* camera group synchronization */
- const char *sync = curElem->FindAttribute("synchronized")->Value();
- aCameraGroup->synchronized =
- static_cast<bool>(strcmp(sync, "false"));
-
- /* add a group to hash map */
- mCameraGroups[group_id] = std::move(aCameraGroup);
- } else if (!strcmp(curElem->Name(), "device")) {
- /* camera unique identifier */
- const char *id = curElem->FindAttribute("id")->Value();
-
- /* camera mount location */
- const char *pos = curElem->FindAttribute("position")->Value();
-
- /* store read camera module information */
- mCameraInfo[id] = readCameraDeviceInfo(curElem);
-
- /* assign a camera device to a position group */
- mCameraPosition[pos].emplace(id);
- } else {
- /* ignore other device types */
- ALOGD("Unknown element %s is ignored", curElem->Name());
- }
-
- curElem = curElem->NextSiblingElement();
- }
-}
-
-
-unique_ptr<ConfigManager::CameraInfo>
-ConfigManager::readCameraDeviceInfo(const XMLElement *aDeviceElem) {
- if (aDeviceElem == nullptr) {
- return nullptr;
- }
-
- /* create a CameraInfo to be filled */
- unique_ptr<ConfigManager::CameraInfo> aCamera(new ConfigManager::CameraInfo());
-
- /* size information to allocate camera_metadata_t */
- size_t totalEntries = 0;
- size_t totalDataSize = 0;
-
- /* read device capabilities */
- totalEntries +=
- readCameraCapabilities(aDeviceElem->FirstChildElement("caps"),
- aCamera,
- totalDataSize);
-
-
- /* read camera metadata */
- totalEntries +=
- readCameraMetadata(aDeviceElem->FirstChildElement("characteristics"),
- aCamera,
- totalDataSize);
-
- /* construct camera_metadata_t */
- if (!constructCameraMetadata(aCamera, totalEntries, totalDataSize)) {
- ALOGW("Either failed to allocate memory or "
- "allocated memory was not large enough");
- }
-
- return aCamera;
-}
-
-
-size_t ConfigManager::readCameraCapabilities(const XMLElement * const aCapElem,
- unique_ptr<ConfigManager::CameraInfo> &aCamera,
- size_t &dataSize) {
- if (aCapElem == nullptr) {
- return 0;
- }
-
- string token;
- const XMLElement *curElem = nullptr;
-
- /* a list of supported camera parameters/controls */
- curElem = aCapElem->FirstChildElement("supported_controls");
- if (curElem != nullptr) {
- const XMLElement *ctrlElem = curElem->FirstChildElement("control");
- while (ctrlElem != nullptr) {
- const char *nameAttr = ctrlElem->FindAttribute("name")->Value();;
- const int32_t minVal = stoi(ctrlElem->FindAttribute("min")->Value());
- const int32_t maxVal = stoi(ctrlElem->FindAttribute("max")->Value());
-
- int32_t stepVal = 1;
- const XMLAttribute *stepAttr = ctrlElem->FindAttribute("step");
- if (stepAttr != nullptr) {
- stepVal = stoi(stepAttr->Value());
- }
-
- CameraParam aParam;
- if (ConfigManagerUtil::convertToEvsCameraParam(nameAttr,
- aParam)) {
- aCamera->controls.emplace(
- aParam,
- make_tuple(minVal, maxVal, stepVal)
- );
- }
-
- ctrlElem = ctrlElem->NextSiblingElement("control");
- }
- }
-
- /* a list of camera stream configurations */
- curElem = aCapElem->FirstChildElement("stream");
- while (curElem != nullptr) {
- /* read 5 attributes */
- const XMLAttribute *idAttr = curElem->FindAttribute("id");
- const XMLAttribute *widthAttr = curElem->FindAttribute("width");
- const XMLAttribute *heightAttr = curElem->FindAttribute("height");
- const XMLAttribute *fmtAttr = curElem->FindAttribute("format");
- const XMLAttribute *fpsAttr = curElem->FindAttribute("framerate");
-
- const int32_t id = stoi(idAttr->Value());
- int32_t framerate = 0;
- if (fpsAttr != nullptr) {
- framerate = stoi(fpsAttr->Value());
- }
-
- int32_t pixFormat;
- if (ConfigManagerUtil::convertToPixelFormat(fmtAttr->Value(),
- pixFormat)) {
- RawStreamConfiguration cfg = {
- id,
- stoi(widthAttr->Value()),
- stoi(heightAttr->Value()),
- pixFormat,
- ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
- framerate
- };
- aCamera->streamConfigurations[id] = cfg;
- }
-
- curElem = curElem->NextSiblingElement("stream");
- }
-
- dataSize = calculate_camera_metadata_entry_data_size(
- get_camera_metadata_tag_type(
- ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS
- ),
- aCamera->streamConfigurations.size() * kStreamCfgSz
- );
-
- /* a single camera metadata entry contains multiple stream configurations */
- return dataSize > 0 ? 1 : 0;
-}
-
-
-size_t ConfigManager::readCameraMetadata(const XMLElement * const aParamElem,
- unique_ptr<ConfigManager::CameraInfo> &aCamera,
- size_t &dataSize) {
- if (aParamElem == nullptr) {
- return 0;
- }
-
- const XMLElement *curElem = aParamElem->FirstChildElement("parameter");
- size_t numEntries = 0;
- camera_metadata_tag_t tag;
- while (curElem != nullptr) {
- if (!ConfigManagerUtil::convertToMetadataTag(curElem->FindAttribute("name")->Value(),
- tag)) {
- switch(tag) {
- case ANDROID_LENS_DISTORTION:
- case ANDROID_LENS_POSE_ROTATION:
- case ANDROID_LENS_POSE_TRANSLATION:
- case ANDROID_LENS_INTRINSIC_CALIBRATION: {
- /* float[] */
- size_t count = 0;
- void *data = ConfigManagerUtil::convertFloatArray(
- curElem->FindAttribute("size")->Value(),
- curElem->FindAttribute("value")->Value(),
- count
- );
-
- aCamera->cameraMetadata[tag] =
- make_pair(make_unique<void *>(data), count);
-
- ++numEntries;
- dataSize += calculate_camera_metadata_entry_data_size(
- get_camera_metadata_tag_type(tag), count
- );
-
- break;
- }
-
- default:
- ALOGW("Parameter %s is not supported",
- curElem->FindAttribute("name")->Value());
- break;
- }
- }
-
- curElem = curElem->NextSiblingElement("parameter");
- }
-
- return numEntries;
-}
-
-
-bool ConfigManager::constructCameraMetadata(unique_ptr<CameraInfo> &aCamera,
- const size_t totalEntries,
- const size_t totalDataSize) {
- if (!aCamera->allocate(totalEntries, totalDataSize)) {
- ALOGE("Failed to allocate memory for camera metadata");
- return false;
- }
-
- const size_t numStreamConfigs = aCamera->streamConfigurations.size();
- unique_ptr<int32_t[]> data(new int32_t[kStreamCfgSz * numStreamConfigs]);
- int32_t *ptr = data.get();
- for (auto &cfg : aCamera->streamConfigurations) {
- for (auto i = 0; i < kStreamCfgSz; ++i) {
- *ptr++ = cfg.second[i];
- }
- }
- int32_t err = add_camera_metadata_entry(aCamera->characteristics,
- ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
- data.get(),
- numStreamConfigs * kStreamCfgSz);
-
- if (err) {
- ALOGE("Failed to add stream configurations to metadata, ignored");
- return false;
- }
-
- bool success = true;
- for (auto &[tag, entry] : aCamera->cameraMetadata) {
- /* try to add new camera metadata entry */
- int32_t err = add_camera_metadata_entry(aCamera->characteristics,
- tag,
- entry.first.get(),
- entry.second);
- if (err) {
- ALOGE("Failed to add an entry with a tag 0x%X", tag);
-
- /* may exceed preallocated capacity */
- ALOGE("Camera metadata has %ld / %ld entries and %ld / %ld bytes are filled",
- get_camera_metadata_entry_count(aCamera->characteristics),
- get_camera_metadata_entry_capacity(aCamera->characteristics),
- get_camera_metadata_data_count(aCamera->characteristics),
- get_camera_metadata_data_capacity(aCamera->characteristics));
- ALOGE("\tCurrent metadata entry requires %ld bytes",
- calculate_camera_metadata_entry_data_size(tag, entry.second));
-
- success = false;
- }
- }
-
- ALOGV("Camera metadata has %ld / %ld entries and %ld / %ld bytes are filled",
- get_camera_metadata_entry_count(aCamera->characteristics),
- get_camera_metadata_entry_capacity(aCamera->characteristics),
- get_camera_metadata_data_count(aCamera->characteristics),
- get_camera_metadata_data_capacity(aCamera->characteristics));
-
- return success;
-}
-
-
-void ConfigManager::readSystemInfo(const XMLElement * const aSysElem) {
- if (aSysElem == nullptr) {
- return;
- }
-
- /*
- * Please note that this function assumes that a given system XML element
- * and its child elements follow DTD. If it does not, it will cause a
- * segmentation fault due to the failure of finding expected attributes.
- */
-
- /* read number of cameras available in the system */
- const XMLElement *xmlElem = aSysElem->FirstChildElement("num_cameras");
- if (xmlElem != nullptr) {
- mSystemInfo.numCameras =
- stoi(xmlElem->FindAttribute("value")->Value());
- }
-}
-
-
-void ConfigManager::readDisplayInfo(const XMLElement * const aDisplayElem) {
- if (aDisplayElem == nullptr) {
- ALOGW("XML file does not have required camera element");
- return;
- }
-
- const XMLElement *curDev = aDisplayElem->FirstChildElement("device");
- while (curDev != nullptr) {
- const char *id = curDev->FindAttribute("id")->Value();
- //const char *pos = curDev->FirstAttribute("position")->Value();
-
- unique_ptr<DisplayInfo> dpy(new DisplayInfo());
- if (dpy == nullptr) {
- ALOGE("Failed to allocate memory for DisplayInfo");
- return;
- }
-
- const XMLElement *cap = curDev->FirstChildElement("caps");
- if (cap != nullptr) {
- const XMLElement *curStream = cap->FirstChildElement("stream");
- while (curStream != nullptr) {
- /* read 4 attributes */
- const XMLAttribute *idAttr = curStream->FindAttribute("id");
- const XMLAttribute *widthAttr = curStream->FindAttribute("width");
- const XMLAttribute *heightAttr = curStream->FindAttribute("height");
- const XMLAttribute *fmtAttr = curStream->FindAttribute("format");
-
- const int32_t id = stoi(idAttr->Value());
- int32_t pixFormat;
- if (ConfigManagerUtil::convertToPixelFormat(fmtAttr->Value(),
- pixFormat)) {
- RawStreamConfiguration cfg = {
- id,
- stoi(widthAttr->Value()),
- stoi(heightAttr->Value()),
- pixFormat,
- ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT,
- 0 // unused
- };
- dpy->streamConfigurations[id] = cfg;
- }
-
- curStream = curStream->NextSiblingElement("stream");
- }
- }
-
- mDisplayInfo[id] = std::move(dpy);
- curDev = curDev->NextSiblingElement("device");
- }
-
- return;
-}
-
-
-bool ConfigManager::readConfigDataFromXML() noexcept {
- XMLDocument xmlDoc;
-
- const int64_t parsingStart = android::elapsedRealtimeNano();
-
- /* load and parse a configuration file */
- xmlDoc.LoadFile(mConfigFilePath);
- if (xmlDoc.ErrorID() != XML_SUCCESS) {
- ALOGE("Failed to load and/or parse a configuration file, %s", xmlDoc.ErrorStr());
- return false;
- }
-
- /* retrieve the root element */
- const XMLElement *rootElem = xmlDoc.RootElement();
- if (strcmp(rootElem->Name(), "configuration")) {
- ALOGE("A configuration file is not in the required format. "
- "See /etc/automotive/evs/evs_configuration.dtd");
- return false;
- }
-
- /*
- * parse camera information; this needs to be done before reading system
- * information
- */
- readCameraInfo(rootElem->FirstChildElement("camera"));
-
- /* parse system information */
- readSystemInfo(rootElem->FirstChildElement("system"));
-
- /* parse display information */
- readDisplayInfo(rootElem->FirstChildElement("display"));
-
- const int64_t parsingEnd = android::elapsedRealtimeNano();
- ALOGI("Parsing configuration file takes %lf (ms)",
- (double)(parsingEnd - parsingStart) / 1000000.0);
-
-
- return true;
-}
-
-
-void ConfigManager::addCameraDevices(const char *devices,
- unique_ptr<CameraGroup> &aGroup) {
- stringstream device_list(devices);
- string token;
- while (getline(device_list, token, ',')) {
- aGroup->devices.emplace(token);
- }
-}
-
-
-std::unique_ptr<ConfigManager> ConfigManager::Create(const char *path) {
- unique_ptr<ConfigManager> cfgMgr(new ConfigManager(path));
-
- /*
- * Read a configuration from XML file
- *
- * If this is too slow, ConfigManager::readConfigDataFromBinary() and
- * ConfigManager::writeConfigDataToBinary()can serialize CameraInfo object
- * to the filesystem and construct CameraInfo instead; this was
- * evaluated as 10x faster.
- */
- if (!cfgMgr->readConfigDataFromXML()) {
- return nullptr;
- } else {
- return cfgMgr;
- }
-}
-
diff --git a/automotive/evs/1.1/default/ConfigManager.h b/automotive/evs/1.1/default/ConfigManager.h
deleted file mode 100644
index 0275f90..0000000
--- a/automotive/evs/1.1/default/ConfigManager.h
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * 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 CONFIG_MANAGER_H
-#define CONFIG_MANAGER_H
-
-#include <vector>
-#include <string>
-#include <unordered_map>
-#include <unordered_set>
-
-#include <tinyxml2.h>
-
-#include <system/camera_metadata.h>
-#include <log/log.h>
-#include <android/hardware/automotive/evs/1.1/types.h>
-
-#include "ConfigManagerUtil.h"
-
-using namespace std;
-using namespace tinyxml2;
-
-using ::android::hardware::hidl_vec;
-using ::android::hardware::camera::device::V3_2::Stream;
-using ::android::hardware::automotive::evs::V1_1::CameraParam;
-
-/*
- * Plese note that this is different from what is defined in
- * libhardware/modules/camera/3_4/metadata/types.h; this has one additional
- * field to store a framerate.
- */
-const size_t kStreamCfgSz = 6;
-typedef std::array<int32_t, kStreamCfgSz> RawStreamConfiguration;
-
-class ConfigManager {
-public:
- static std::unique_ptr<ConfigManager> Create(const char *path = "");
- ConfigManager(const ConfigManager&) = delete;
- ConfigManager& operator=(const ConfigManager&) = delete;
-
- virtual ~ConfigManager();
-
- /* Camera device's capabilities and metadata */
- class CameraInfo {
- public:
- CameraInfo() :
- characteristics(nullptr) {
- /* Nothing to do */
- }
-
- virtual ~CameraInfo() {
- free_camera_metadata(characteristics);
- }
-
- /* Allocate memory for camera_metadata_t */
- bool allocate(size_t entry_cap, size_t data_cap) {
- if (characteristics != nullptr) {
- ALOGE("Camera metadata is already allocated");
- return false;
- }
-
- characteristics = allocate_camera_metadata(entry_cap, data_cap);
- return characteristics != nullptr;
- }
-
- /*
- * List of supported controls that the master client can program.
- * Paraemters are stored with its valid range
- */
- unordered_map<CameraParam,
- tuple<int32_t, int32_t, int32_t>> controls;
-
- /* List of supported frame rates */
- unordered_set<int32_t> frameRates;
-
- /*
- * List of supported output stream configurations; each array stores
- * format, width, height, and direction values in the order.
- */
- unordered_map<int32_t, RawStreamConfiguration> streamConfigurations;
-
- /*
- * Internal storage for camera metadata. Each entry holds a pointer to
- * data and number of elements
- */
- unordered_map<camera_metadata_tag_t,
- pair<unique_ptr<void *>, size_t>> cameraMetadata;
-
- /* Camera module characteristics */
- camera_metadata_t *characteristics;
- };
-
- class CameraGroup {
- public:
- CameraGroup() {}
-
- /* ID of member camera devices */
- unordered_set<string> devices;
-
- /* The capture operation of member camera devices are synchronized */
- bool synchronized = false;
-
- /*
- * List of stream configurations that are supposed by all camera devices
- * in this group.
- */
- unordered_map<int32_t, RawStreamConfiguration> streamConfigurations;
- };
-
- class SystemInfo {
- public:
- /* number of available cameras */
- int32_t numCameras = 0;
- };
-
- class DisplayInfo {
- public:
- /*
- * List of supported input stream configurations; each array stores
- * format, width, height, and direction values in the order.
- */
- unordered_map<int32_t, RawStreamConfiguration> streamConfigurations;
- };
-
- /*
- * Return system information
- *
- * @return SystemInfo
- * Constant reference of SystemInfo.
- */
- const SystemInfo &getSystemInfo() {
- return mSystemInfo;
- }
-
- /*
- * Return a list of cameras
- *
- * This function assumes that it is not being called frequently.
- *
- * @return vector<string>
- * A vector that contains unique camera device identifiers.
- */
- vector<string> getCameraList() {
- vector<string> aList;
- for (auto &v : mCameraInfo) {
- aList.emplace_back(v.first);
- }
-
- return aList;
- }
-
-
- /*
- * Return a list of cameras
- *
- * @return CameraGroup
- * A pointer to a camera group identified by a given id.
- */
- unique_ptr<CameraGroup>& getCameraGroup(const string& gid) {
- return mCameraGroups[gid];
- }
-
-
- /*
- * Return a camera metadata
- *
- * @param cameraId
- * Unique camera node identifier in string
- *
- * @return unique_ptr<CameraInfo>
- * A pointer to CameraInfo that is associated with a given camera
- * ID. This returns a null pointer if this does not recognize a
- * given camera identifier.
- */
- unique_ptr<CameraInfo>& getCameraInfo(const string cameraId) noexcept {
- return mCameraInfo[cameraId];
- }
-
-private:
- /* Constructors */
- ConfigManager(const char *xmlPath) :
- mConfigFilePath(xmlPath) {
- }
-
- /* System configuration */
- SystemInfo mSystemInfo;
-
- /* Internal data structure for camera device information */
- unordered_map<string, unique_ptr<CameraInfo>> mCameraInfo;
-
- /* Internal data structure for camera device information */
- unordered_map<string, unique_ptr<DisplayInfo>> mDisplayInfo;
-
- /* Camera groups are stored in <groud id, CameraGroup> hash map */
- unordered_map<string, unique_ptr<CameraGroup>> mCameraGroups;
-
- /*
- * Camera positions are stored in <position, camera id set> hash map.
- * The position must be one of front, rear, left, and right.
- */
- unordered_map<string, unordered_set<string>> mCameraPosition;
-
- /* A path to XML configuration file */
- const char *mConfigFilePath;
-
- /*
- * Parse a given EVS configuration file and store the information
- * internally.
- *
- * @return bool
- * True if it completes parsing a file successfully.
- */
- bool readConfigDataFromXML() noexcept;
-
- /*
- * read the information of the vehicle
- *
- * @param aSysElem
- * A pointer to "system" XML element.
- */
- void readSystemInfo(const XMLElement * const aSysElem);
-
- /*
- * read the information of camera devices
- *
- * @param aCameraElem
- * A pointer to "camera" XML element that may contain multiple
- * "device" elements.
- */
- void readCameraInfo(const XMLElement * const aCameraElem);
-
- /*
- * read display device information
- *
- * @param aDisplayElem
- * A pointer to "display" XML element that may contain multiple
- * "device" elements.
- */
- void readDisplayInfo(const XMLElement * const aDisplayElem);
-
- /*
- * read camera device information
- *
- * @param aDeviceElem
- * A pointer to "device" XML element that contains camera module
- * capability info and its characteristics.
- *
- * @return unique_ptr<CameraInfo>
- * A pointer to CameraInfo class that contains camera module
- * capability and characteristics. Please note that this transfers
- * the ownership of created CameraInfo to the caller.
- */
- unique_ptr<CameraInfo> readCameraDeviceInfo(const XMLElement *aDeviceElem);
-
- /*
- * read camera metadata
- *
- * @param aCapElem
- * A pointer to "cap" XML element.
- * @param aCamera
- * A pointer to CameraInfo that is being filled by this method.
- * @param dataSize
- * Required size of memory to store camera metadata found in this
- * method. This is calculated in this method and returned to the
- * caller for camera_metadata allocation.
- *
- * @return size_t
- * Number of camera metadata entries
- */
- size_t readCameraCapabilities(const XMLElement * const aCapElem,
- unique_ptr<CameraInfo> &aCamera,
- size_t &dataSize);
-
- /*
- * read camera metadata
- *
- * @param aParamElem
- * A pointer to "characteristics" XML element.
- * @param aCamera
- * A pointer to CameraInfo that is being filled by this method.
- * @param dataSize
- * Required size of memory to store camera metadata found in this
- * method.
- *
- * @return size_t
- * Number of camera metadata entries
- */
- size_t readCameraMetadata(const XMLElement * const aParamElem,
- unique_ptr<CameraInfo> &aCamera,
- size_t &dataSize);
-
- /*
- * construct camera_metadata_t from camera capabilities and metadata
- *
- * @param aCamera
- * A pointer to CameraInfo that is being filled by this method.
- * @param totalEntries
- * Number of camera metadata entries to be added.
- * @param totalDataSize
- * Sum of sizes of camera metadata entries to be added.
- *
- * @return bool
- * False if either it fails to allocate memory for camera metadata
- * or its size is not large enough to add all found camera metadata
- * entries.
- */
- bool constructCameraMetadata(unique_ptr<CameraInfo> &aCamera,
- const size_t totalEntries,
- const size_t totalDataSize);
-
- /*
- * parse a comma-separated list of camera devices and add them to
- * CameraGroup.
- *
- * @param devices
- * A comma-separated list of camera device identifiers.
- * @param aGroup
- * Camera group which cameras will be added to.
- */
- void addCameraDevices(const char *devices,
- unique_ptr<CameraGroup> &aGroup);
-};
-#endif // CONFIG_MANAGER_H
-
diff --git a/automotive/evs/1.1/default/ConfigManagerUtil.cpp b/automotive/evs/1.1/default/ConfigManagerUtil.cpp
deleted file mode 100644
index 8206daa..0000000
--- a/automotive/evs/1.1/default/ConfigManagerUtil.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * 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.
- */
-
-#include "ConfigManagerUtil.h"
-
-#include <string>
-#include <sstream>
-#include <linux/videodev2.h>
-
-#include <log/log.h>
-#include <system/graphics-base-v1.0.h>
-
-
-bool ConfigManagerUtil::convertToEvsCameraParam(const string &id,
- CameraParam &camParam) {
- string trimmed = ConfigManagerUtil::trimString(id);
- bool success = true;
-
- if (!trimmed.compare("BRIGHTNESS")) {
- camParam = CameraParam::BRIGHTNESS;
- } else if (!trimmed.compare("CONTRAST")) {
- camParam = CameraParam::CONTRAST;
- } else if (!trimmed.compare("AUTOGAIN")) {
- camParam = CameraParam::AUTOGAIN;
- } else if (!trimmed.compare("GAIN")) {
- camParam = CameraParam::GAIN;
- } else if (!trimmed.compare("AUTO_WHITE_BALANCE")) {
- camParam = CameraParam::AUTO_WHITE_BALANCE;
- } else if (!trimmed.compare("WHITE_BALANCE_TEMPERATURE")) {
- camParam = CameraParam::WHITE_BALANCE_TEMPERATURE;
- } else if (!trimmed.compare("SHARPNESS")) {
- camParam = CameraParam::SHARPNESS;
- } else if (!trimmed.compare("AUTO_EXPOSURE")) {
- camParam = CameraParam::AUTO_EXPOSURE;
- } else if (!trimmed.compare("ABSOLUTE_EXPOSURE")) {
- camParam = CameraParam::ABSOLUTE_EXPOSURE;
- } else if (!trimmed.compare("ABSOLUTE_FOCUS")) {
- camParam = CameraParam::ABSOLUTE_FOCUS;
- } else if (!trimmed.compare("AUTO_FOCUS")) {
- camParam = CameraParam::AUTO_FOCUS;
- } else if (!trimmed.compare("ABSOLUTE_ZOOM")) {
- camParam = CameraParam::ABSOLUTE_ZOOM;
- } else {
- success = false;
- }
-
- return success;
-}
-
-
-bool ConfigManagerUtil::convertToPixelFormat(const string &format,
- int32_t &pixFormat) {
- string trimmed = ConfigManagerUtil::trimString(format);
- bool success = true;
-
- if (!trimmed.compare("RGBA_8888")) {
- pixFormat = HAL_PIXEL_FORMAT_RGBA_8888;
- } else if (!trimmed.compare("YCRCB_420_SP")) {
- pixFormat = HAL_PIXEL_FORMAT_YCRCB_420_SP;
- } else if (!trimmed.compare("YCBCR_422_I")) {
- pixFormat = HAL_PIXEL_FORMAT_YCBCR_422_I;
- } else {
- success = false;
- }
-
- return success;
-}
-
-
-bool ConfigManagerUtil::convertToMetadataTag(const char *name,
- camera_metadata_tag &aTag) {
- if (!strcmp(name, "LENS_DISTORTION")) {
- aTag = ANDROID_LENS_DISTORTION;
- } else if (!strcmp(name, "LENS_INTRINSIC_CALIBRATION")) {
- aTag = ANDROID_LENS_INTRINSIC_CALIBRATION;
- } else if (!strcmp(name, "LENS_POSE_ROTATION")) {
- aTag = ANDROID_LENS_POSE_ROTATION;
- } else if (!strcmp(name, "LENS_POSE_TRANSLATION")) {
- aTag = ANDROID_LENS_POSE_TRANSLATION;
- } else {
- return false;
- }
-
- return true;
-}
-
-
-float *ConfigManagerUtil::convertFloatArray(const char *sz, const char *vals,
- size_t &count, const char delimiter) {
- string size_string(sz);
- string value_string(vals);
-
- count = stoi(size_string);
- float *result = new float[count];
- stringstream values(value_string);
-
- int32_t idx = 0;
- string token;
- while (getline(values, token, delimiter)) {
- result[idx++] = stof(token);
- }
-
- return result;
-}
-
-
-string ConfigManagerUtil::trimString(const string &src, const string &ws) {
- const auto s = src.find_first_not_of(ws);
- if (s == string::npos) {
- return "";
- }
-
- const auto e = src.find_last_not_of(ws);
- const auto r = e - s + 1;
-
- return src.substr(s, r);
-}
-
diff --git a/automotive/evs/1.1/default/ConfigManagerUtil.h b/automotive/evs/1.1/default/ConfigManagerUtil.h
deleted file mode 100644
index 8c89ae7..0000000
--- a/automotive/evs/1.1/default/ConfigManagerUtil.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * 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 CONFIG_MANAGER_UTIL_H
-#define CONFIG_MANAGER_UTIL_H
-
-#include <utility>
-#include <string>
-#include <system/camera_metadata.h>
-#include <android/hardware/automotive/evs/1.1/types.h>
-
-using namespace std;
-using ::android::hardware::automotive::evs::V1_1::CameraParam;
-
-
-class ConfigManagerUtil {
-public:
- /**
- * Convert a given string into V4L2_CID_*
- */
- static bool convertToEvsCameraParam(const string &id,
- CameraParam &camParam);
- /**
- * Convert a given string into android.hardware.graphics.common.PixelFormat
- */
- static bool convertToPixelFormat(const string &format,
- int32_t &pixelFormat);
- /**
- * Convert a given string into corresponding camera metadata data tag defined in
- * system/media/camera/include/system/camera_metadta_tags.h
- */
- static bool convertToMetadataTag(const char *name,
- camera_metadata_tag &aTag);
- /**
- * Convert a given string into a floating value array
- */
- static float *convertFloatArray(const char *sz,
- const char *vals,
- size_t &count,
- const char delimiter = ',');
- /**
- * Trim a string
- */
- static string trimString(const string &src,
- const string &ws = " \n\r\t\f\v");
-};
-
-#endif // CONFIG_MANAGER_UTIL_H
-
diff --git a/automotive/evs/1.1/default/EvsCamera.cpp b/automotive/evs/1.1/default/EvsCamera.cpp
index 5ba753d..2d55566 100644
--- a/automotive/evs/1.1/default/EvsCamera.cpp
+++ b/automotive/evs/1.1/default/EvsCamera.cpp
@@ -40,21 +40,28 @@
const unsigned MAX_BUFFERS_IN_FLIGHT = 100;
-EvsCamera::EvsCamera(const char *id,
- unique_ptr<ConfigManager::CameraInfo> &camInfo) :
+EvsCamera::EvsCamera(const char *id) :
mFramesAllowed(0),
mFramesInUse(0),
- mStreamState(STOPPED),
- mCameraInfo(camInfo) {
+ mStreamState(STOPPED) {
ALOGD("EvsCamera instantiated");
- /* set a camera id */
- mDescription.v1.cameraId = id;
+ mDescription.cameraId = id;
- /* set camera metadata */
- mDescription.metadata.setToExternal((uint8_t *)camInfo->characteristics,
- get_camera_metadata_size(camInfo->characteristics));
+ // Set up dummy data for testing
+ if (mDescription.cameraId == kCameraName_Backup) {
+ mWidth = 640; // full NTSC/VGA
+ mHeight = 480; // full NTSC/VGA
+ mDescription.vendorFlags = 0xFFFFFFFF; // Arbitrary value
+ } else {
+ mWidth = 320; // 1/2 NTSC/VGA
+ mHeight = 240; // 1/2 NTSC/VGA
+ }
+
+ mFormat = HAL_PIXEL_FORMAT_RGBA_8888;
+ mUsage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_CAMERA_WRITE |
+ GRALLOC_USAGE_SW_READ_RARELY | GRALLOC_USAGE_SW_WRITE_RARELY;
}
@@ -102,7 +109,7 @@
ALOGD("getCameraInfo");
// Send back our self description
- _hidl_cb(mDescription.v1);
+ _hidl_cb(mDescription);
return Void();
}
@@ -187,7 +194,7 @@
// Block outside the mutex until the "stop" flag has been acknowledged
// We won't send any more frames, but the client might still get some already in flight
- ALOGD("Waiting for stream thread to end...");
+ ALOGD("Waiting for stream thread to end..");
lock.unlock();
mCaptureThread.join();
lock.lock();
@@ -231,15 +238,6 @@
// Methods from ::android::hardware::automotive::evs::V1_1::IEvsCamera follow.
-Return<void> EvsCamera::getCameraInfo_1_1(getCameraInfo_1_1_cb _hidl_cb) {
- ALOGD("getCameraInfo_1_1");
-
- // Send back our self description
- _hidl_cb(mDescription);
- return Void();
-}
-
-
Return<EvsResult> EvsCamera::doneWithFrame_1_1(const BufferDesc_1_1& bufDesc) {
std::lock_guard <std::mutex> lock(mAccessLock);
returnBuffer(bufDesc.bufferId, bufDesc.buffer.nativeHandle);
@@ -280,29 +278,8 @@
}
-Return<void> EvsCamera::getParameterList(getParameterList_cb _hidl_cb) {
- hidl_vec<CameraParam> hidlCtrls;
- hidlCtrls.resize(mCameraInfo->controls.size());
- unsigned idx = 0;
- for (auto& [cid, cfg] : mCameraInfo->controls) {
- hidlCtrls[idx++] = cid;
- }
-
- _hidl_cb(hidlCtrls);
- return Void();
-}
-
-
-Return<void> EvsCamera::getIntParameterRange(CameraParam id,
- getIntParameterRange_cb _hidl_cb) {
- auto range = mCameraInfo->controls[id];
- _hidl_cb(get<0>(range), get<1>(range), get<2>(range));
- return Void();
-}
-
-
-Return<void> EvsCamera::setIntParameter(CameraParam id, int32_t value,
- setIntParameter_cb _hidl_cb) {
+Return<void> EvsCamera::setParameter(CameraParam id, int32_t value,
+ setParameter_cb _hidl_cb) {
// Default implementation does not support this.
(void)id;
(void)value;
@@ -311,8 +288,7 @@
}
-Return<void> EvsCamera::getIntParameter(CameraParam id,
- getIntParameter_cb _hidl_cb) {
+Return<void> EvsCamera::getParameter(CameraParam id, getParameter_cb _hidl_cb) {
// Default implementation does not support this.
(void)id;
_hidl_cb(EvsResult::INVALID_ARG, 0);
@@ -495,7 +471,9 @@
fillTestFrame(newBuffer);
// Issue the (asynchronous) callback to the client -- can't be holding the lock
- auto result = mStream->deliverFrame_1_1(newBuffer);
+ EvsEvent event;
+ event.buffer(newBuffer);
+ auto result = mStream->notifyEvent(event);
if (result.isOk()) {
ALOGD("Delivered %p as id %d",
newBuffer.buffer.nativeHandle.getNativeHandle(), newBuffer.bufferId);
@@ -528,8 +506,10 @@
// If we've been asked to stop, send an event to signal the actual end of stream
EvsEvent event;
- event.aType = EvsEventType::STREAM_STOPPED;
- auto result = mStream->notify(event);
+ InfoEventDesc desc = {};
+ desc.aType = InfoEventType::STREAM_STOPPED;
+ event.info(desc);
+ auto result = mStream->notifyEvent(event);
if (!result.isOk()) {
ALOGE("Error delivering end of stream marker");
}
@@ -636,38 +616,6 @@
}
-sp<EvsCamera> EvsCamera::Create(const char *deviceName) {
- unique_ptr<ConfigManager::CameraInfo> nullCamInfo = nullptr;
-
- return Create(deviceName, nullCamInfo);
-}
-
-
-sp<EvsCamera> EvsCamera::Create(const char *deviceName,
- unique_ptr<ConfigManager::CameraInfo> &camInfo,
- const Stream *streamCfg) {
- sp<EvsCamera> evsCamera = new EvsCamera(deviceName, camInfo);
- if (evsCamera == nullptr) {
- return nullptr;
- }
-
- /* default implementation does not use a given configuration */
- (void)streamCfg;
-
- /* Use the first resolution from the list for the testing */
- auto it = camInfo->streamConfigurations.begin();
- evsCamera->mWidth = it->second[1];
- evsCamera->mHeight = it->second[2];
- evsCamera->mDescription.v1.vendorFlags = 0xFFFFFFFF; // Arbitrary test value
-
- evsCamera->mFormat = HAL_PIXEL_FORMAT_RGBA_8888;
- evsCamera->mUsage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_CAMERA_WRITE |
- GRALLOC_USAGE_SW_READ_RARELY | GRALLOC_USAGE_SW_WRITE_RARELY;
-
- return evsCamera;
-}
-
-
} // namespace implementation
} // namespace V1_0
} // namespace evs
diff --git a/automotive/evs/1.1/default/EvsCamera.h b/automotive/evs/1.1/default/EvsCamera.h
index c15b4b1..47a3164 100644
--- a/automotive/evs/1.1/default/EvsCamera.h
+++ b/automotive/evs/1.1/default/EvsCamera.h
@@ -25,8 +25,6 @@
#include <thread>
-#include "ConfigManager.h"
-
using BufferDesc_1_0 = ::android::hardware::automotive::evs::V1_0::BufferDesc;
using BufferDesc_1_1 = ::android::hardware::automotive::evs::V1_1::BufferDesc;
using IEvsCameraStream_1_0 = ::android::hardware::automotive::evs::V1_0::IEvsCameraStream;
@@ -61,28 +59,18 @@
Return<EvsResult> setExtendedInfo(uint32_t opaqueIdentifier, int32_t opaqueValue) override;
// Methods from ::android::hardware::automotive::evs::V1_1::IEvsCamera follow.
- Return<void> getCameraInfo_1_1(getCameraInfo_1_1_cb _hidl_cb) override;
Return<EvsResult> pauseVideoStream() override;
Return<EvsResult> resumeVideoStream() override;
Return<EvsResult> doneWithFrame_1_1(const BufferDesc_1_1& buffer) override;
Return<EvsResult> setMaster() override;
Return<EvsResult> forceMaster(const sp<IEvsDisplay>& display) override;
Return<EvsResult> unsetMaster() override;
- Return<void> getParameterList(getParameterList_cb _hidl_cb) override;
- Return<void> getIntParameterRange(CameraParam id,
- getIntParameterRange_cb _hidl_cb) override;
- Return<void> setIntParameter(CameraParam id, int32_t value,
- setIntParameter_cb _hidl_cb) override;
- Return<void> getIntParameter(CameraParam id,
- getIntParameter_cb _hidl_cb) override;
+ Return<void> setParameter(CameraParam id, int32_t value,
+ setParameter_cb _hidl_cb) override;
+ Return<void> getParameter(CameraParam id, getParameter_cb _hidl_cb) override;
- static sp<EvsCamera> Create(const char *deviceName);
- static sp<EvsCamera> Create(const char *deviceName,
- unique_ptr<ConfigManager::CameraInfo> &camInfo,
- const Stream *streamCfg = nullptr);
- EvsCamera(const EvsCamera&) = delete;
- EvsCamera& operator=(const EvsCamera&) = delete;
-
+ // Implementation details
+ EvsCamera(const char *id);
virtual ~EvsCamera() override;
void forceShutdown(); // This gets called if another caller "steals" ownership of the camera
@@ -91,10 +79,7 @@
static const char kCameraName_Backup[];
private:
- EvsCamera(const char *id,
- unique_ptr<ConfigManager::CameraInfo> &camInfo);
// These three functions are expected to be called while mAccessLock is held
- //
bool setAvailableFrames_Locked(unsigned bufferCount);
unsigned increaseAvailableFrames_Locked(unsigned numToAdd);
unsigned decreaseAvailableFrames_Locked(unsigned numToRemove);
@@ -139,9 +124,6 @@
// Synchronization necessary to deconflict mCaptureThread from the main service thread
std::mutex mAccessLock;
-
- // Static camera module information
- unique_ptr<ConfigManager::CameraInfo> &mCameraInfo;
};
} // namespace implementation
diff --git a/automotive/evs/1.1/default/EvsEnumerator.cpp b/automotive/evs/1.1/default/EvsEnumerator.cpp
index a010729..b324907 100644
--- a/automotive/evs/1.1/default/EvsEnumerator.cpp
+++ b/automotive/evs/1.1/default/EvsEnumerator.cpp
@@ -33,7 +33,6 @@
// constructs a new instance for each client.
std::list<EvsEnumerator::CameraRecord> EvsEnumerator::sCameraList;
wp<EvsDisplay> EvsEnumerator::sActiveDisplay;
-unique_ptr<ConfigManager> EvsEnumerator::sConfigManager;
EvsEnumerator::EvsEnumerator() {
@@ -41,11 +40,9 @@
// Add sample camera data to our list of cameras
// In a real driver, this would be expected to can the available hardware
- sConfigManager =
- ConfigManager::Create("/etc/automotive/evs/evs_sample_configuration.xml");
- for (auto v : sConfigManager->getCameraList()) {
- sCameraList.emplace_back(v.c_str());
- }
+ sCameraList.emplace_back(EvsCamera::kCameraName_Backup);
+ sCameraList.emplace_back("LaneView");
+ sCameraList.emplace_back("right turn");
}
@@ -60,7 +57,7 @@
std::vector<CameraDesc_1_0> descriptions;
descriptions.reserve(numCameras);
for (const auto& cam : sCameraList) {
- descriptions.push_back( cam.desc.v1 );
+ descriptions.push_back( cam.desc );
}
// Encapsulate our camera descriptions in the HIDL vec type
@@ -81,7 +78,7 @@
// Find the named camera
CameraRecord *pRecord = nullptr;
for (auto &&cam : sCameraList) {
- if (cam.desc.v1.cameraId == cameraId) {
+ if (cam.desc.cameraId == cameraId) {
// Found a match!
pRecord = &cam;
break;
@@ -102,12 +99,7 @@
}
// Construct a camera instance for the caller
- if (sConfigManager == nullptr) {
- pActiveCamera = EvsCamera::Create(cameraId.c_str());
- } else {
- pActiveCamera = EvsCamera::Create(cameraId.c_str(),
- sConfigManager->getCameraInfo(cameraId));
- }
+ pActiveCamera = new EvsCamera(cameraId.c_str());
pRecord->activeInstance = pActiveCamera;
if (pActiveCamera == nullptr) {
ALOGE("Failed to allocate new EvsCamera object for %s\n", cameraId.c_str());
@@ -128,15 +120,15 @@
// Get the camera id so we can find it in our list
std::string cameraId;
- pCamera_1_1->getCameraInfo_1_1([&cameraId](CameraDesc desc) {
- cameraId = desc.v1.cameraId;
+ pCamera_1_1->getCameraInfo([&cameraId](CameraDesc desc) {
+ cameraId = desc.cameraId;
}
);
// Find the named camera
CameraRecord *pRecord = nullptr;
for (auto &&cam : sCameraList) {
- if (cam.desc.v1.cameraId == cameraId) {
+ if (cam.desc.cameraId == cameraId) {
// Found a match!
pRecord = &cam;
break;
@@ -217,89 +209,6 @@
}
-// Methods from ::android::hardware::automotive::evs::V1_1::IEvsEnumerator follow.
-Return<void> EvsEnumerator::getCameraList_1_1(getCameraList_1_1_cb _hidl_cb) {
- ALOGD("getCameraList");
-
- const unsigned numCameras = sCameraList.size();
-
- // Build up a packed array of CameraDesc for return
- // NOTE: Only has to live until the callback returns
- std::vector<CameraDesc_1_1> descriptions;
- descriptions.reserve(numCameras);
- for (const auto& cam : sCameraList) {
- descriptions.push_back( cam.desc );
- }
-
- // Encapsulate our camera descriptions in the HIDL vec type
- hidl_vec<CameraDesc_1_1> hidlCameras(descriptions);
-
- // Send back the results
- ALOGD("reporting %zu cameras available", hidlCameras.size());
- _hidl_cb(hidlCameras);
-
- // HIDL convention says we return Void if we sent our result back via callback
- return Void();
-}
-
-Return<sp<IEvsCamera_1_1>>
-EvsEnumerator::openCamera_1_1(const hidl_string& cameraId,
- const Stream& streamCfg) {
- // Find the named camera
- CameraRecord *pRecord = nullptr;
- for (auto &&cam : sCameraList) {
- if (cam.desc.v1.cameraId == cameraId) {
- // Found a match!
- pRecord = &cam;
- break;
- }
- }
-
- // Is this a recognized camera id?
- if (!pRecord) {
- ALOGE("Requested camera %s not found", cameraId.c_str());
- return nullptr;
- }
-
- // Has this camera already been instantiated by another caller?
- sp<EvsCamera> pActiveCamera = pRecord->activeInstance.promote();
- if (pActiveCamera != nullptr) {
- ALOGW("Killing previous camera because of new caller");
- closeCamera(pActiveCamera);
- }
-
- // Construct a camera instance for the caller
- if (sConfigManager == nullptr) {
- pActiveCamera = EvsCamera::Create(cameraId.c_str());
- } else {
- pActiveCamera = EvsCamera::Create(cameraId.c_str(),
- sConfigManager->getCameraInfo(cameraId),
- &streamCfg);
- }
-
- pRecord->activeInstance = pActiveCamera;
- if (pActiveCamera == nullptr) {
- ALOGE("Failed to allocate new EvsCamera object for %s\n", cameraId.c_str());
- }
-
- return pActiveCamera;
-}
-
-
-EvsEnumerator::CameraRecord* EvsEnumerator::findCameraById(const std::string& cameraId) {
- // Find the named camera
- CameraRecord *pRecord = nullptr;
- for (auto &&cam : sCameraList) {
- if (cam.desc.v1.cameraId == cameraId) {
- // Found a match!
- pRecord = &cam;
- break;
- }
- }
-
- return pRecord;
-}
-
} // namespace implementation
} // namespace V1_1
} // namespace evs
diff --git a/automotive/evs/1.1/default/EvsEnumerator.h b/automotive/evs/1.1/default/EvsEnumerator.h
index 475ec76..11c2170 100644
--- a/automotive/evs/1.1/default/EvsEnumerator.h
+++ b/automotive/evs/1.1/default/EvsEnumerator.h
@@ -17,20 +17,18 @@
#ifndef ANDROID_HARDWARE_AUTOMOTIVE_EVS_V1_1_EVSCAMERAENUMERATOR_H
#define ANDROID_HARDWARE_AUTOMOTIVE_EVS_V1_1_EVSCAMERAENUMERATOR_H
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
+#include <android/hardware/automotive/evs/1.0/IEvsEnumerator.h>
#include <android/hardware/automotive/evs/1.1/IEvsCamera.h>
#include <list>
-#include "ConfigManager.h"
-
using ::android::hardware::automotive::evs::V1_0::EvsResult;
using ::android::hardware::automotive::evs::V1_0::IEvsDisplay;
using ::android::hardware::automotive::evs::V1_0::DisplayState;
+using ::android::hardware::automotive::evs::V1_0::IEvsEnumerator;
using IEvsCamera_1_0 = ::android::hardware::automotive::evs::V1_0::IEvsCamera;
using IEvsCamera_1_1 = ::android::hardware::automotive::evs::V1_1::IEvsCamera;
using CameraDesc_1_0 = ::android::hardware::automotive::evs::V1_0::CameraDesc;
-using CameraDesc_1_1 = ::android::hardware::automotive::evs::V1_1::CameraDesc;
namespace android {
@@ -55,11 +53,6 @@
Return<void> closeDisplay(const ::android::sp<IEvsDisplay>& display) override;
Return<DisplayState> getDisplayState() override;
- // Methods from ::android::hardware::automotive::evs::V1_1::IEvsEnumerator follow.
- Return<void> getCameraList_1_1(getCameraList_1_1_cb _hidl_cb) override;
- Return<sp<IEvsCamera_1_1>> openCamera_1_1(const hidl_string& cameraId,
- const Stream& streamCfg) override;
-
// Implementation details
EvsEnumerator();
@@ -68,20 +61,14 @@
// That is to say, this is effectively a singleton despite the fact that HIDL
// constructs a new instance for each client.
struct CameraRecord {
- CameraDesc_1_1 desc;
+ CameraDesc_1_0 desc;
wp<EvsCamera> activeInstance;
- CameraRecord(const char *cameraId) : desc() { desc.v1.cameraId = cameraId; }
+ CameraRecord(const char *cameraId) : desc() { desc.cameraId = cameraId; }
};
+ static std::list<CameraRecord> sCameraList;
- static CameraRecord* findCameraById(const std::string& cameraId);
-
- static std::list<CameraRecord> sCameraList;
-
- // Weak pointer. Object destructs if client dies.
- static wp<EvsDisplay> sActiveDisplay;
-
- static unique_ptr<ConfigManager> sConfigManager;
+ static wp<EvsDisplay> sActiveDisplay; // Weak pointer. Object destructs if client dies.
};
} // namespace implementation
diff --git a/automotive/evs/1.1/default/resources/evs_default_configuration.xml b/automotive/evs/1.1/default/resources/evs_default_configuration.xml
deleted file mode 100644
index 692102e..0000000
--- a/automotive/evs/1.1/default/resources/evs_default_configuration.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<!-- Copyright (C) 2019 The Android Open Source Project
-
- 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.
--->
-
-<!-- Exterior View System Example Configuration
-
- Android Automotive axes are used to define coordinates.
- See https://source.android.com/devices/sensors/sensor-types#auto_axes
-
- Use evs_configuration.dtd with xmllint tool, to validate XML configuration file
--->
-
-<configuration>
- <!-- system configuration -->
- <system>
- <!-- number of cameras available to EVS -->
- <num_cameras value='1'/>
- </system>
-
- <!-- camera device information -->
- <camera>
- <!-- camera device starts -->
- <device id='/dev/video1' position='rear'>
- <caps>
- <!-- list of supported controls -->
- <supported_controls>
- <control name='BRIGHTNESS' min='0' max='255'/>
- <control name='CONTRAST' min='0' max='255'/>
- </supported_controls>
-
- <stream id='0' width='640' height='360' format='RGBA_8888' framerate='30'/>
- </caps>
-
- <!-- list of parameters -->
- <characteristics>
- <!-- Camera intrinsic calibration matrix. See
- https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#LENS_INTRINSIC_CALIBRATION
- -->
- <parameter
- name='LENS_INTRINSIC_CALIBRATION'
- type='float'
- size='5'
- value='0.0,0.0,0.0,0.0,0.0'
- />
- </characteristics>
- </device>
- </camera>
- <display>
- <device id='display0' position='driver'>
- <caps>
- <!-- list of supported inpu stream configurations -->
- <stream id='0' width='1280' height='720' format='RGBA_8888' framerate='30'/>
- </caps>
- </device>
- </display>
-</configuration>
-
diff --git a/automotive/evs/1.1/default/service.cpp b/automotive/evs/1.1/default/service.cpp
index 5135864..128a14a 100644
--- a/automotive/evs/1.1/default/service.cpp
+++ b/automotive/evs/1.1/default/service.cpp
@@ -33,7 +33,7 @@
using android::hardware::joinRpcThreadpool;
// Generated HIDL files
-using android::hardware::automotive::evs::V1_1::IEvsEnumerator;
+using android::hardware::automotive::evs::V1_0::IEvsEnumerator;
using android::hardware::automotive::evs::V1_0::IEvsDisplay;
// The namespace in which all our implementation code lives
diff --git a/automotive/evs/1.1/types.hal b/automotive/evs/1.1/types.hal
index dcb2abb..2c6b2ed 100644
--- a/automotive/evs/1.1/types.hal
+++ b/automotive/evs/1.1/types.hal
@@ -21,22 +21,6 @@
import @1.0::DisplayState;
import @1.0::EvsResult;
import android.hardware.graphics.common@1.2::HardwareBuffer;
-import android.hardware.camera.device@3.2::CameraMetadata;
-
-/**
- * Structure describing the basic properties of an EVS camera, extended from its
- * v1.0 declaration.
- *
- * The HAL is responsible for filling out this structure for each
- * EVS camera in the system.
- */
-struct CameraDesc {
- @1.0::CameraDesc v1;
- /**
- * Store camera metadata such as lens characteristics.
- */
- CameraMetadata metadata;
-};
/**
* Structure representing an image buffer through our APIs
@@ -66,7 +50,7 @@
/**
* Types of informative streaming events
*/
-enum EvsEventType : uint32_t {
+enum InfoEventType : uint32_t {
/**
* Video stream is started
*/
@@ -97,11 +81,11 @@
/**
* Structure that describes informative events occurred during EVS is streaming
*/
-struct EvsEvent {
+struct InfoEventDesc {
/**
* Type of an informative event
*/
- EvsEventType aType;
+ InfoEventType aType;
/**
* Possible additional information
*/
@@ -109,6 +93,20 @@
};
/**
+ * EVS event definition
+ */
+safe_union EvsEvent {
+ /**
+ * A buffer descriptor of an image frame
+ */
+ BufferDesc buffer;
+ /**
+ * General streaming events
+ */
+ InfoEventDesc info;
+};
+
+/**
* EVS Camera Parameter
*/
enum CameraParam : uint32_t {
@@ -129,6 +127,14 @@
*/
GAIN,
/**
+ * Mirror the image horizontally
+ */
+ HFLIP,
+ /**
+ * Mirror the image vertically
+ */
+ VFLIP,
+ /**
* Automatic Whitebalance
*/
AUTO_WHITE_BALANCE,
@@ -150,6 +156,11 @@
*/
ABSOLUTE_EXPOSURE,
/**
+ * When AEC is running in either auto or aperture priority, this parameter
+ * sets whether a frame rate varies.
+ */
+ AUTO_EXPOSURE_PRIORITY,
+ /**
* Set the focal point of the camera to the specified position. This
* parameter may not be effective when auto focus is enabled.
*/
diff --git a/automotive/evs/1.1/vts/functional/Android.bp b/automotive/evs/1.1/vts/functional/Android.bp
index 4753933..55c50a4 100644
--- a/automotive/evs/1.1/vts/functional/Android.bp
+++ b/automotive/evs/1.1/vts/functional/Android.bp
@@ -23,7 +23,6 @@
defaults: ["VtsHalTargetTestDefaults"],
shared_libs: [
"libui",
- "libcamera_metadata",
],
static_libs: [
"android.hardware.automotive.evs@1.0",
@@ -32,7 +31,6 @@
"android.hardware.graphics.common@1.0",
"android.hardware.graphics.common@1.1",
"android.hardware.graphics.common@1.2",
- "android.hardware.camera.device@3.2",
],
test_suites: ["general-tests"],
cflags: [
diff --git a/automotive/evs/1.1/vts/functional/FrameHandler.cpp b/automotive/evs/1.1/vts/functional/FrameHandler.cpp
index 6d53652..1627689 100644
--- a/automotive/evs/1.1/vts/functional/FrameHandler.cpp
+++ b/automotive/evs/1.1/vts/functional/FrameHandler.cpp
@@ -138,93 +138,93 @@
}
-Return<void> FrameHandler::deliverFrame_1_1(const BufferDesc_1_1& bufDesc) {
- const AHardwareBuffer_Desc* pDesc =
- reinterpret_cast<const AHardwareBuffer_Desc *>(&bufDesc.buffer.description);
- ALOGD("Received a frame from the camera (%p)",
- bufDesc.buffer.nativeHandle.getNativeHandle());
-
- // Store a dimension of a received frame.
- mFrameWidth = pDesc->width;
- mFrameHeight = pDesc->height;
-
- // If we were given an opened display at construction time, then send the received
- // image back down the camera.
- if (mDisplay.get()) {
- // Get the output buffer we'll use to display the imagery
- BufferDesc_1_0 tgtBuffer = {};
- mDisplay->getTargetBuffer([&tgtBuffer](const BufferDesc_1_0& buff) {
- tgtBuffer = buff;
- }
- );
-
- if (tgtBuffer.memHandle == nullptr) {
- printf("Didn't get target buffer - frame lost\n");
- ALOGE("Didn't get requested output buffer -- skipping this frame.");
+Return<void> FrameHandler::notifyEvent(const EvsEvent& event) {
+ // Local flag we use to keep track of when the stream is stopping
+ auto type = event.getDiscriminator();
+ if (type == EvsEvent::hidl_discriminator::info) {
+ mLock.lock();
+ mLatestEventDesc = event.info();
+ if (mLatestEventDesc.aType == InfoEventType::STREAM_STOPPED) {
+ // Signal that the last frame has been received and the stream is stopped
+ mRunning = false;
+ } else if (mLatestEventDesc.aType == InfoEventType::PARAMETER_CHANGED) {
+ ALOGD("Camera parameter 0x%X is changed to 0x%X",
+ mLatestEventDesc.payload[0], mLatestEventDesc.payload[1]);
} else {
- // Copy the contents of the of buffer.memHandle into tgtBuffer
- copyBufferContents(tgtBuffer, bufDesc);
+ ALOGD("Received an event %s", eventToString(mLatestEventDesc.aType));
+ }
+ mLock.unlock();
+ mEventSignal.notify_all();
+ } else {
+ auto bufDesc = event.buffer();
+ const AHardwareBuffer_Desc* pDesc =
+ reinterpret_cast<const AHardwareBuffer_Desc *>(&bufDesc.buffer.description);
+ ALOGD("Received a frame from the camera (%p)",
+ bufDesc.buffer.nativeHandle.getNativeHandle());
- // Send the target buffer back for display
- Return<EvsResult> result = mDisplay->returnTargetBufferForDisplay(tgtBuffer);
- if (!result.isOk()) {
- printf("HIDL error on display buffer (%s)- frame lost\n",
- result.description().c_str());
- ALOGE("Error making the remote function call. HIDL said %s",
- result.description().c_str());
- } else if (result != EvsResult::OK) {
- printf("Display reported error - frame lost\n");
- ALOGE("We encountered error %d when returning a buffer to the display!",
- (EvsResult) result);
+ // Store a dimension of a received frame.
+ mFrameWidth = pDesc->width;
+ mFrameHeight = pDesc->height;
+
+ // If we were given an opened display at construction time, then send the received
+ // image back down the camera.
+ if (mDisplay.get()) {
+ // Get the output buffer we'll use to display the imagery
+ BufferDesc_1_0 tgtBuffer = {};
+ mDisplay->getTargetBuffer([&tgtBuffer](const BufferDesc_1_0& buff) {
+ tgtBuffer = buff;
+ }
+ );
+
+ if (tgtBuffer.memHandle == nullptr) {
+ printf("Didn't get target buffer - frame lost\n");
+ ALOGE("Didn't get requested output buffer -- skipping this frame.");
} else {
- // Everything looks good!
- // Keep track so tests or watch dogs can monitor progress
- mLock.lock();
- mFramesDisplayed++;
- mLock.unlock();
+ // Copy the contents of the of buffer.memHandle into tgtBuffer
+ copyBufferContents(tgtBuffer, bufDesc);
+
+ // Send the target buffer back for display
+ Return<EvsResult> result = mDisplay->returnTargetBufferForDisplay(tgtBuffer);
+ if (!result.isOk()) {
+ printf("HIDL error on display buffer (%s)- frame lost\n",
+ result.description().c_str());
+ ALOGE("Error making the remote function call. HIDL said %s",
+ result.description().c_str());
+ } else if (result != EvsResult::OK) {
+ printf("Display reported error - frame lost\n");
+ ALOGE("We encountered error %d when returning a buffer to the display!",
+ (EvsResult) result);
+ } else {
+ // Everything looks good!
+ // Keep track so tests or watch dogs can monitor progress
+ mLock.lock();
+ mFramesDisplayed++;
+ mLock.unlock();
+ }
}
}
+
+
+ switch (mReturnMode) {
+ case eAutoReturn:
+ // Send the camera buffer back now that the client has seen it
+ ALOGD("Calling doneWithFrame");
+ // TODO: Why is it that we get a HIDL crash if we pass back the cloned buffer?
+ mCamera->doneWithFrame_1_1(bufDesc);
+ break;
+ case eNoAutoReturn:
+ // Hang onto the buffer handle for now -- the client will return it explicitly later
+ mHeldBuffers.push(bufDesc);
+ }
+
+ mLock.lock();
+ ++mFramesReceived;
+ mLock.unlock();
+ mFrameSignal.notify_all();
+
+ ALOGD("Frame handling complete");
}
-
- switch (mReturnMode) {
- case eAutoReturn:
- // Send the camera buffer back now that the client has seen it
- ALOGD("Calling doneWithFrame");
- mCamera->doneWithFrame_1_1(bufDesc);
- break;
- case eNoAutoReturn:
- // Hang onto the buffer handle for now -- the client will return it explicitly later
- mHeldBuffers.push(bufDesc);
- }
-
- mLock.lock();
- ++mFramesReceived;
- mLock.unlock();
- mFrameSignal.notify_all();
-
- ALOGD("Frame handling complete");
-
- return Void();
-}
-
-
-Return<void> FrameHandler::notify(const EvsEvent& event) {
- // Local flag we use to keep track of when the stream is stopping
- mLock.lock();
- mLatestEventDesc = event;
- if (mLatestEventDesc.aType == EvsEventType::STREAM_STOPPED) {
- // Signal that the last frame has been received and the stream is stopped
- mRunning = false;
- } else if (mLatestEventDesc.aType == EvsEventType::PARAMETER_CHANGED) {
- ALOGD("Camera parameter 0x%X is changed to 0x%X",
- mLatestEventDesc.payload[0], mLatestEventDesc.payload[1]);
- } else {
- ALOGD("Received an event %s", eventToString(mLatestEventDesc.aType));
- }
- mLock.unlock();
- mEventSignal.notify_all();
-
return Void();
}
@@ -342,18 +342,18 @@
}
}
-bool FrameHandler::waitForEvent(const EvsEventType aTargetEvent,
- EvsEvent &event) {
+bool FrameHandler::waitForEvent(const InfoEventType aTargetEvent,
+ InfoEventDesc &eventDesc) {
// Wait until we get an expected parameter change event.
std::unique_lock<std::mutex> lock(mLock);
auto now = std::chrono::system_clock::now();
bool result = mEventSignal.wait_until(lock, now + 5s,
- [this, aTargetEvent, &event](){
+ [this, aTargetEvent, &eventDesc](){
bool flag = mLatestEventDesc.aType == aTargetEvent;
if (flag) {
- event.aType = mLatestEventDesc.aType;
- event.payload[0] = mLatestEventDesc.payload[0];
- event.payload[1] = mLatestEventDesc.payload[1];
+ eventDesc.aType = mLatestEventDesc.aType;
+ eventDesc.payload[0] = mLatestEventDesc.payload[0];
+ eventDesc.payload[1] = mLatestEventDesc.payload[1];
}
return flag;
@@ -363,22 +363,21 @@
return !result;
}
-const char *FrameHandler::eventToString(const EvsEventType aType) {
+const char *FrameHandler::eventToString(const InfoEventType aType) {
switch (aType) {
- case EvsEventType::STREAM_STARTED:
+ case InfoEventType::STREAM_STARTED:
return "STREAM_STARTED";
- case EvsEventType::STREAM_STOPPED:
+ case InfoEventType::STREAM_STOPPED:
return "STREAM_STOPPED";
- case EvsEventType::FRAME_DROPPED:
+ case InfoEventType::FRAME_DROPPED:
return "FRAME_DROPPED";
- case EvsEventType::TIMEOUT:
+ case InfoEventType::TIMEOUT:
return "TIMEOUT";
- case EvsEventType::PARAMETER_CHANGED:
+ case InfoEventType::PARAMETER_CHANGED:
return "PARAMETER_CHANGED";
- case EvsEventType::MASTER_RELEASED:
+ case InfoEventType::MASTER_RELEASED:
return "MASTER_RELEASED";
default:
return "Unknown";
}
}
-
diff --git a/automotive/evs/1.1/vts/functional/FrameHandler.h b/automotive/evs/1.1/vts/functional/FrameHandler.h
index e5f1b8f..7f87cb4 100644
--- a/automotive/evs/1.1/vts/functional/FrameHandler.h
+++ b/automotive/evs/1.1/vts/functional/FrameHandler.h
@@ -33,6 +33,7 @@
using ::android::sp;
using ::android::hardware::automotive::evs::V1_0::IEvsDisplay;
using ::android::hardware::automotive::evs::V1_0::EvsResult;
+using ::android::hardware::automotive::evs::V1_0::CameraDesc;
using BufferDesc_1_0 = ::android::hardware::automotive::evs::V1_0::BufferDesc;
using BufferDesc_1_1 = ::android::hardware::automotive::evs::V1_1::BufferDesc;
@@ -55,13 +56,6 @@
FrameHandler(android::sp <IEvsCamera> pCamera, CameraDesc cameraInfo,
android::sp <IEvsDisplay> pDisplay = nullptr,
BufferControlFlag mode = eAutoReturn);
- virtual ~FrameHandler() {
- if (mCamera != nullptr) {
- /* shutdown a camera explicitly */
- shutdown();
- }
- }
-
void shutdown();
bool startStream();
@@ -73,22 +67,19 @@
bool isRunning();
void waitForFrameCount(unsigned frameCount);
- bool waitForEvent(const EvsEventType aTargetEvent,
- EvsEvent &eventDesc);
+ bool waitForEvent(const InfoEventType aTargetEvent,
+ InfoEventDesc &eventDesc);
void getFramesCounters(unsigned* received, unsigned* displayed);
void getFrameDimension(unsigned* width, unsigned* height);
private:
- // Implementation for ::android::hardware::automotive::evs::V1_0::IEvsCameraStream
- Return<void> deliverFrame(const BufferDesc_1_0& buffer) override;
-
// Implementation for ::android::hardware::automotive::evs::V1_1::IEvsCameraStream
- Return<void> deliverFrame_1_1(const BufferDesc_1_1& buffer) override;
- Return<void> notify(const EvsEvent& event) override;
+ Return<void> deliverFrame(const BufferDesc_1_0& buffer) override;
+ Return<void> notifyEvent(const EvsEvent& event) override;
// Local implementation details
bool copyBufferContents(const BufferDesc_1_0& tgtBuffer, const BufferDesc_1_1& srcBuffer);
- const char *eventToString(const EvsEventType aType);
+ const char *eventToString(const InfoEventType aType);
// Values initialized as startup
android::sp <IEvsCamera> mCamera;
@@ -109,7 +100,7 @@
unsigned mFramesDisplayed = 0; // Simple counter -- rolls over eventually!
unsigned mFrameWidth = 0;
unsigned mFrameHeight = 0;
- EvsEvent mLatestEventDesc;
+ InfoEventDesc mLatestEventDesc;
};
diff --git a/automotive/evs/1.1/vts/functional/VtsHalEvsV1_1TargetTest.cpp b/automotive/evs/1.1/vts/functional/VtsHalEvsV1_1TargetTest.cpp
index 1d3fd87..a6e4881 100644
--- a/automotive/evs/1.1/vts/functional/VtsHalEvsV1_1TargetTest.cpp
+++ b/automotive/evs/1.1/vts/functional/VtsHalEvsV1_1TargetTest.cpp
@@ -38,9 +38,8 @@
#include "FrameHandler.h"
-#include <cstdio>
-#include <cstring>
-#include <cstdlib>
+#include <stdio.h>
+#include <string.h>
#include <hidl/HidlTransportSupport.h>
#include <hwbinder/ProcessState.h>
@@ -51,10 +50,8 @@
#include <android/log.h>
#include <android/hardware/automotive/evs/1.1/IEvsCamera.h>
#include <android/hardware/automotive/evs/1.1/IEvsCameraStream.h>
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
+#include <android/hardware/automotive/evs/1.0/IEvsEnumerator.h>
#include <android/hardware/automotive/evs/1.0/IEvsDisplay.h>
-#include <android/hardware/camera/device/3.2/ICameraDevice.h>
-#include <system/camera_metadata.h>
#include <VtsHalHidlTargetTestBase.h>
#include <VtsHalHidlTargetTestEnvBase.h>
@@ -67,28 +64,13 @@
using ::android::hardware::hidl_handle;
using ::android::hardware::hidl_string;
using ::android::sp;
-using ::android::hardware::camera::device::V3_2::Stream;
+using ::android::hardware::automotive::evs::V1_0::CameraDesc;
using ::android::hardware::automotive::evs::V1_0::DisplayDesc;
using ::android::hardware::automotive::evs::V1_0::DisplayState;
-using ::android::hardware::graphics::common::V1_0::PixelFormat;
+using ::android::hardware::automotive::evs::V1_0::IEvsEnumerator;
using IEvsCamera_1_0 = ::android::hardware::automotive::evs::V1_0::IEvsCamera;
using IEvsCamera_1_1 = ::android::hardware::automotive::evs::V1_1::IEvsCamera;
-/*
- * Plese note that this is different from what is defined in
- * libhardware/modules/camera/3_4/metadata/types.h; this has one additional
- * field to store a framerate.
- */
-const size_t kStreamCfgSz = 5;
-typedef struct {
- int32_t width;
- int32_t height;
- int32_t format;
- int32_t direction;
- int32_t framerate;
-} RawStreamConfig;
-
-
// Test environment for Evs HIDL HAL.
class EvsHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
public:
@@ -125,16 +107,15 @@
assert(pEnumerator != nullptr);
// Get the camera list
- pEnumerator->getCameraList_1_1(
- [this](hidl_vec <CameraDesc> cameraList) {
- ALOGI("Camera list callback received %zu cameras",
- cameraList.size());
- cameraInfo.reserve(cameraList.size());
- for (auto&& cam: cameraList) {
- ALOGI("Found camera %s", cam.v1.cameraId.c_str());
- cameraInfo.push_back(cam);
- }
- }
+ pEnumerator->getCameraList([this](hidl_vec <CameraDesc> cameraList) {
+ ALOGI("Camera list callback received %zu cameras",
+ cameraList.size());
+ cameraInfo.reserve(cameraList.size());
+ for (auto&& cam: cameraList) {
+ ALOGI("Found camera %s", cam.cameraId.c_str());
+ cameraInfo.push_back(cam);
+ }
+ }
);
// We insist on at least one camera for EVS to pass any camera tests
@@ -162,23 +143,19 @@
// Get the camera list
loadCameraList();
- // Using null stream configuration makes EVS uses the default resolution and
- // output format.
- Stream nullCfg = {};
-
// Open and close each camera twice
for (auto&& cam: cameraInfo) {
for (int pass = 0; pass < 2; pass++) {
sp<IEvsCamera_1_1> pCam =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCam, nullptr);
// Verify that this camera self-identifies correctly
- pCam->getCameraInfo_1_1([&cam](CameraDesc desc) {
- ALOGD("Found camera %s", desc.v1.cameraId.c_str());
- EXPECT_EQ(cam.v1.cameraId, desc.v1.cameraId);
- }
+ pCam->getCameraInfo([&cam](CameraDesc desc) {
+ ALOGD("Found camera %s", desc.cameraId.c_str());
+ EXPECT_EQ(cam.cameraId, desc.cameraId);
+ }
);
// Explicitly close the camera so resources are released right away
@@ -200,26 +177,22 @@
// Get the camera list
loadCameraList();
- // Using null stream configuration makes EVS uses the default resolution and
- // output format.
- Stream nullCfg = {};
-
// Open and close each camera twice
for (auto&& cam: cameraInfo) {
sp<IEvsCamera_1_1> pCam =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCam, nullptr);
// Verify that this camera self-identifies correctly
- pCam->getCameraInfo_1_1([&cam](CameraDesc desc) {
- ALOGD("Found camera %s", desc.v1.cameraId.c_str());
- EXPECT_EQ(cam.v1.cameraId, desc.v1.cameraId);
- }
+ pCam->getCameraInfo([&cam](CameraDesc desc) {
+ ALOGD("Found camera %s", desc.cameraId.c_str());
+ EXPECT_EQ(cam.cameraId, desc.cameraId);
+ }
);
sp<IEvsCamera_1_1> pCam2 =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCam, pCam2);
ASSERT_NE(pCam2, nullptr);
@@ -237,10 +210,10 @@
pEnumerator->closeCamera(pCam);
// Verify that the second camera instance self-identifies correctly
- pCam2->getCameraInfo_1_1([&cam](CameraDesc desc) {
- ALOGD("Found camera %s", desc.v1.cameraId.c_str());
- EXPECT_EQ(cam.v1.cameraId, desc.v1.cameraId);
- }
+ pCam2->getCameraInfo([&cam](CameraDesc desc) {
+ ALOGD("Found camera %s", desc.cameraId.c_str());
+ EXPECT_EQ(cam.cameraId, desc.cameraId);
+ }
);
// Close the second camera instance
@@ -262,14 +235,10 @@
// Get the camera list
loadCameraList();
- // Using null stream configuration makes EVS uses the default resolution and
- // output format.
- Stream nullCfg = {};
-
// Test each reported camera
for (auto&& cam: cameraInfo) {
sp<IEvsCamera_1_1> pCam =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCam, nullptr);
@@ -334,15 +303,11 @@
// Get the camera list
loadCameraList();
- // Using null stream configuration makes EVS uses the default resolution and
- // output format.
- Stream nullCfg = {};
-
// Test each reported camera
for (auto&& cam: cameraInfo) {
sp<IEvsCamera_1_1> pCam =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCam, nullptr);
@@ -406,10 +371,6 @@
// Get the camera list
loadCameraList();
- // Using null stream configuration makes EVS uses the default resolution and
- // output format.
- Stream nullCfg = {};
-
// Request exclusive access to the EVS display
sp<IEvsDisplay> pDisplay = pEnumerator->openDisplay();
ASSERT_NE(pDisplay, nullptr);
@@ -417,7 +378,7 @@
// Test each reported camera
for (auto&& cam: cameraInfo) {
sp<IEvsCamera_1_1> pCam =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCam, nullptr);
@@ -478,20 +439,16 @@
// Get the camera list
loadCameraList();
- // Using null stream configuration makes EVS uses the default resolution and
- // output format.
- Stream nullCfg = {};
-
// Test each reported camera
for (auto&& cam: cameraInfo) {
// Create two camera clients.
sp<IEvsCamera_1_1> pCam0 =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCam0, nullptr);
sp<IEvsCamera_1_1> pCam1 =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCam1, nullptr);
@@ -529,6 +486,7 @@
nsecs_t runTime = end - firstFrame;
float framesPerSecond0 = framesReceived0 / (runTime * kNanoToSeconds);
float framesPerSecond1 = framesReceived1 / (runTime * kNanoToSeconds);
+ printf("Measured camera rate %3.2f fps and %3.2f fps\n", framesPerSecond0, framesPerSecond1);
ALOGI("Measured camera rate %3.2f fps and %3.2f fps", framesPerSecond0, framesPerSecond1);
EXPECT_GE(framesPerSecond0, kMinimumFramesPerSecond);
EXPECT_GE(framesPerSecond1, kMinimumFramesPerSecond);
@@ -568,33 +526,14 @@
// Get the camera list
loadCameraList();
- // Using null stream configuration makes EVS uses the default resolution and
- // output format.
- Stream nullCfg = {};
-
// Test each reported camera
- Return<EvsResult> result = EvsResult::OK;
for (auto&& cam: cameraInfo) {
// Create a camera client
sp<IEvsCamera_1_1> pCam =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCam, nullptr);
- // Get the parameter list
- std::vector<CameraParam> cmds;
- pCam->getParameterList([&cmds](hidl_vec<CameraParam> cmdList) {
- cmds.reserve(cmdList.size());
- for (auto &&cmd : cmdList) {
- cmds.push_back(cmd);
- }
- }
- );
-
- if (cmds.size() < 1) {
- continue;
- }
-
// Set up per-client frame receiver objects which will fire up its own thread
sp<FrameHandler> frameHandler = new FrameHandler(pCam, cam,
nullptr,
@@ -608,70 +547,83 @@
// Ensure the stream starts
frameHandler->waitForFrameCount(1);
+ // Try to program few parameters
+ EvsResult result = EvsResult::OK;
+ int32_t val0 = 100;
+ int32_t val1 = 0;
+
result = pCam->setMaster();
- ASSERT_EQ(EvsResult::OK, result);
+ ASSERT_TRUE(result == EvsResult::OK);
- for (auto &cmd : cmds) {
- // Get a valid parameter value range
- int32_t minVal, maxVal, step;
- pCam->getIntParameterRange(
- cmd,
- [&minVal, &maxVal, &step](int32_t val0, int32_t val1, int32_t val2) {
- minVal = val0;
- maxVal = val1;
- step = val2;
- }
- );
+ pCam->setParameter(CameraParam::BRIGHTNESS, val0,
+ [&result, &val1](auto status, auto effectiveValue) {
+ result = status;
+ val1 = effectiveValue;
+ });
+ ASSERT_TRUE(result == EvsResult::OK ||
+ result == EvsResult::INVALID_ARG);
- EvsResult result = EvsResult::OK;
- if (cmd == CameraParam::ABSOLUTE_FOCUS) {
- // Try to turn off auto-focus
- int32_t val1 = 0;
- pCam->getIntParameter(CameraParam::AUTO_FOCUS,
- [&result, &val1](auto status, auto value) {
- result = status;
- if (status == EvsResult::OK) {
- val1 = value;
- }
- });
- if (val1 != 0) {
- pCam->setIntParameter(CameraParam::AUTO_FOCUS, 0,
- [&result, &val1](auto status, auto effectiveValue) {
- result = status;
- val1 = effectiveValue;
- });
- ASSERT_EQ(EvsResult::OK, result);
- ASSERT_EQ(val1, 0);
- }
- }
-
- // Try to program a parameter with a random value [minVal, maxVal]
- int32_t val0 = minVal + (std::rand() % (maxVal - minVal));
- int32_t val1 = 0;
-
- // Rounding down
- val0 = val0 - (val0 % step);
- pCam->setIntParameter(cmd, val0,
- [&result, &val1](auto status, auto effectiveValue) {
- result = status;
- val1 = effectiveValue;
- });
-
- ASSERT_EQ(EvsResult::OK, result);
-
- pCam->getIntParameter(cmd,
+ if (result == EvsResult::OK) {
+ pCam->getParameter(CameraParam::BRIGHTNESS,
[&result, &val1](auto status, auto value) {
result = status;
if (status == EvsResult::OK) {
val1 = value;
}
});
- ASSERT_EQ(EvsResult::OK, result);
+ ASSERT_TRUE(result == EvsResult::OK ||
+ result == EvsResult::INVALID_ARG);
+ ASSERT_EQ(val0, val1) << "Values are not matched.";
+ }
+
+ val0 = 80;
+ val1 = 0;
+ pCam->setParameter(CameraParam::CONTRAST, val0,
+ [&result, &val1](auto status, auto effectiveValue) {
+ result = status;
+ val1 = effectiveValue;
+ });
+ ASSERT_TRUE(result == EvsResult::OK ||
+ result == EvsResult::INVALID_ARG);
+
+ if (result == EvsResult::OK) {
+ pCam->getParameter(CameraParam::CONTRAST,
+ [&result, &val1](auto status, auto value) {
+ result = status;
+ if (status == EvsResult::OK) {
+ val1 = value;
+ }
+ });
+ ASSERT_TRUE(result == EvsResult::OK ||
+ result == EvsResult::INVALID_ARG);
+ ASSERT_EQ(val0, val1) << "Values are not matched.";
+ }
+
+ val0 = 300;
+ val1 = 0;
+ pCam->setParameter(CameraParam::ABSOLUTE_ZOOM, val0,
+ [&result, &val1](auto status, auto effectiveValue) {
+ result = status;
+ val1 = effectiveValue;
+ });
+ ASSERT_TRUE(result == EvsResult::OK ||
+ result == EvsResult::INVALID_ARG);
+
+ if (result == EvsResult::OK) {
+ pCam->getParameter(CameraParam::ABSOLUTE_ZOOM,
+ [&result, &val1](auto status, auto value) {
+ result = status;
+ if (status == EvsResult::OK) {
+ val1 = value;
+ }
+ });
+ ASSERT_TRUE(result == EvsResult::OK ||
+ result == EvsResult::INVALID_ARG);
ASSERT_EQ(val0, val1) << "Values are not matched.";
}
result = pCam->unsetMaster();
- ASSERT_EQ(EvsResult::OK, result);
+ ASSERT_TRUE(result == EvsResult::OK);
// Shutdown
frameHandler->shutdown();
@@ -698,19 +650,15 @@
// Get the camera list
loadCameraList();
- // Using null stream configuration makes EVS uses the default resolution and
- // output format.
- Stream nullCfg = {};
-
// Test each reported camera
for (auto&& cam: cameraInfo) {
// Create two camera clients.
sp<IEvsCamera_1_1> pCamMaster =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCamMaster, nullptr);
sp<IEvsCamera_1_1> pCamNonMaster =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCamNonMaster, nullptr);
@@ -750,15 +698,15 @@
// Non-master client expects to receive a master role relesed
// notification.
- EvsEvent aNotification = {};
+ InfoEventDesc aNotification = {};
// Release a master role.
pCamMaster->unsetMaster();
// Verify a change notification.
- frameHandlerNonMaster->waitForEvent(EvsEventType::MASTER_RELEASED, aNotification);
- ASSERT_EQ(EvsEventType::MASTER_RELEASED,
- static_cast<EvsEventType>(aNotification.aType));
+ frameHandlerNonMaster->waitForEvent(InfoEventType::MASTER_RELEASED, aNotification);
+ ASSERT_EQ(InfoEventType::MASTER_RELEASED,
+ static_cast<InfoEventType>(aNotification.aType));
// Non-master becomes a master.
result = pCamNonMaster->setMaster();
@@ -772,9 +720,9 @@
frameHandlerNonMaster->shutdown();
// Verify a change notification.
- frameHandlerMaster->waitForEvent(EvsEventType::MASTER_RELEASED, aNotification);
- ASSERT_EQ(EvsEventType::MASTER_RELEASED,
- static_cast<EvsEventType>(aNotification.aType));
+ frameHandlerMaster->waitForEvent(InfoEventType::MASTER_RELEASED, aNotification);
+ ASSERT_EQ(InfoEventType::MASTER_RELEASED,
+ static_cast<InfoEventType>(aNotification.aType));
// Closing another stream.
frameHandlerMaster->shutdown();
@@ -804,46 +752,18 @@
// Get the camera list
loadCameraList();
- // Using null stream configuration makes EVS uses the default resolution and
- // output format.
- Stream nullCfg = {};
-
// Test each reported camera
for (auto&& cam: cameraInfo) {
// Create two camera clients.
sp<IEvsCamera_1_1> pCamMaster =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCamMaster, nullptr);
sp<IEvsCamera_1_1> pCamNonMaster =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCamNonMaster, nullptr);
- // Get the parameter list
- std::vector<CameraParam> camMasterCmds, camNonMasterCmds;
- pCamMaster->getParameterList([&camMasterCmds](hidl_vec<CameraParam> cmdList) {
- camMasterCmds.reserve(cmdList.size());
- for (auto &&cmd : cmdList) {
- camMasterCmds.push_back(cmd);
- }
- }
- );
-
- pCamNonMaster->getParameterList([&camNonMasterCmds](hidl_vec<CameraParam> cmdList) {
- camNonMasterCmds.reserve(cmdList.size());
- for (auto &&cmd : cmdList) {
- camNonMasterCmds.push_back(cmd);
- }
- }
- );
-
- if (camMasterCmds.size() < 1 ||
- camNonMasterCmds.size() < 1) {
- // Skip a camera device if it does not support any parameter.
- continue;
- }
-
// Set up per-client frame receiver objects which will fire up its own thread
sp<FrameHandler> frameHandlerMaster =
new FrameHandler(pCamMaster, cam,
@@ -858,11 +778,11 @@
// Set one client as the master
EvsResult result = pCamMaster->setMaster();
- ASSERT_EQ(EvsResult::OK, result);
+ ASSERT_TRUE(result == EvsResult::OK);
// Try to set another client as the master.
result = pCamNonMaster->setMaster();
- ASSERT_EQ(EvsResult::OWNERSHIP_LOST, result);
+ ASSERT_TRUE(result == EvsResult::OWNERSHIP_LOST);
// Start the camera's video stream via a master client.
bool startResult = frameHandlerMaster->startStream();
@@ -878,168 +798,131 @@
// Ensure the stream starts
frameHandlerNonMaster->waitForFrameCount(1);
- int32_t val0 = 0;
+ // Try to program CameraParam::BRIGHTNESS
+ int32_t val0 = 100;
int32_t val1 = 0;
- for (auto &cmd : camMasterCmds) {
- // Get a valid parameter value range
- int32_t minVal, maxVal, step;
- pCamMaster->getIntParameterRange(
- cmd,
- [&minVal, &maxVal, &step](int32_t val0, int32_t val1, int32_t val2) {
- minVal = val0;
- maxVal = val1;
- step = val2;
- }
- );
- EvsResult result = EvsResult::OK;
- if (cmd == CameraParam::ABSOLUTE_FOCUS) {
- // Try to turn off auto-focus
- int32_t val1 = 1;
- pCamMaster->setIntParameter(CameraParam::AUTO_FOCUS, 0,
- [&result, &val1](auto status, auto effectiveValue) {
- result = status;
- val1 = effectiveValue;
- });
- ASSERT_EQ(EvsResult::OK, result);
- ASSERT_EQ(val1, 0);
- }
+ pCamMaster->setParameter(CameraParam::BRIGHTNESS, val0,
+ [&result, &val1](auto status, auto effectiveValue) {
+ result = status;
+ val1 = effectiveValue;
+ });
+ ASSERT_TRUE(result == EvsResult::OK || // Succeeded to program
+ result == EvsResult::INVALID_ARG); // Camera parameter is not supported
- // Try to program a parameter
- val0 = minVal + (std::rand() % (maxVal - minVal));
+ // Non-master client expects to receive a parameter change notification
+ // whenever a master client adjusts it.
+ InfoEventDesc aNotification = {};
- // Rounding down
- val0 = val0 - (val0 % step);
- pCamMaster->setIntParameter(cmd, val0,
- [&result, &val1](auto status, auto effectiveValue) {
- result = status;
- val1 = effectiveValue;
- });
- ASSERT_EQ(EvsResult::OK, result);
+ pCamMaster->getParameter(CameraParam::BRIGHTNESS,
+ [&result, &val1](auto status, auto value) {
+ result = status;
+ if (status == EvsResult::OK) {
+ val1 = value;
+ }
+ });
+ ASSERT_TRUE(result == EvsResult::OK || // Succeeded to program
+ result == EvsResult::INVALID_ARG); // Camera parameter is not supported
+ if (result == EvsResult::OK) {
+ ASSERT_EQ(val0, val1) << "Values are not matched.";
- // Wait a moment
- sleep(1);
+ // Verify a change notification
+ frameHandlerNonMaster->waitForEvent(InfoEventType::PARAMETER_CHANGED, aNotification);
+ ASSERT_EQ(InfoEventType::PARAMETER_CHANGED,
+ static_cast<InfoEventType>(aNotification.aType));
+ ASSERT_EQ(CameraParam::BRIGHTNESS,
+ static_cast<CameraParam>(aNotification.payload[0]));
+ ASSERT_EQ(val1,
+ static_cast<int32_t>(aNotification.payload[1]));
+ }
- // Non-master client expects to receive a parameter change notification
- // whenever a master client adjusts it.
- EvsEvent aNotification = {};
+ // Try to program CameraParam::CONTRAST
+ val0 = 80;
+ val1 = 0;
+ pCamMaster->setParameter(CameraParam::CONTRAST, val0,
+ [&result, &val1](auto status, auto effectiveValue) {
+ result = status;
+ val1 = effectiveValue;
+ });
+ ASSERT_TRUE(result == EvsResult::OK || // Succeeded to program
+ result == EvsResult::INVALID_ARG); // Camera parameter is not supported
- pCamMaster->getIntParameter(cmd,
+ if (result == EvsResult::OK) {
+ pCamMaster->getParameter(CameraParam::CONTRAST,
[&result, &val1](auto status, auto value) {
result = status;
if (status == EvsResult::OK) {
val1 = value;
}
});
- ASSERT_EQ(EvsResult::OK, result);
+ ASSERT_TRUE(result == EvsResult::OK);
ASSERT_EQ(val0, val1) << "Values are not matched.";
+
// Verify a change notification
- frameHandlerNonMaster->waitForEvent(EvsEventType::PARAMETER_CHANGED, aNotification);
- ASSERT_EQ(EvsEventType::PARAMETER_CHANGED,
- static_cast<EvsEventType>(aNotification.aType));
- ASSERT_EQ(cmd,
+ frameHandlerNonMaster->waitForEvent(InfoEventType::PARAMETER_CHANGED, aNotification);
+ ASSERT_EQ(InfoEventType::PARAMETER_CHANGED,
+ static_cast<InfoEventType>(aNotification.aType));
+ ASSERT_EQ(CameraParam::CONTRAST,
static_cast<CameraParam>(aNotification.payload[0]));
ASSERT_EQ(val1,
static_cast<int32_t>(aNotification.payload[1]));
}
// Try to adjust a parameter via non-master client
- pCamNonMaster->setIntParameter(camNonMasterCmds[0], val0,
+ pCamNonMaster->setParameter(CameraParam::CONTRAST, val0,
[&result, &val1](auto status, auto effectiveValue) {
result = status;
val1 = effectiveValue;
});
- ASSERT_EQ(EvsResult::INVALID_ARG, result);
+ ASSERT_TRUE(result == EvsResult::INVALID_ARG);
// Non-master client attemps to be a master
result = pCamNonMaster->setMaster();
- ASSERT_EQ(EvsResult::OWNERSHIP_LOST, result);
+ ASSERT_TRUE(result == EvsResult::OWNERSHIP_LOST);
// Master client retires from a master role
result = pCamMaster->unsetMaster();
- ASSERT_EQ(EvsResult::OK, result);
+ ASSERT_TRUE(result == EvsResult::OK);
// Try to adjust a parameter after being retired
- pCamMaster->setIntParameter(camMasterCmds[0], val0,
+ pCamMaster->setParameter(CameraParam::BRIGHTNESS, val0,
[&result, &val1](auto status, auto effectiveValue) {
result = status;
val1 = effectiveValue;
});
- ASSERT_EQ(EvsResult::INVALID_ARG, result);
+ ASSERT_TRUE(result == EvsResult::INVALID_ARG);
// Non-master client becomes a master
result = pCamNonMaster->setMaster();
- ASSERT_EQ(EvsResult::OK, result);
+ ASSERT_TRUE(result == EvsResult::OK);
// Try to adjust a parameter via new master client
- for (auto &cmd : camNonMasterCmds) {
- // Get a valid parameter value range
- int32_t minVal, maxVal, step;
- pCamNonMaster->getIntParameterRange(
- cmd,
- [&minVal, &maxVal, &step](int32_t val0, int32_t val1, int32_t val2) {
- minVal = val0;
- maxVal = val1;
- step = val2;
- }
- );
+ pCamNonMaster->setParameter(CameraParam::BRIGHTNESS, val0,
+ [&result, &val1](auto status, auto effectiveValue) {
+ result = status;
+ val1 = effectiveValue;
+ });
+ ASSERT_TRUE(result == EvsResult::OK || // Succeeded to program
+ result == EvsResult::INVALID_ARG); // Camera parameter is not supported
- EvsResult result = EvsResult::OK;
- if (cmd == CameraParam::ABSOLUTE_FOCUS) {
- // Try to turn off auto-focus
- int32_t val1 = 1;
- pCamNonMaster->setIntParameter(CameraParam::AUTO_FOCUS, 0,
- [&result, &val1](auto status, auto effectiveValue) {
- result = status;
- val1 = effectiveValue;
- });
- ASSERT_EQ(EvsResult::OK, result);
- ASSERT_EQ(val1, 0);
- }
+ // Wait a moment
+ sleep(1);
- // Try to program a parameter
- val0 = minVal + (std::rand() % (maxVal - minVal));
-
- // Rounding down
- val0 = val0 - (val0 % step);
- pCamNonMaster->setIntParameter(cmd, val0,
- [&result, &val1](auto status, auto effectiveValue) {
- result = status;
- val1 = effectiveValue;
- });
- ASSERT_EQ(EvsResult::OK, result);
-
- // Wait a moment
- sleep(1);
-
- // Non-master client expects to receive a parameter change notification
- // whenever a master client adjusts it.
- EvsEvent aNotification = {};
-
- pCamNonMaster->getIntParameter(cmd,
- [&result, &val1](auto status, auto value) {
- result = status;
- if (status == EvsResult::OK) {
- val1 = value;
- }
- });
- ASSERT_EQ(EvsResult::OK, result);
- ASSERT_EQ(val0, val1) << "Values are not matched.";
-
- // Verify a change notification
- frameHandlerMaster->waitForEvent(EvsEventType::PARAMETER_CHANGED, aNotification);
- ASSERT_EQ(EvsEventType::PARAMETER_CHANGED,
- static_cast<EvsEventType>(aNotification.aType));
- ASSERT_EQ(cmd,
- static_cast<CameraParam>(aNotification.payload[0]));
+ // Verify a change notification
+ if (result == EvsResult::OK) {
+ frameHandlerMaster->waitForEvent(InfoEventType::PARAMETER_CHANGED, aNotification);
+ ASSERT_EQ(static_cast<InfoEventType>(aNotification.aType),
+ InfoEventType::PARAMETER_CHANGED);
+ ASSERT_EQ(static_cast<CameraParam>(aNotification.payload[0]),
+ CameraParam::BRIGHTNESS);
ASSERT_EQ(val1,
static_cast<int32_t>(aNotification.payload[1]));
}
// New master retires from a master role
result = pCamNonMaster->unsetMaster();
- ASSERT_EQ(EvsResult::OK, result);
+ ASSERT_TRUE(result == EvsResult::OK);
// Shutdown
frameHandlerMaster->shutdown();
@@ -1060,18 +943,9 @@
TEST_F(EvsHidlTest, HighPriorityCameraClient) {
ALOGI("Starting HighPriorityCameraClient test");
- if (mIsHwModule) {
- // This test is not for HW module implementation.
- return;
- }
-
// Get the camera list
loadCameraList();
- // Using null stream configuration makes EVS uses the default resolution and
- // output format.
- Stream nullCfg = {};
-
// Request exclusive access to the EVS display
sp<IEvsDisplay> pDisplay = pEnumerator->openDisplay();
ASSERT_NE(pDisplay, nullptr);
@@ -1080,38 +954,15 @@
for (auto&& cam: cameraInfo) {
// Create two clients
sp<IEvsCamera_1_1> pCam0 =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCam0, nullptr);
sp<IEvsCamera_1_1> pCam1 =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, nullCfg))
+ IEvsCamera_1_1::castFrom(pEnumerator->openCamera(cam.cameraId))
.withDefault(nullptr);
ASSERT_NE(pCam1, nullptr);
- // Get the parameter list; this test will use the first command in both
- // lists.
- std::vector<CameraParam> cam0Cmds, cam1Cmds;
- pCam0->getParameterList([&cam0Cmds](hidl_vec<CameraParam> cmdList) {
- cam0Cmds.reserve(cmdList.size());
- for (auto &&cmd : cmdList) {
- cam0Cmds.push_back(cmd);
- }
- }
- );
-
- pCam1->getParameterList([&cam1Cmds](hidl_vec<CameraParam> cmdList) {
- cam1Cmds.reserve(cmdList.size());
- for (auto &&cmd : cmdList) {
- cam1Cmds.push_back(cmd);
- }
- }
- );
- if (cam0Cmds.size() < 1 || cam1Cmds.size() < 1) {
- // Cannot execute this test.
- return;
- }
-
// Set up a frame receiver object which will fire up its own thread.
sp<FrameHandler> frameHandler0 = new FrameHandler(pCam0, cam,
pDisplay,
@@ -1131,121 +982,67 @@
frameHandler0->waitForFrameCount(1);
frameHandler1->waitForFrameCount(1);
- // Client 1 becomes a master and programs a parameter.
+ // Client 1 becomes a master and programs a brightness.
EvsResult result = EvsResult::OK;
- // Get a valid parameter value range
- int32_t minVal, maxVal, step;
- pCam1->getIntParameterRange(
- cam1Cmds[0],
- [&minVal, &maxVal, &step](int32_t val0, int32_t val1, int32_t val2) {
- minVal = val0;
- maxVal = val1;
- step = val2;
- }
- );
-
- if (cam1Cmds[0] == CameraParam::ABSOLUTE_FOCUS) {
- // Try to turn off auto-focus
- int32_t val1 = 0;
- pCam1->getIntParameter(CameraParam::AUTO_FOCUS,
- [&result, &val1](auto status, auto value) {
- result = status;
- if (status == EvsResult::OK) {
- val1 = value;
- }
- });
- if (val1 != 0) {
- pCam1->setIntParameter(CameraParam::AUTO_FOCUS, 0,
- [&result, &val1](auto status, auto effectiveValue) {
- result = status;
- val1 = effectiveValue;
- });
- ASSERT_EQ(EvsResult::OK, result);
- ASSERT_EQ(val1, 0);
- }
- }
-
- // Try to program a parameter with a random value [minVal, maxVal]
- int32_t val0 = minVal + (std::rand() % (maxVal - minVal));
+ int32_t val0 = 100;
int32_t val1 = 0;
- // Rounding down
- val0 = val0 - (val0 % step);
-
result = pCam1->setMaster();
- ASSERT_EQ(EvsResult::OK, result);
+ ASSERT_TRUE(result == EvsResult::OK);
- pCam1->setIntParameter(cam1Cmds[0], val0,
+ pCam1->setParameter(CameraParam::BRIGHTNESS, val0,
[&result, &val1](auto status, auto effectiveValue) {
result = status;
val1 = effectiveValue;
});
- ASSERT_EQ(EvsResult::OK, result);
+ ASSERT_TRUE(result == EvsResult::OK ||
+ result == EvsResult::INVALID_ARG);
+
// Verify a change notification
- EvsEvent aNotification = {};
- bool timeout =
- frameHandler0->waitForEvent(EvsEventType::PARAMETER_CHANGED, aNotification);
- ASSERT_FALSE(timeout) << "Expected event does not arrive";
- ASSERT_EQ(static_cast<EvsEventType>(aNotification.aType),
- EvsEventType::PARAMETER_CHANGED);
- ASSERT_EQ(static_cast<CameraParam>(aNotification.payload[0]),
- cam1Cmds[0]);
- ASSERT_EQ(val1,
- static_cast<int32_t>(aNotification.payload[1]));
+ InfoEventDesc aNotification = {};
+ if (result == EvsResult::OK) {
+ bool timeout =
+ frameHandler0->waitForEvent(InfoEventType::PARAMETER_CHANGED, aNotification);
+ ASSERT_FALSE(timeout) << "Expected event does not arrive";
+ ASSERT_EQ(static_cast<InfoEventType>(aNotification.aType),
+ InfoEventType::PARAMETER_CHANGED);
+ ASSERT_EQ(static_cast<CameraParam>(aNotification.payload[0]),
+ CameraParam::BRIGHTNESS);
+ ASSERT_EQ(val1,
+ static_cast<int32_t>(aNotification.payload[1]));
+ }
// Client 0 steals a master role
ASSERT_EQ(EvsResult::OK, pCam0->forceMaster(pDisplay));
- frameHandler1->waitForEvent(EvsEventType::MASTER_RELEASED, aNotification);
- ASSERT_EQ(static_cast<EvsEventType>(aNotification.aType),
- EvsEventType::MASTER_RELEASED);
+ frameHandler1->waitForEvent(InfoEventType::MASTER_RELEASED, aNotification);
+ ASSERT_EQ(static_cast<InfoEventType>(aNotification.aType),
+ InfoEventType::MASTER_RELEASED);
- // Client 0 programs a parameter
- val0 = minVal + (std::rand() % (maxVal - minVal));
+ // Client 0 programs a brightness
+ val0 = 50;
val1 = 0;
-
- // Rounding down
- val0 = val0 - (val0 % step);
-
- if (cam0Cmds[0] == CameraParam::ABSOLUTE_FOCUS) {
- // Try to turn off auto-focus
- int32_t val1 = 0;
- pCam0->getIntParameter(CameraParam::AUTO_FOCUS,
- [&result, &val1](auto status, auto value) {
- result = status;
- if (status == EvsResult::OK) {
- val1 = value;
- }
- });
- if (val1 != 0) {
- pCam0->setIntParameter(CameraParam::AUTO_FOCUS, 0,
- [&result, &val1](auto status, auto effectiveValue) {
- result = status;
- val1 = effectiveValue;
- });
- ASSERT_EQ(EvsResult::OK, result);
- ASSERT_EQ(val1, 0);
- }
- }
-
- pCam0->setIntParameter(cam0Cmds[0], val0,
+ pCam0->setParameter(CameraParam::BRIGHTNESS, val0,
[&result, &val1](auto status, auto effectiveValue) {
result = status;
val1 = effectiveValue;
});
- ASSERT_EQ(EvsResult::OK, result);
+ ASSERT_TRUE(result == EvsResult::OK ||
+ result == EvsResult::INVALID_ARG);
// Verify a change notification
- timeout =
- frameHandler1->waitForEvent(EvsEventType::PARAMETER_CHANGED, aNotification);
- ASSERT_FALSE(timeout) << "Expected event does not arrive";
- ASSERT_EQ(static_cast<EvsEventType>(aNotification.aType),
- EvsEventType::PARAMETER_CHANGED);
- ASSERT_EQ(static_cast<CameraParam>(aNotification.payload[0]),
- cam0Cmds[0]);
- ASSERT_EQ(val1,
- static_cast<int32_t>(aNotification.payload[1]));
+ if (result == EvsResult::OK) {
+ bool timeout =
+ frameHandler1->waitForEvent(InfoEventType::PARAMETER_CHANGED, aNotification);
+ ASSERT_FALSE(timeout) << "Expected event does not arrive";
+ ASSERT_EQ(static_cast<InfoEventType>(aNotification.aType),
+ InfoEventType::PARAMETER_CHANGED);
+ ASSERT_EQ(static_cast<CameraParam>(aNotification.payload[0]),
+ CameraParam::BRIGHTNESS);
+ ASSERT_EQ(val1,
+ static_cast<int32_t>(aNotification.payload[1]));
+ }
// Turn off the display (yes, before the stream stops -- it should be handled)
pDisplay->setDisplayState(DisplayState::NOT_VISIBLE);
@@ -1264,248 +1061,6 @@
}
-/*
- * CameraUseStreamConfigToDisplay:
- * End to end test of data flowing from the camera to the display. Similar to
- * CameraToDisplayRoundTrip test case but this case retrieves available stream
- * configurations from EVS and uses one of them to start a video stream.
- */
-TEST_F(EvsHidlTest, CameraUseStreamConfigToDisplay) {
- ALOGI("Starting CameraUseStreamConfigToDisplay test");
-
- // Get the camera list
- loadCameraList();
-
- // Request exclusive access to the EVS display
- sp<IEvsDisplay> pDisplay = pEnumerator->openDisplay();
- ASSERT_NE(pDisplay, nullptr);
-
- // Test each reported camera
- for (auto&& cam: cameraInfo) {
- // choose a configuration that has a frame rate faster than minReqFps.
- Stream targetCfg = {};
- const int32_t minReqFps = 15;
- int32_t maxArea = 0;
- camera_metadata_entry_t streamCfgs;
- bool foundCfg = false;
- if (!find_camera_metadata_entry(
- reinterpret_cast<camera_metadata_t *>(cam.metadata.data()),
- ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
- &streamCfgs)) {
- // Stream configurations are found in metadata
- RawStreamConfig *ptr = reinterpret_cast<RawStreamConfig *>(streamCfgs.data.i32);
- for (unsigned idx = 0; idx < streamCfgs.count; idx += kStreamCfgSz) {
- if (ptr->direction == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT &&
- ptr->format == HAL_PIXEL_FORMAT_RGBA_8888) {
-
- if (ptr->width * ptr->height > maxArea &&
- ptr->framerate >= minReqFps) {
- targetCfg.width = ptr->width;
- targetCfg.height = ptr->height;
-
- maxArea = ptr->width * ptr->height;
- foundCfg = true;
- }
- }
- ++ptr;
- }
- }
- targetCfg.format =
- static_cast<PixelFormat>(HAL_PIXEL_FORMAT_RGBA_8888);
-
- if (!foundCfg) {
- // Current EVS camera does not provide stream configurations in the
- // metadata.
- continue;
- }
-
- sp<IEvsCamera_1_1> pCam =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, targetCfg))
- .withDefault(nullptr);
- ASSERT_NE(pCam, nullptr);
-
- // Set up a frame receiver object which will fire up its own thread.
- sp<FrameHandler> frameHandler = new FrameHandler(pCam, cam,
- pDisplay,
- FrameHandler::eAutoReturn);
-
-
- // Activate the display
- pDisplay->setDisplayState(DisplayState::VISIBLE_ON_NEXT_FRAME);
-
- // Start the camera's video stream
- bool startResult = frameHandler->startStream();
- ASSERT_TRUE(startResult);
-
- // Wait a while to let the data flow
- static const int kSecondsToWait = 5;
- const int streamTimeMs = kSecondsToWait * kSecondsToMilliseconds -
- kMaxStreamStartMilliseconds;
- const unsigned minimumFramesExpected = streamTimeMs * kMinimumFramesPerSecond /
- kSecondsToMilliseconds;
- sleep(kSecondsToWait);
- unsigned framesReceived = 0;
- unsigned framesDisplayed = 0;
- frameHandler->getFramesCounters(&framesReceived, &framesDisplayed);
- EXPECT_EQ(framesReceived, framesDisplayed);
- EXPECT_GE(framesDisplayed, minimumFramesExpected);
-
- // Turn off the display (yes, before the stream stops -- it should be handled)
- pDisplay->setDisplayState(DisplayState::NOT_VISIBLE);
-
- // Shut down the streamer
- frameHandler->shutdown();
-
- // Explicitly release the camera
- pEnumerator->closeCamera(pCam);
- }
-
- // Explicitly release the display
- pEnumerator->closeDisplay(pDisplay);
-}
-
-
-/*
- * MultiCameraStreamUseConfig:
- * Verify that each client can start and stop video streams on the same
- * underlying camera with same configuration.
- */
-TEST_F(EvsHidlTest, MultiCameraStreamUseConfig) {
- ALOGI("Starting MultiCameraStream test");
-
- if (mIsHwModule) {
- // This test is not for HW module implementation.
- return;
- }
-
- // Get the camera list
- loadCameraList();
-
- // Test each reported camera
- for (auto&& cam: cameraInfo) {
- // choose a configuration that has a frame rate faster than minReqFps.
- Stream targetCfg = {};
- const int32_t minReqFps = 15;
- int32_t maxArea = 0;
- camera_metadata_entry_t streamCfgs;
- bool foundCfg = false;
- if (!find_camera_metadata_entry(
- reinterpret_cast<camera_metadata_t *>(cam.metadata.data()),
- ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
- &streamCfgs)) {
- // Stream configurations are found in metadata
- RawStreamConfig *ptr = reinterpret_cast<RawStreamConfig *>(streamCfgs.data.i32);
- for (unsigned idx = 0; idx < streamCfgs.count; idx += kStreamCfgSz) {
- if (ptr->direction == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT &&
- ptr->format == HAL_PIXEL_FORMAT_RGBA_8888) {
-
- if (ptr->width * ptr->height > maxArea &&
- ptr->framerate >= minReqFps) {
- targetCfg.width = ptr->width;
- targetCfg.height = ptr->height;
-
- maxArea = ptr->width * ptr->height;
- foundCfg = true;
- }
- }
- ++ptr;
- }
- }
- targetCfg.format =
- static_cast<PixelFormat>(HAL_PIXEL_FORMAT_RGBA_8888);
-
- if (!foundCfg) {
- ALOGI("Device %s does not provide a list of supported stream configurations, skipped",
- cam.v1.cameraId.c_str());
-
- continue;
- }
-
- // Create the first camera client with a selected stream configuration.
- sp<IEvsCamera_1_1> pCam0 =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, targetCfg))
- .withDefault(nullptr);
- ASSERT_NE(pCam0, nullptr);
-
- // Try to create the second camera client with different stream
- // configuration.
- int32_t id = targetCfg.id;
- targetCfg.id += 1; // EVS manager sees only the stream id.
- sp<IEvsCamera_1_1> pCam1 =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, targetCfg))
- .withDefault(nullptr);
- ASSERT_EQ(pCam1, nullptr);
-
- // Try again with same stream configuration.
- targetCfg.id = id;
- pCam1 =
- IEvsCamera_1_1::castFrom(pEnumerator->openCamera_1_1(cam.v1.cameraId, targetCfg))
- .withDefault(nullptr);
- ASSERT_NE(pCam1, nullptr);
-
- // Set up per-client frame receiver objects which will fire up its own thread
- sp<FrameHandler> frameHandler0 = new FrameHandler(pCam0, cam,
- nullptr,
- FrameHandler::eAutoReturn);
- ASSERT_NE(frameHandler0, nullptr);
-
- sp<FrameHandler> frameHandler1 = new FrameHandler(pCam1, cam,
- nullptr,
- FrameHandler::eAutoReturn);
- ASSERT_NE(frameHandler1, nullptr);
-
- // Start the camera's video stream via client 0
- bool startResult = false;
- startResult = frameHandler0->startStream() &&
- frameHandler1->startStream();
- ASSERT_TRUE(startResult);
-
- // Ensure the stream starts
- frameHandler0->waitForFrameCount(1);
- frameHandler1->waitForFrameCount(1);
-
- nsecs_t firstFrame = systemTime(SYSTEM_TIME_MONOTONIC);
-
- // Wait a bit, then ensure both clients get at least the required minimum number of frames
- sleep(5);
- nsecs_t end = systemTime(SYSTEM_TIME_MONOTONIC);
- unsigned framesReceived0 = 0, framesReceived1 = 0;
- frameHandler0->getFramesCounters(&framesReceived0, nullptr);
- frameHandler1->getFramesCounters(&framesReceived1, nullptr);
- framesReceived0 = framesReceived0 - 1; // Back out the first frame we already waited for
- framesReceived1 = framesReceived1 - 1; // Back out the first frame we already waited for
- nsecs_t runTime = end - firstFrame;
- float framesPerSecond0 = framesReceived0 / (runTime * kNanoToSeconds);
- float framesPerSecond1 = framesReceived1 / (runTime * kNanoToSeconds);
- ALOGI("Measured camera rate %3.2f fps and %3.2f fps", framesPerSecond0, framesPerSecond1);
- EXPECT_GE(framesPerSecond0, kMinimumFramesPerSecond);
- EXPECT_GE(framesPerSecond1, kMinimumFramesPerSecond);
-
- // Shutdown one client
- frameHandler0->shutdown();
-
- // Read frame counters again
- frameHandler0->getFramesCounters(&framesReceived0, nullptr);
- frameHandler1->getFramesCounters(&framesReceived1, nullptr);
-
- // Wait a bit again
- sleep(5);
- unsigned framesReceivedAfterStop0 = 0, framesReceivedAfterStop1 = 0;
- frameHandler0->getFramesCounters(&framesReceivedAfterStop0, nullptr);
- frameHandler1->getFramesCounters(&framesReceivedAfterStop1, nullptr);
- EXPECT_EQ(framesReceived0, framesReceivedAfterStop0);
- EXPECT_LT(framesReceived1, framesReceivedAfterStop1);
-
- // Shutdown another
- frameHandler1->shutdown();
-
- // Explicitly release the camera
- pEnumerator->closeCamera(pCam0);
- pEnumerator->closeCamera(pCam1);
- }
-}
-
-
int main(int argc, char** argv) {
::testing::AddGlobalTestEnvironment(EvsHidlEnvironment::Instance());
::testing::InitGoogleTest(&argc, argv);