Merge "configstore: configstore HAL uprev'ed to 1.1" into pi-dev
diff --git a/broadcastradio/2.0/vts/functional/VtsHalBroadcastradioV2_0TargetTest.cpp b/broadcastradio/2.0/vts/functional/VtsHalBroadcastradioV2_0TargetTest.cpp
index 571b80c..62b0037 100644
--- a/broadcastradio/2.0/vts/functional/VtsHalBroadcastradioV2_0TargetTest.cpp
+++ b/broadcastradio/2.0/vts/functional/VtsHalBroadcastradioV2_0TargetTest.cpp
@@ -137,29 +137,30 @@
}
Return<void> TunerCallbackMock::onCurrentProgramInfoChanged(const ProgramInfo& info) {
- auto logically = utils::getType(info.logicallyTunedTo);
- if (logically != IdentifierType::INVALID) {
- EXPECT_TRUE(logically == IdentifierType::AMFM_FREQUENCY ||
- logically == IdentifierType::RDS_PI ||
- logically == IdentifierType::HD_STATION_ID_EXT ||
- logically == IdentifierType::DAB_SID_EXT ||
- logically == IdentifierType::DRMO_SERVICE_ID ||
- logically == IdentifierType::SXM_SERVICE_ID ||
- (logically >= IdentifierType::VENDOR_START &&
- logically <= IdentifierType::VENDOR_END) ||
- logically > IdentifierType::SXM_CHANNEL);
+ for (auto&& id : info.selector) {
+ EXPECT_NE(IdentifierType::INVALID, utils::getType(id));
}
+ auto logically = utils::getType(info.logicallyTunedTo);
+ /* This field is required for currently tuned program and should be INVALID
+ * for entries from the program list.
+ */
+ EXPECT_TRUE(
+ logically == IdentifierType::AMFM_FREQUENCY || logically == IdentifierType::RDS_PI ||
+ logically == IdentifierType::HD_STATION_ID_EXT ||
+ logically == IdentifierType::DAB_SID_EXT || logically == IdentifierType::DRMO_SERVICE_ID ||
+ logically == IdentifierType::SXM_SERVICE_ID ||
+ (logically >= IdentifierType::VENDOR_START && logically <= IdentifierType::VENDOR_END) ||
+ logically > IdentifierType::SXM_CHANNEL);
+
auto physically = utils::getType(info.physicallyTunedTo);
- if (physically != IdentifierType::INVALID) {
- EXPECT_TRUE(physically == IdentifierType::AMFM_FREQUENCY ||
- physically == IdentifierType::DAB_ENSEMBLE ||
- physically == IdentifierType::DRMO_FREQUENCY ||
- physically == IdentifierType::SXM_CHANNEL ||
- (physically >= IdentifierType::VENDOR_START &&
- physically <= IdentifierType::VENDOR_END) ||
- physically > IdentifierType::SXM_CHANNEL);
- }
+ // ditto (see "logically" above)
+ EXPECT_TRUE(
+ physically == IdentifierType::AMFM_FREQUENCY ||
+ physically == IdentifierType::DAB_ENSEMBLE ||
+ physically == IdentifierType::DRMO_FREQUENCY || physically == IdentifierType::SXM_CHANNEL ||
+ (physically >= IdentifierType::VENDOR_START && physically <= IdentifierType::VENDOR_END) ||
+ physically > IdentifierType::SXM_CHANNEL);
if (logically == IdentifierType::AMFM_FREQUENCY) {
auto ps = utils::getMetadataString(info, MetadataKey::RDS_PS);
diff --git a/broadcastradio/common/tests/IdentifierIterator_test.cpp b/broadcastradio/common/tests/IdentifierIterator_test.cpp
index 5bf222b..75e0d49 100644
--- a/broadcastradio/common/tests/IdentifierIterator_test.cpp
+++ b/broadcastradio/common/tests/IdentifierIterator_test.cpp
@@ -33,8 +33,8 @@
};
// clang-format on
- auto it = utils::begin(sel);
- auto end = utils::end(sel);
+ auto it = V2_0::begin(sel);
+ auto end = V2_0::end(sel);
ASSERT_NE(end, it);
EXPECT_EQ(sel.primaryId, *it);
@@ -46,8 +46,8 @@
TEST(IdentifierIteratorTest, empty) {
V2_0::ProgramSelector sel{};
- auto it = utils::begin(sel);
- auto end = utils::end(sel);
+ auto it = V2_0::begin(sel);
+ auto end = V2_0::end(sel);
ASSERT_NE(end, it++); // primary id is always present
ASSERT_EQ(end, it);
@@ -57,8 +57,8 @@
V2_0::ProgramSelector sel1{};
V2_0::ProgramSelector sel2{};
- auto it1 = utils::begin(sel1);
- auto it2 = utils::begin(sel2);
+ auto it1 = V2_0::begin(sel1);
+ auto it2 = V2_0::begin(sel2);
EXPECT_NE(it1, it2);
}
@@ -66,8 +66,8 @@
TEST(IdentifierIteratorTest, increments) {
V2_0::ProgramSelector sel{{}, {{}, {}}};
- auto it = utils::begin(sel);
- auto end = utils::end(sel);
+ auto it = V2_0::begin(sel);
+ auto end = V2_0::end(sel);
auto pre = it;
auto post = it;
@@ -102,8 +102,8 @@
auto isRdsPi = std::bind(typeEquals, _1, IdentifierType::RDS_PI);
auto isFreq = std::bind(typeEquals, _1, IdentifierType::AMFM_FREQUENCY);
- auto end = utils::end(sel);
- auto it = std::find_if(utils::begin(sel), end, isRdsPi);
+ auto end = V2_0::end(sel);
+ auto it = std::find_if(V2_0::begin(sel), end, isRdsPi);
ASSERT_NE(end, it);
EXPECT_EQ(rds_pi1, it->value);
@@ -111,7 +111,7 @@
ASSERT_NE(end, it);
EXPECT_EQ(rds_pi2, it->value);
- it = std::find_if(utils::begin(sel), end, isFreq);
+ it = std::find_if(V2_0::begin(sel), end, isFreq);
ASSERT_NE(end, it);
EXPECT_EQ(freq1, it->value);
@@ -120,4 +120,17 @@
EXPECT_EQ(freq2, it->value);
}
+TEST(IdentifierIteratorTest, rangeLoop) {
+ V2_0::ProgramSelector sel{{}, {{}, {}, {}}};
+
+ unsigned count = 0;
+ for (auto&& id : sel) {
+ ASSERT_EQ(0u, id.type);
+ count++;
+ }
+
+ const auto expectedCount = 1 + sel.secondaryIds.size();
+ ASSERT_EQ(expectedCount, count);
+}
+
} // anonymous namespace
diff --git a/broadcastradio/common/utils2x/Utils.cpp b/broadcastradio/common/utils2x/Utils.cpp
index 6fe9554..3e20b35 100644
--- a/broadcastradio/common/utils2x/Utils.cpp
+++ b/broadcastradio/common/utils2x/Utils.cpp
@@ -81,14 +81,6 @@
return mPos == rhs.mPos;
}
-IdentifierIterator begin(const V2_0::ProgramSelector& sel) {
- return IdentifierIterator(sel);
-}
-
-IdentifierIterator end(const V2_0::ProgramSelector& sel) {
- return IdentifierIterator(sel) + 1 /* primary id */ + sel.secondaryIds.size();
-}
-
FrequencyBand getBand(uint64_t freq) {
// keep in sync with
// frameworks/base/services/core/java/com/android/server/broadcastradio/hal2/Utils.java
@@ -411,6 +403,18 @@
}
} // namespace utils
+
+namespace V2_0 {
+
+utils::IdentifierIterator begin(const ProgramSelector& sel) {
+ return utils::IdentifierIterator(sel);
+}
+
+utils::IdentifierIterator end(const ProgramSelector& sel) {
+ return utils::IdentifierIterator(sel) + 1 /* primary id */ + sel.secondaryIds.size();
+}
+
+} // namespace V2_0
} // namespace broadcastradio
} // namespace hardware
} // namespace android
diff --git a/broadcastradio/common/utils2x/include/broadcastradio-utils-2x/Utils.h b/broadcastradio/common/utils2x/include/broadcastradio-utils-2x/Utils.h
index 5e51941..c4aecb2 100644
--- a/broadcastradio/common/utils2x/include/broadcastradio-utils-2x/Utils.h
+++ b/broadcastradio/common/utils2x/include/broadcastradio-utils-2x/Utils.h
@@ -69,9 +69,6 @@
size_t mPos = 0;
};
-IdentifierIterator begin(const V2_0::ProgramSelector& sel);
-IdentifierIterator end(const V2_0::ProgramSelector& sel);
-
/**
* Guesses band from the frequency value.
*
@@ -153,6 +150,13 @@
V2_0::ProgramIdentifier make_hdradio_station_name(const std::string& name);
} // namespace utils
+
+namespace V2_0 {
+
+utils::IdentifierIterator begin(const ProgramSelector& sel);
+utils::IdentifierIterator end(const ProgramSelector& sel);
+
+} // namespace V2_0
} // namespace broadcastradio
} // namespace hardware
} // namespace android
diff --git a/camera/common/1.0/default/CameraModule.cpp b/camera/common/1.0/default/CameraModule.cpp
index 9217a82..dc4e0f0 100644
--- a/camera/common/1.0/default/CameraModule.cpp
+++ b/camera/common/1.0/default/CameraModule.cpp
@@ -306,7 +306,7 @@
return ret;
}
CameraMetadata m;
- m = rawInfo.static_camera_characteristics;
+ m.append(rawInfo.static_camera_characteristics);
deriveCameraCharacteristicsKeys(rawInfo.device_version, m);
cameraInfo = rawInfo;
cameraInfo.static_camera_characteristics = m.release();
diff --git a/camera/device/3.2/default/CameraDeviceSession.cpp b/camera/device/3.2/default/CameraDeviceSession.cpp
index 1cef882..f33da13 100644
--- a/camera/device/3.2/default/CameraDeviceSession.cpp
+++ b/camera/device/3.2/default/CameraDeviceSession.cpp
@@ -35,6 +35,13 @@
// Size of result metadata fast message queue. Change to 0 to always use hwbinder buffer.
static constexpr size_t CAMERA_RESULT_METADATA_QUEUE_SIZE = 1 << 20 /* 1MB */;
+// Metadata sent by HAL will be replaced by a compact copy
+// if their (total size >= compact size + METADATA_SHRINK_ABS_THRESHOLD &&
+// total_size >= compact size * METADATA_SHRINK_REL_THRESHOLD)
+// Heuristically picked by size of one page
+static constexpr int METADATA_SHRINK_ABS_THRESHOLD = 4096;
+static constexpr int METADATA_SHRINK_REL_THRESHOLD = 2;
+
HandleImporter CameraDeviceSession::sHandleImporter;
const int CameraDeviceSession::ResultBatcher::NOT_BATCHED;
@@ -780,13 +787,11 @@
mOverridenRequest.update(
ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST,
defaultBoost, 1);
- const camera_metadata_t *metaBuffer =
- mOverridenRequest.getAndLock();
- convertToHidl(metaBuffer, outMetadata);
- mOverridenRequest.unlock(metaBuffer);
- } else {
- convertToHidl(rawRequest, outMetadata);
}
+ const camera_metadata_t *metaBuffer =
+ mOverridenRequest.getAndLock();
+ convertToHidl(metaBuffer, outMetadata);
+ mOverridenRequest.unlock(metaBuffer);
}
}
return status;
@@ -1362,6 +1367,62 @@
return OK;
}
+// Static helper method to copy/shrink capture result metadata sent by HAL
+void CameraDeviceSession::sShrinkCaptureResult(
+ camera3_capture_result* dst, const camera3_capture_result* src,
+ std::vector<::android::hardware::camera::common::V1_0::helper::CameraMetadata>* mds,
+ std::vector<const camera_metadata_t*>* physCamMdArray,
+ bool handlePhysCam) {
+ *dst = *src;
+ if (sShouldShrink(src->result)) {
+ mds->emplace_back(sCreateCompactCopy(src->result));
+ dst->result = mds->back().getAndLock();
+ }
+
+ if (handlePhysCam) {
+ // First determine if we need to create new camera_metadata_t* array
+ bool needShrink = false;
+ for (uint32_t i = 0; i < src->num_physcam_metadata; i++) {
+ if (sShouldShrink(src->physcam_metadata[i])) {
+ needShrink = true;
+ }
+ }
+
+ if (!needShrink) return;
+
+ physCamMdArray->reserve(src->num_physcam_metadata);
+ dst->physcam_metadata = physCamMdArray->data();
+ for (uint32_t i = 0; i < src->num_physcam_metadata; i++) {
+ if (sShouldShrink(src->physcam_metadata[i])) {
+ mds->emplace_back(sCreateCompactCopy(src->physcam_metadata[i]));
+ dst->physcam_metadata[i] = mds->back().getAndLock();
+ } else {
+ dst->physcam_metadata[i] = src->physcam_metadata[i];
+ }
+ }
+ }
+}
+
+bool CameraDeviceSession::sShouldShrink(const camera_metadata_t* md) {
+ size_t compactSize = get_camera_metadata_compact_size(md);
+ size_t totalSize = get_camera_metadata_size(md);
+ if (totalSize >= compactSize + METADATA_SHRINK_ABS_THRESHOLD &&
+ totalSize >= compactSize * METADATA_SHRINK_REL_THRESHOLD) {
+ ALOGV("Camera metadata should be shrunk from %zu to %zu", totalSize, compactSize);
+ return true;
+ }
+ return false;
+}
+
+camera_metadata_t* CameraDeviceSession::sCreateCompactCopy(const camera_metadata_t* src) {
+ size_t compactSize = get_camera_metadata_compact_size(src);
+ void* buffer = calloc(1, compactSize);
+ if (buffer == nullptr) {
+ ALOGE("%s: Allocating %zu bytes failed", __FUNCTION__, compactSize);
+ }
+ return copy_camera_metadata(buffer, compactSize, src);
+}
+
/**
* Static callback forwarding methods from HAL to instance
*/
@@ -1372,7 +1433,13 @@
const_cast<CameraDeviceSession*>(static_cast<const CameraDeviceSession*>(cb));
CaptureResult result = {};
- status_t ret = d->constructCaptureResult(result, hal_result);
+ camera3_capture_result shadowResult;
+ bool handlePhysCam = (d->mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_5);
+ std::vector<::android::hardware::camera::common::V1_0::helper::CameraMetadata> compactMds;
+ std::vector<const camera_metadata_t*> physCamMdArray;
+ sShrinkCaptureResult(&shadowResult, hal_result, &compactMds, &physCamMdArray, handlePhysCam);
+
+ status_t ret = d->constructCaptureResult(result, &shadowResult);
if (ret == OK) {
d->mResultBatcher.processCaptureResult(result);
}
diff --git a/camera/device/3.2/default/CameraDeviceSession.h b/camera/device/3.2/default/CameraDeviceSession.h
index 269cc06..af90e5a 100644
--- a/camera/device/3.2/default/CameraDeviceSession.h
+++ b/camera/device/3.2/default/CameraDeviceSession.h
@@ -141,7 +141,7 @@
};
camera3_device_t* mDevice;
- uint32_t mDeviceVersion;
+ const uint32_t mDeviceVersion;
bool mIsAELockAvailable;
bool mDerivePostRawSensKey;
uint32_t mNumPartialResults;
@@ -329,6 +329,17 @@
status_t constructCaptureResult(CaptureResult& result,
const camera3_capture_result *hal_result);
+
+ // Static helper method to copy/shrink capture result metadata sent by HAL
+ // Temporarily allocated metadata copy will be hold in mds
+ static void sShrinkCaptureResult(
+ camera3_capture_result* dst, const camera3_capture_result* src,
+ std::vector<::android::hardware::camera::common::V1_0::helper::CameraMetadata>* mds,
+ std::vector<const camera_metadata_t*>* physCamMdArray,
+ bool handlePhysCam);
+ static bool sShouldShrink(const camera_metadata_t* md);
+ static camera_metadata_t* sCreateCompactCopy(const camera_metadata_t* src);
+
private:
struct TrampolineSessionInterface_3_2 : public ICameraDeviceSession {
diff --git a/camera/device/3.4/default/CameraDeviceSession.cpp b/camera/device/3.4/default/CameraDeviceSession.cpp
index 9722c75..6a18161 100644
--- a/camera/device/3.4/default/CameraDeviceSession.cpp
+++ b/camera/device/3.4/default/CameraDeviceSession.cpp
@@ -479,31 +479,40 @@
const_cast<CameraDeviceSession*>(static_cast<const CameraDeviceSession*>(cb));
CaptureResult result = {};
- status_t ret = d->constructCaptureResult(result.v3_2, hal_result);
+ camera3_capture_result shadowResult;
+ bool handlePhysCam = (d->mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_5);
+ std::vector<::android::hardware::camera::common::V1_0::helper::CameraMetadata> compactMds;
+ std::vector<const camera_metadata_t*> physCamMdArray;
+ sShrinkCaptureResult(&shadowResult, hal_result, &compactMds, &physCamMdArray, handlePhysCam);
+
+ status_t ret = d->constructCaptureResult(result.v3_2, &shadowResult);
if (ret != OK) {
return;
}
- if (hal_result->num_physcam_metadata > d->mPhysicalCameraIds.size()) {
- ALOGE("%s: Fatal: Invalid num_physcam_metadata %u", __FUNCTION__,
- hal_result->num_physcam_metadata);
- return;
- }
- result.physicalCameraMetadata.resize(hal_result->num_physcam_metadata);
- for (uint32_t i = 0; i < hal_result->num_physcam_metadata; i++) {
- std::string physicalId = hal_result->physcam_ids[i];
- if (d->mPhysicalCameraIds.find(physicalId) == d->mPhysicalCameraIds.end()) {
- ALOGE("%s: Fatal: Invalid physcam_ids[%u]: %s", __FUNCTION__,
- i, hal_result->physcam_ids[i]);
+ if (handlePhysCam) {
+ if (shadowResult.num_physcam_metadata > d->mPhysicalCameraIds.size()) {
+ ALOGE("%s: Fatal: Invalid num_physcam_metadata %u", __FUNCTION__,
+ shadowResult.num_physcam_metadata);
return;
}
- V3_2::CameraMetadata physicalMetadata;
- V3_2::implementation::convertToHidl(hal_result->physcam_metadata[i], &physicalMetadata);
- PhysicalCameraMetadata physicalCameraMetadata = {
- .fmqMetadataSize = 0,
- .physicalCameraId = physicalId,
- .metadata = physicalMetadata };
- result.physicalCameraMetadata[i] = physicalCameraMetadata;
+ result.physicalCameraMetadata.resize(shadowResult.num_physcam_metadata);
+ for (uint32_t i = 0; i < shadowResult.num_physcam_metadata; i++) {
+ std::string physicalId = shadowResult.physcam_ids[i];
+ if (d->mPhysicalCameraIds.find(physicalId) == d->mPhysicalCameraIds.end()) {
+ ALOGE("%s: Fatal: Invalid physcam_ids[%u]: %s", __FUNCTION__,
+ i, shadowResult.physcam_ids[i]);
+ return;
+ }
+ V3_2::CameraMetadata physicalMetadata;
+ V3_2::implementation::convertToHidl(
+ shadowResult.physcam_metadata[i], &physicalMetadata);
+ PhysicalCameraMetadata physicalCameraMetadata = {
+ .fmqMetadataSize = 0,
+ .physicalCameraId = physicalId,
+ .metadata = physicalMetadata };
+ result.physicalCameraMetadata[i] = physicalCameraMetadata;
+ }
}
d->mResultBatcher_3_4.processCaptureResult_3_4(result);
}
diff --git a/compatibility_matrices/Android.mk b/compatibility_matrices/Android.mk
index 86fe00d..3702cf0 100644
--- a/compatibility_matrices/Android.mk
+++ b/compatibility_matrices/Android.mk
@@ -66,7 +66,7 @@
LOCAL_KERNEL_CONFIG_DATA_PATHS := \
4.4.107:$(my_kernel_config_data)/p/android-4.4 \
4.9.84:$(my_kernel_config_data)/p/android-4.9 \
- 4.14.40:$(my_kernel_config_data)/p/android-4.14 \
+ 4.14.42:$(my_kernel_config_data)/p/android-4.14 \
include $(BUILD_FRAMEWORK_COMPATIBILITY_MATRIX)