Merge "Reset Init Check to NO_INIT after destroy in CryptoHal implementation" into tm-dev
diff --git a/camera/CameraSessionStats.cpp b/camera/CameraSessionStats.cpp
index 8088d06..d1aa36a 100644
--- a/camera/CameraSessionStats.cpp
+++ b/camera/CameraSessionStats.cpp
@@ -264,7 +264,8 @@
mInternalReconfigure(0),
mRequestCount(0),
mResultErrorCount(0),
- mDeviceError(false) {}
+ mDeviceError(false),
+ mVideoStabilizationMode(-1) {}
CameraSessionStats::CameraSessionStats(const String16& cameraId,
int facing, int newCameraState, const String16& clientName,
@@ -281,7 +282,8 @@
mInternalReconfigure(0),
mRequestCount(0),
mResultErrorCount(0),
- mDeviceError(0) {}
+ mDeviceError(0),
+ mVideoStabilizationMode(-1) {}
status_t CameraSessionStats::readFromParcel(const android::Parcel* parcel) {
if (parcel == NULL) {
@@ -381,6 +383,12 @@
return BAD_VALUE;
}
+ int32_t videoStabilizationMode;
+ if ((err = parcel->readInt32(&videoStabilizationMode)) != OK) {
+ ALOGE("%s: Failed to read video stabilization mode from parcel", __FUNCTION__);
+ return err;
+ }
+
mCameraId = id;
mFacing = facing;
mNewCameraState = newCameraState;
@@ -396,6 +404,7 @@
mDeviceError = deviceError;
mStreamStats = std::move(streamStats);
mUserTag = userTag;
+ mVideoStabilizationMode = videoStabilizationMode;
return OK;
}
@@ -482,6 +491,11 @@
ALOGE("%s: Failed to write user tag!", __FUNCTION__);
return err;
}
+
+ if ((err = parcel->writeInt32(mVideoStabilizationMode)) != OK) {
+ ALOGE("%s: Failed to write video stabilization mode!", __FUNCTION__);
+ return err;
+ }
return OK;
}
diff --git a/camera/include/camera/CameraSessionStats.h b/camera/include/camera/CameraSessionStats.h
index e1ec6cf..aaa88b2 100644
--- a/camera/include/camera/CameraSessionStats.h
+++ b/camera/include/camera/CameraSessionStats.h
@@ -137,6 +137,7 @@
bool mDeviceError;
std::vector<CameraStreamStats> mStreamStats;
String16 mUserTag;
+ int mVideoStabilizationMode;
// Constructors
CameraSessionStats();
diff --git a/media/codec2/core/include/C2Config.h b/media/codec2/core/include/C2Config.h
index 70e742c..07c2864 100644
--- a/media/codec2/core/include/C2Config.h
+++ b/media/codec2/core/include/C2Config.h
@@ -277,6 +277,9 @@
// encoding statistics, average block qp of a frame
kParamIndexAverageBlockQuantization, // int32
+
+ // channel mask for decoded audio
+ kParamIndexAndroidChannelMask, // uint32
};
}
@@ -1981,6 +1984,14 @@
constexpr char C2_PARAMKEY_MAX_CODED_CHANNEL_COUNT[] = "coded.max-channel-count";
/**
+ * Audio channel mask. Used by decoder to express audio channel mask of decoded content.
+ * Channel representation is specified according to the Java android.media.AudioFormat
+ * CHANNEL_OUT_* constants.
+ */
+ typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexAndroidChannelMask> C2StreamChannelMaskInfo;
+ const char C2_PARAMKEY_CHANNEL_MASK[] = "raw.channel-mask";
+
+/**
* Audio sample format (PCM encoding)
*/
C2ENUM(C2Config::pcm_encoding_t, uint32_t,
diff --git a/media/codec2/sfplugin/CCodecConfig.cpp b/media/codec2/sfplugin/CCodecConfig.cpp
index f3fb5ff..87fa917 100644
--- a/media/codec2/sfplugin/CCodecConfig.cpp
+++ b/media/codec2/sfplugin/CCodecConfig.cpp
@@ -905,6 +905,9 @@
add(ConfigMapper(KEY_MAX_OUTPUT_CHANNEL_COUNT, C2_PARAMKEY_MAX_CHANNEL_COUNT, "value")
.limitTo(D::AUDIO & (D::CONFIG | D::PARAM | D::READ)));
+ add(ConfigMapper(KEY_CHANNEL_MASK, C2_PARAMKEY_CHANNEL_MASK, "value")
+ .limitTo(D::AUDIO & D::DECODER & D::READ));
+
add(ConfigMapper(KEY_AAC_SBR_MODE, C2_PARAMKEY_AAC_SBR_MODE, "value")
.limitTo(D::AUDIO & D::ENCODER & (D::CONFIG | D::PARAM | D::READ))
.withMapper([](C2Value v) -> C2Value {
diff --git a/media/utils/TimeCheck.cpp b/media/utils/TimeCheck.cpp
index 75a1b22..0848eb3 100644
--- a/media/utils/TimeCheck.cpp
+++ b/media/utils/TimeCheck.cpp
@@ -189,15 +189,18 @@
// Generate audio HAL processes tombstones and allow time to complete
// before forcing restart
std::vector<pid_t> pids = TimeCheck::getAudioHalPids();
+ std::string halPids = "HAL pids [ ";
if (pids.size() != 0) {
for (const auto& pid : pids) {
ALOGI("requesting tombstone for pid: %d", pid);
+ halPids.append(std::to_string(pid)).append(" ");
sigqueue(pid, DEBUGGER_SIGNAL, {.sival_int = 0});
}
sleep(1);
} else {
ALOGI("No HAL process pid available, skipping tombstones");
}
+ halPids.append("]");
LOG_EVENT_STRING(LOGTAG_AUDIO_BINDER_TIMEOUT, tag.c_str());
@@ -206,6 +209,7 @@
.append(tag)
.append(" scheduled ").append(formatTime(startTime))
.append(" on thread ").append(std::to_string(tid)).append("\n")
+ .append(halPids).append("\n")
.append(summary);
// Note: LOG_ALWAYS_FATAL limits the size of the string - per log/log.h:
diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
index 5db3fa6..6c6ddbd 100644
--- a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
+++ b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
@@ -519,9 +519,16 @@
metadataRequestList.push_back(physicalSettingsList);
surfaceMapList.push_back(surfaceMap);
+ // Save certain CaptureRequest settings
if (!request.mUserTag.empty()) {
mUserTag = request.mUserTag;
}
+ camera_metadata_entry entry =
+ physicalSettingsList.begin()->metadata.find(
+ ANDROID_CONTROL_VIDEO_STABILIZATION_MODE);
+ if (entry.count == 1) {
+ mVideoStabilizationMode = entry.data.u8[0];
+ }
}
mRequestIdCounter++;
@@ -1971,7 +1978,7 @@
remoteCb->onDeviceIdle();
}
Camera2ClientBase::notifyIdleWithUserTag(requestCount, resultErrorCount, deviceError,
- streamStats, mUserTag);
+ streamStats, mUserTag, mVideoStabilizationMode);
}
void CameraDeviceClient::notifyShutter(const CaptureResultExtras& resultExtras,
diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.h b/services/camera/libcameraservice/api2/CameraDeviceClient.h
index 3af0b80..c5aad6b 100644
--- a/services/camera/libcameraservice/api2/CameraDeviceClient.h
+++ b/services/camera/libcameraservice/api2/CameraDeviceClient.h
@@ -352,6 +352,8 @@
// The string representation of object passed into CaptureRequest.setTag.
std::string mUserTag;
+ // The last set video stabilization mode
+ int mVideoStabilizationMode = -1;
};
}; // namespace android
diff --git a/services/camera/libcameraservice/common/Camera2ClientBase.cpp b/services/camera/libcameraservice/common/Camera2ClientBase.cpp
index a7097fb..49a9760 100644
--- a/services/camera/libcameraservice/common/Camera2ClientBase.cpp
+++ b/services/camera/libcameraservice/common/Camera2ClientBase.cpp
@@ -338,7 +338,7 @@
void Camera2ClientBase<TClientBase>::notifyIdleWithUserTag(
int64_t requestCount, int64_t resultErrorCount, bool deviceError,
const std::vector<hardware::CameraStreamStats>& streamStats,
- const std::string& userTag) {
+ const std::string& userTag, int videoStabilizationMode) {
if (mDeviceActive) {
status_t res = TClientBase::finishCameraStreamingOps();
if (res != OK) {
@@ -346,7 +346,8 @@
TClientBase::mCameraIdStr.string(), res);
}
CameraServiceProxyWrapper::logIdle(TClientBase::mCameraIdStr,
- requestCount, resultErrorCount, deviceError, userTag, streamStats);
+ requestCount, resultErrorCount, deviceError, userTag, videoStabilizationMode,
+ streamStats);
}
mDeviceActive = false;
diff --git a/services/camera/libcameraservice/common/Camera2ClientBase.h b/services/camera/libcameraservice/common/Camera2ClientBase.h
index 9cba2f1..ec33f46 100644
--- a/services/camera/libcameraservice/common/Camera2ClientBase.h
+++ b/services/camera/libcameraservice/common/Camera2ClientBase.h
@@ -91,7 +91,7 @@
void notifyIdleWithUserTag(int64_t requestCount, int64_t resultErrorCount,
bool deviceError,
const std::vector<hardware::CameraStreamStats>& streamStats,
- const std::string& userTag);
+ const std::string& userTag, int videoStabilizationMode);
int getCameraId() const;
const sp<CameraDeviceBase>&
diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
index 1ce7108..4a9b259 100644
--- a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
+++ b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
@@ -689,7 +689,7 @@
mSyncToDisplay = true;
mTotalBufferCount += kDisplaySyncExtraBuffer;
} else if (defaultToSpacer) {
- mPreviewFrameSpacer = new PreviewFrameSpacer(*this, mConsumer);
+ mPreviewFrameSpacer = new PreviewFrameSpacer(this, mConsumer);
mTotalBufferCount ++;
res = mPreviewFrameSpacer->run(String8::format("PreviewSpacer-%d", mId).string());
if (res != OK) {
@@ -970,6 +970,10 @@
returnPrefetchedBuffersLocked();
+ if (mPreviewFrameSpacer != nullptr) {
+ mPreviewFrameSpacer->requestExit();
+ }
+
ALOGV("%s: disconnecting stream %d from native window", __FUNCTION__, getId());
res = native_window_api_disconnect(mConsumer.get(),
diff --git a/services/camera/libcameraservice/device3/PreviewFrameSpacer.cpp b/services/camera/libcameraservice/device3/PreviewFrameSpacer.cpp
index 496580f..0439501 100644
--- a/services/camera/libcameraservice/device3/PreviewFrameSpacer.cpp
+++ b/services/camera/libcameraservice/device3/PreviewFrameSpacer.cpp
@@ -27,13 +27,12 @@
namespace camera3 {
-PreviewFrameSpacer::PreviewFrameSpacer(Camera3OutputStream& parent, sp<Surface> consumer) :
+PreviewFrameSpacer::PreviewFrameSpacer(wp<Camera3OutputStream> parent, sp<Surface> consumer) :
mParent(parent),
mConsumer(consumer) {
}
PreviewFrameSpacer::~PreviewFrameSpacer() {
- Thread::requestExitAndWait();
}
status_t PreviewFrameSpacer::queuePreviewBuffer(nsecs_t timestamp, nsecs_t readoutTimestamp,
@@ -51,7 +50,11 @@
Mutex::Autolock l(mLock);
if (mPendingBuffers.size() == 0) {
mBufferCond.waitRelative(mLock, kWaitDuration);
- return true;
+ if (exitPending()) {
+ return false;
+ } else {
+ return true;
+ }
}
nsecs_t currentTime = systemTime();
@@ -71,7 +74,7 @@
if (frameWaitTime > 0 && mPendingBuffers.size() < 2) {
mBufferCond.waitRelative(mLock, frameWaitTime);
if (exitPending()) {
- return true;
+ return false;
}
currentTime = systemTime();
}
@@ -92,7 +95,13 @@
void PreviewFrameSpacer::queueBufferToClientLocked(
const BufferHolder& bufferHolder, nsecs_t currentTime) {
- mParent.setTransform(bufferHolder.transform, true/*mayChangeMirror*/);
+ sp<Camera3OutputStream> parent = mParent.promote();
+ if (parent == nullptr) {
+ ALOGV("%s: Parent camera3 output stream was destroyed", __FUNCTION__);
+ return;
+ }
+
+ parent->setTransform(bufferHolder.transform, true/*mayChangeMirror*/);
status_t res = native_window_set_buffers_timestamp(mConsumer.get(), bufferHolder.timestamp);
if (res != OK) {
@@ -101,13 +110,13 @@
}
Camera3Stream::queueHDRMetadata(bufferHolder.anwBuffer.get()->handle, mConsumer,
- mParent.getDynamicRangeProfile());
+ parent->getDynamicRangeProfile());
res = mConsumer->queueBuffer(mConsumer.get(), bufferHolder.anwBuffer.get(),
bufferHolder.releaseFence);
if (res != OK) {
close(bufferHolder.releaseFence);
- if (mParent.shouldLogError(res)) {
+ if (parent->shouldLogError(res)) {
ALOGE("%s: Failed to queue buffer to client: %s(%d)", __FUNCTION__,
strerror(-res), res);
}
diff --git a/services/camera/libcameraservice/device3/PreviewFrameSpacer.h b/services/camera/libcameraservice/device3/PreviewFrameSpacer.h
index fb0a563..e165768 100644
--- a/services/camera/libcameraservice/device3/PreviewFrameSpacer.h
+++ b/services/camera/libcameraservice/device3/PreviewFrameSpacer.h
@@ -49,7 +49,7 @@
*/
class PreviewFrameSpacer : public Thread {
public:
- explicit PreviewFrameSpacer(Camera3OutputStream& parent, sp<Surface> consumer);
+ explicit PreviewFrameSpacer(wp<Camera3OutputStream> parent, sp<Surface> consumer);
virtual ~PreviewFrameSpacer();
// Queue preview buffer locally
@@ -75,8 +75,7 @@
void queueBufferToClientLocked(const BufferHolder& bufferHolder, nsecs_t currentTime);
-
- Camera3OutputStream& mParent;
+ wp<Camera3OutputStream> mParent;
sp<ANativeWindow> mConsumer;
mutable Mutex mLock;
Condition mBufferCond;
diff --git a/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.cpp b/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.cpp
index f7cede8..69175cc 100644
--- a/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.cpp
+++ b/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.cpp
@@ -80,7 +80,7 @@
void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onIdle(
int64_t requestCount, int64_t resultErrorCount, bool deviceError,
- const std::string& userTag,
+ const std::string& userTag, int32_t videoStabilizationMode,
const std::vector<hardware::CameraStreamStats>& streamStats) {
Mutex::Autolock l(mLock);
@@ -89,6 +89,7 @@
mSessionStats.mResultErrorCount = resultErrorCount;
mSessionStats.mDeviceError = deviceError;
mSessionStats.mUserTag = String16(userTag.c_str());
+ mSessionStats.mVideoStabilizationMode = videoStabilizationMode;
mSessionStats.mStreamStats = streamStats;
updateProxyDeviceState(mSessionStats);
@@ -179,7 +180,7 @@
void CameraServiceProxyWrapper::logIdle(const String8& id,
int64_t requestCount, int64_t resultErrorCount, bool deviceError,
- const std::string& userTag,
+ const std::string& userTag, int32_t videoStabilizationMode,
const std::vector<hardware::CameraStreamStats>& streamStats) {
std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
{
@@ -194,8 +195,8 @@
}
ALOGV("%s: id %s, requestCount %" PRId64 ", resultErrorCount %" PRId64 ", deviceError %d"
- ", userTag %s", __FUNCTION__, id.c_str(), requestCount, resultErrorCount,
- deviceError, userTag.c_str());
+ ", userTag %s, videoStabilizationMode %d", __FUNCTION__, id.c_str(), requestCount,
+ resultErrorCount, deviceError, userTag.c_str(), videoStabilizationMode);
for (size_t i = 0; i < streamStats.size(); i++) {
ALOGV("%s: streamStats[%zu]: w %d h %d, requestedCount %" PRId64 ", dropCount %"
PRId64 ", startTimeMs %d" ,
@@ -204,7 +205,8 @@
streamStats[i].mStartLatencyMs);
}
- sessionStats->onIdle(requestCount, resultErrorCount, deviceError, userTag, streamStats);
+ sessionStats->onIdle(requestCount, resultErrorCount, deviceError, userTag,
+ videoStabilizationMode, streamStats);
}
void CameraServiceProxyWrapper::logOpen(const String8& id, int facing,
diff --git a/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.h b/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.h
index 61fc915..e34a8f0 100644
--- a/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.h
+++ b/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.h
@@ -50,7 +50,7 @@
void onStreamConfigured(int operatingMode, bool internalReconfig, int32_t latencyMs);
void onActive(float maxPreviewFps);
void onIdle(int64_t requestCount, int64_t resultErrorCount, bool deviceError,
- const std::string& userTag,
+ const std::string& userTag, int32_t videoStabilizationMode,
const std::vector<hardware::CameraStreamStats>& streamStats);
};
@@ -87,7 +87,7 @@
// Session state becomes idle
static void logIdle(const String8& id,
int64_t requestCount, int64_t resultErrorCount, bool deviceError,
- const std::string& userTag,
+ const std::string& userTag, int32_t videoStabilizationMode,
const std::vector<hardware::CameraStreamStats>& streamStats);
// Ping camera service proxy for user update
diff --git a/services/camera/libcameraservice/utils/SessionConfigurationUtils.cpp b/services/camera/libcameraservice/utils/SessionConfigurationUtils.cpp
index 9f8f457..d5ddf9f 100644
--- a/services/camera/libcameraservice/utils/SessionConfigurationUtils.cpp
+++ b/services/camera/libcameraservice/utils/SessionConfigurationUtils.cpp
@@ -620,6 +620,10 @@
stream.bufferSize = 0;
stream.groupId = -1;
stream.sensorPixelModesUsed = defaultSensorPixelModes;
+ using DynamicRangeProfile =
+ aidl::android::hardware::camera::metadata::RequestAvailableDynamicRangeProfilesMap;
+ stream.dynamicRangeProfile =
+ DynamicRangeProfile::ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD;
streamConfiguration.streams[streamIdx++] = stream;
streamConfiguration.multiResolutionInputImage =
sessionConfiguration.inputIsMultiResolution();