Merge "Address comments on previous CL"
diff --git a/camera/ndk/NdkCameraManager.cpp b/camera/ndk/NdkCameraManager.cpp
index 60b4763..f14a4c9 100644
--- a/camera/ndk/NdkCameraManager.cpp
+++ b/camera/ndk/NdkCameraManager.cpp
@@ -23,6 +23,7 @@
#include <camera/NdkCameraManager.h>
#include "impl/ACameraManager.h"
+#include "impl/ACameraMetadata.h"
using namespace android;
@@ -107,7 +108,14 @@
__FUNCTION__, mgr, cameraId, chars);
return ACAMERA_ERROR_INVALID_PARAMETER;
}
- return mgr->getCameraCharacteristics(cameraId, chars);
+ sp<ACameraMetadata> spChars;
+ camera_status_t status = mgr->getCameraCharacteristics(cameraId, &spChars);
+ if (status != ACAMERA_OK) {
+ return status;
+ }
+ spChars->incStrong((void*) ACameraManager_getCameraCharacteristics);
+ *chars = spChars.get();
+ return ACAMERA_OK;
}
EXPORT
diff --git a/camera/ndk/NdkCameraMetadata.cpp b/camera/ndk/NdkCameraMetadata.cpp
index 65de81f..34ec2da 100644
--- a/camera/ndk/NdkCameraMetadata.cpp
+++ b/camera/ndk/NdkCameraMetadata.cpp
@@ -57,13 +57,15 @@
ALOGE("%s: src is null!", __FUNCTION__);
return nullptr;
}
- return new ACameraMetadata(*src);
+ ACameraMetadata* copy = new ACameraMetadata(*src);
+ copy->incStrong((void*) ACameraMetadata_copy);
+ return copy;
}
EXPORT
void ACameraMetadata_free(ACameraMetadata* metadata) {
ATRACE_CALL();
if (metadata != nullptr) {
- delete metadata;
+ metadata->decStrong((void*) ACameraMetadata_free);
}
}
diff --git a/camera/ndk/NdkCaptureRequest.cpp b/camera/ndk/NdkCaptureRequest.cpp
index ac1856b..ddb69d7 100644
--- a/camera/ndk/NdkCaptureRequest.cpp
+++ b/camera/ndk/NdkCaptureRequest.cpp
@@ -137,7 +137,7 @@
if (request == nullptr) {
return;
}
- delete request->settings;
+ request->settings.clear();
delete request->targets;
delete request;
return;
diff --git a/camera/ndk/impl/ACameraDevice.cpp b/camera/ndk/impl/ACameraDevice.cpp
index 907debc..c908323 100644
--- a/camera/ndk/impl/ACameraDevice.cpp
+++ b/camera/ndk/impl/ACameraDevice.cpp
@@ -50,11 +50,11 @@
CameraDevice::CameraDevice(
const char* id,
ACameraDevice_StateCallbacks* cb,
- std::unique_ptr<ACameraMetadata> chars,
+ sp<ACameraMetadata> chars,
ACameraDevice* wrapper) :
mCameraId(id),
mAppCallbacks(*cb),
- mChars(std::move(chars)),
+ mChars(chars),
mServiceCallback(new ServiceCallback(this)),
mWrapper(wrapper),
mInError(false),
@@ -436,7 +436,7 @@
if (req == nullptr) {
return;
}
- delete req->settings;
+ req->settings.clear();
delete req->targets;
delete req;
}
diff --git a/camera/ndk/impl/ACameraDevice.h b/camera/ndk/impl/ACameraDevice.h
index 1369148..7d64081 100644
--- a/camera/ndk/impl/ACameraDevice.h
+++ b/camera/ndk/impl/ACameraDevice.h
@@ -48,7 +48,7 @@
class CameraDevice final : public RefBase {
public:
CameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
- std::unique_ptr<ACameraMetadata> chars,
+ sp<ACameraMetadata> chars,
ACameraDevice* wrapper);
~CameraDevice();
@@ -156,7 +156,7 @@
mutable Mutex mDeviceLock;
const String8 mCameraId; // Camera ID
const ACameraDevice_StateCallbacks mAppCallbacks; // Callback to app
- const std::unique_ptr<ACameraMetadata> mChars; // Camera characteristics
+ const sp<ACameraMetadata> mChars; // Camera characteristics
const sp<ServiceCallback> mServiceCallback;
ACameraDevice* mWrapper;
@@ -294,8 +294,8 @@
*/
struct ACameraDevice {
ACameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
- std::unique_ptr<ACameraMetadata> chars) :
- mDevice(new CameraDevice(id, cb, std::move(chars), this)) {}
+ sp<ACameraMetadata> chars) :
+ mDevice(new CameraDevice(id, cb, chars, this)) {}
~ACameraDevice() {};
diff --git a/camera/ndk/impl/ACameraManager.cpp b/camera/ndk/impl/ACameraManager.cpp
index c59d0e7..ee67677 100644
--- a/camera/ndk/impl/ACameraManager.cpp
+++ b/camera/ndk/impl/ACameraManager.cpp
@@ -402,7 +402,7 @@
}
camera_status_t ACameraManager::getCameraCharacteristics(
- const char *cameraIdStr, ACameraMetadata **characteristics) {
+ const char* cameraIdStr, sp<ACameraMetadata>* characteristics) {
Mutex::Autolock _l(mLock);
sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
@@ -437,18 +437,16 @@
const char* cameraId,
ACameraDevice_StateCallbacks* callback,
/*out*/ACameraDevice** outDevice) {
- ACameraMetadata* rawChars;
- camera_status_t ret = getCameraCharacteristics(cameraId, &rawChars);
+ sp<ACameraMetadata> chars;
+ camera_status_t ret = getCameraCharacteristics(cameraId, &chars);
Mutex::Autolock _l(mLock);
if (ret != ACAMERA_OK) {
ALOGE("%s: cannot get camera characteristics for camera %s. err %d",
__FUNCTION__, cameraId, ret);
return ACAMERA_ERROR_INVALID_PARAMETER;
}
- std::unique_ptr<ACameraMetadata> chars(rawChars);
- rawChars = nullptr;
- ACameraDevice* device = new ACameraDevice(cameraId, callback, std::move(chars));
+ ACameraDevice* device = new ACameraDevice(cameraId, callback, chars);
sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
if (cs == nullptr) {
diff --git a/camera/ndk/impl/ACameraManager.h b/camera/ndk/impl/ACameraManager.h
index cc42f77..ce65769 100644
--- a/camera/ndk/impl/ACameraManager.h
+++ b/camera/ndk/impl/ACameraManager.h
@@ -186,7 +186,7 @@
static void deleteCameraIdList(ACameraIdList* cameraIdList);
camera_status_t getCameraCharacteristics(
- const char *cameraId, ACameraMetadata **characteristics);
+ const char* cameraId, android::sp<ACameraMetadata>* characteristics);
camera_status_t openCamera(const char* cameraId,
ACameraDevice_StateCallbacks* callback,
/*out*/ACameraDevice** device);
diff --git a/camera/ndk/impl/ACaptureRequest.h b/camera/ndk/impl/ACaptureRequest.h
index 06b2cc3..b11dafb 100644
--- a/camera/ndk/impl/ACaptureRequest.h
+++ b/camera/ndk/impl/ACaptureRequest.h
@@ -55,7 +55,7 @@
return ACAMERA_OK;
}
- ACameraMetadata* settings;
+ sp<ACameraMetadata> settings;
ACameraOutputTargets* targets;
void* context;
};
diff --git a/media/libaudioclient/ToneGenerator.cpp b/media/libaudioclient/ToneGenerator.cpp
index 5e979e0..c9263f4 100644
--- a/media/libaudioclient/ToneGenerator.cpp
+++ b/media/libaudioclient/ToneGenerator.cpp
@@ -1379,16 +1379,18 @@
lWaveCmd = WaveGenerator::WAVEGEN_START;
}
- ALOGV("New segment %d, Next Time: %d", lpToneGen->mCurSegment,
- (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate);
+ ALOGV("New segment %d, Next Time: %lld", lpToneGen->mCurSegment,
+ ((long long)(lpToneGen->mNextSegSmp)*1000)/lpToneGen->mSamplingRate);
+
} else {
lGenSmp = 0;
ALOGV("End repeat, time: %d", (unsigned int)(systemTime()/1000000));
}
} else {
- ALOGV("New segment %d, Next Time: %d", lpToneGen->mCurSegment,
- (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate);
+ ALOGV("New segment %d, Next Time: %lld", lpToneGen->mCurSegment,
+ ((long long)(lpToneGen->mNextSegSmp)*1000)/lpToneGen->mSamplingRate);
+
if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) {
// If next segment is not silent, OFF -> ON transition : reset wave generator
lWaveCmd = WaveGenerator::WAVEGEN_START;
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 43566b7..ed2b3c0 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -66,7 +66,6 @@
#include <media/MemoryLeakTrackUtil.h>
#include <media/nbaio/Pipe.h>
#include <media/nbaio/PipeReader.h>
-#include <media/AudioParameter.h>
#include <mediautils/BatteryNotifier.h>
#include <mediautils/ServiceUtilities.h>
#include <private/android_filesystem_config.h>
@@ -517,6 +516,15 @@
mPatchPanel.dump(fd);
+ // dump external setParameters
+ auto dumpLogger = [fd](SimpleLog& logger, const char* name) {
+ dprintf(fd, "\n%s setParameters:\n", name);
+ logger.dump(fd, " " /* prefix */);
+ };
+ dumpLogger(mRejectedSetParameterLog, "Rejected");
+ dumpLogger(mAppSetParameterLog, "App");
+ dumpLogger(mSystemSetParameterLog, "System");
+
BUFLOG_RESET;
if (locked) {
@@ -1229,16 +1237,33 @@
AudioParameter param = AudioParameter(keyValuePairs);
String8 value;
+ AudioParameter rejectedParam;
for (auto& key : kReservedParameters) {
if (param.get(key, value) == NO_ERROR) {
- ALOGW("%s: filtering key %s value %s from uid %d",
- __func__, key.string(), value.string(), callingUid);
+ rejectedParam.add(key, value);
param.remove(key);
}
}
+ logFilteredParameters(param.size() + rejectedParam.size(), keyValuePairs,
+ rejectedParam.size(), rejectedParam.toString(), callingUid);
keyValuePairs = param.toString();
}
+void AudioFlinger::logFilteredParameters(size_t originalKVPSize, const String8& originalKVPs,
+ size_t rejectedKVPSize, const String8& rejectedKVPs,
+ uid_t callingUid) {
+ auto prefix = String8::format("UID %5d", callingUid);
+ auto suffix = String8::format("%zu KVP received: %s", originalKVPSize, originalKVPs.c_str());
+ if (rejectedKVPSize != 0) {
+ auto error = String8::format("%zu KVP rejected: %s", rejectedKVPSize, rejectedKVPs.c_str());
+ ALOGW("%s: %s, %s, %s", __func__, prefix.c_str(), error.c_str(), suffix.c_str());
+ mRejectedSetParameterLog.log("%s, %s, %s", prefix.c_str(), error.c_str(), suffix.c_str());
+ } else {
+ auto& logger = (isServiceUid(callingUid) ? mSystemSetParameterLog : mAppSetParameterLog);
+ logger.log("%s, %s", prefix.c_str(), suffix.c_str());
+ }
+}
+
status_t AudioFlinger::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
{
ALOGV("setParameters(): io %d, keyvalue %s, calling pid %d calling uid %d",
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 2d2da3e..9c36479 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -812,6 +812,9 @@
status_t checkStreamType(audio_stream_type_t stream) const;
void filterReservedParameters(String8& keyValuePairs, uid_t callingUid);
+ void logFilteredParameters(size_t originalKVPSize, const String8& originalKVPs,
+ size_t rejectedKVPSize, const String8& rejectedKVPs,
+ uid_t callingUid);
public:
// These methods read variables atomically without mLock,
@@ -832,7 +835,11 @@
PatchPanel mPatchPanel;
sp<EffectsFactoryHalInterface> mEffectsFactoryHal;
- bool mSystemReady;
+ bool mSystemReady;
+
+ SimpleLog mRejectedSetParameterLog;
+ SimpleLog mAppSetParameterLog;
+ SimpleLog mSystemSetParameterLog;
};
#undef INCLUDING_FROM_AUDIOFLINGER_H
diff --git a/services/camera/libcameraservice/TEST_MAPPING b/services/camera/libcameraservice/TEST_MAPPING
new file mode 100644
index 0000000..6fdac68
--- /dev/null
+++ b/services/camera/libcameraservice/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "presubmit": [
+ {
+ "name": "cameraservice_test"
+ }
+ ]
+}
diff --git a/services/camera/libcameraservice/tests/CameraProviderManagerTest.cpp b/services/camera/libcameraservice/tests/CameraProviderManagerTest.cpp
index ef93d9a..0086c6c 100644
--- a/services/camera/libcameraservice/tests/CameraProviderManagerTest.cpp
+++ b/services/camera/libcameraservice/tests/CameraProviderManagerTest.cpp
@@ -163,7 +163,7 @@
mTestCameraProvider = provider;
}
- std::string mLastRequestedServiceName;
+ std::vector<std::string> mLastRequestedServiceNames;
virtual ~TestInteractionProxy() {}
@@ -177,7 +177,7 @@
virtual sp<hardware::camera::provider::V2_4::ICameraProvider> getService(
const std::string &serviceName) override {
- mLastRequestedServiceName = serviceName;
+ mLastRequestedServiceNames.push_back(serviceName);
return mTestCameraProvider;
}
@@ -210,9 +210,18 @@
res = providerManager->initialize(statusListener, &serviceProxy);
ASSERT_EQ(res, OK) << "Unable to initialize provider manager";
- hardware::hidl_string legacyInstanceName = "legacy/0";
- ASSERT_EQ(serviceProxy.mLastRequestedServiceName, legacyInstanceName) <<
+ std::string legacyInstanceName = "legacy/0";
+ std::string externalInstanceName = "external/0";
+ bool gotLegacy = false;
+ bool gotExternal = false;
+ for (auto& serviceName : serviceProxy.mLastRequestedServiceNames) {
+ if (serviceName == legacyInstanceName) gotLegacy = true;
+ if (serviceName == externalInstanceName) gotExternal = true;
+ }
+ ASSERT_TRUE(gotLegacy) <<
"Legacy instance not requested from service manager";
+ ASSERT_TRUE(gotExternal) <<
+ "External instance not requested from service manager";
hardware::hidl_string testProviderFqInterfaceName =
"android.hardware.camera.provider@2.4::ICameraProvider";
@@ -221,7 +230,7 @@
testProviderFqInterfaceName,
testProviderInstanceName, false);
- ASSERT_EQ(serviceProxy.mLastRequestedServiceName, testProviderInstanceName) <<
+ ASSERT_EQ(serviceProxy.mLastRequestedServiceNames.back(), testProviderInstanceName) <<
"Incorrect instance requested from service manager";
}
@@ -255,7 +264,7 @@
"android.hardware.camera.provider@2.4::ICameraProvider";
serviceProxy.mManagerNotificationInterface->onRegistration(
testProviderFqInterfaceName, testProviderInstanceName, false);
- ASSERT_EQ(serviceProxy.mLastRequestedServiceName, testProviderInstanceName) <<
+ ASSERT_EQ(serviceProxy.mLastRequestedServiceNames.back(), testProviderInstanceName) <<
"Incorrect instance requested from service manager";
hardware::hidl_string sectionNameSecond = "SecondVendorTestSection";
@@ -273,7 +282,7 @@
hardware::hidl_string testProviderSecondInstanceName = "test2/0";
serviceProxy.mManagerNotificationInterface->onRegistration(
testProviderFqInterfaceName, testProviderSecondInstanceName, false);
- ASSERT_EQ(serviceProxy.mLastRequestedServiceName,
+ ASSERT_EQ(serviceProxy.mLastRequestedServiceNames.back(),
testProviderSecondInstanceName) <<
"Incorrect instance requested from service manager";