diff options
Diffstat (limited to 'camera/device/1.0/default/CameraDevice.cpp')
-rw-r--r-- | camera/device/1.0/default/CameraDevice.cpp | 55 |
1 files changed, 51 insertions, 4 deletions
diff --git a/camera/device/1.0/default/CameraDevice.cpp b/camera/device/1.0/default/CameraDevice.cpp index 819525be1e..5e3fcf2b79 100644 --- a/camera/device/1.0/default/CameraDevice.cpp +++ b/camera/device/1.0/default/CameraDevice.cpp @@ -20,6 +20,8 @@ #include <hardware/gralloc1.h> #include <utils/Trace.h> +#include <grallocusage/GrallocUsageConversion.h> + #include "CameraDevice_1_0.h" namespace android { @@ -29,7 +31,6 @@ namespace device { namespace V1_0 { namespace implementation { -using ::android::hardware::graphics::allocator::V2_0::ProducerUsage; using ::android::hardware::graphics::common::V1_0::PixelFormat; HandleImporter& CameraDevice::sHandleImporter = HandleImporter::getInstance(); @@ -252,7 +253,10 @@ int CameraDevice::sSetUsage(struct preview_stream_ops* w, int usage) { } object->cleanUpCirculatingBuffers(); - return getStatusT(object->mPreviewCallback->setUsage((ProducerUsage) usage)); + ProducerUsageFlags producerUsage; + uint64_t consumerUsage; + ::android_convertGralloc0To1Usage(usage, &producerUsage, &consumerUsage); + return getStatusT(object->mPreviewCallback->setUsage(producerUsage)); } int CameraDevice::sSetSwapInterval(struct preview_stream_ops *w, int interval) { @@ -420,6 +424,39 @@ void CameraDevice::sDataCb(int32_t msg_type, const camera_memory_t *data, unsign } } +void CameraDevice::handleCallbackTimestamp( + nsecs_t timestamp, int32_t msg_type, + MemoryId memId , unsigned index, native_handle_t* handle) { + uint32_t batchSize = 0; + { + Mutex::Autolock _l(mBatchLock); + batchSize = mBatchSize; + } + + if (batchSize == 0) { // non-batch mode + mDeviceCallback->handleCallbackTimestamp( + (DataCallbackMsg) msg_type, handle, memId, index, timestamp); + } else { // batch mode + Mutex::Autolock _l(mBatchLock); + size_t inflightSize = mInflightBatch.size(); + if (inflightSize == 0) { + mBatchMsgType = msg_type; + } else if (mBatchMsgType != msg_type) { + ALOGE("%s: msg_type change (from %d to %d) is not supported!", + __FUNCTION__, mBatchMsgType, msg_type); + return; + } + mInflightBatch.push_back({handle, memId, index, timestamp}); + + // Send batched frames to camera framework + if (mInflightBatch.size() >= batchSize) { + mDeviceCallback->handleCallbackTimestampBatch( + (DataCallbackMsg) mBatchMsgType, mInflightBatch); + mInflightBatch.clear(); + } + } +} + void CameraDevice::sDataCbTimestamp(nsecs_t timestamp, int32_t msg_type, const camera_memory_t *data, unsigned index, void *user) { ALOGV("%s", __FUNCTION__); @@ -450,8 +487,7 @@ void CameraDevice::sDataCbTimestamp(nsecs_t timestamp, int32_t msg_type, object->mDeviceCallback->dataCallbackTimestamp( (DataCallbackMsg) msg_type, mem->handle.mId, index, timestamp); } else { - object->mDeviceCallback->handleCallbackTimestamp( - (DataCallbackMsg) msg_type, handle, mem->handle.mId, index, timestamp); + object->handleCallbackTimestamp(timestamp, msg_type, mem->handle.mId, index, handle); } } } @@ -827,6 +863,17 @@ Return<void> CameraDevice::releaseRecordingFrameHandle( return Void(); } +Return<void> CameraDevice::releaseRecordingFrameHandleBatch( + const hidl_vec<VideoFrameMessage>& msgs) { + ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); + Mutex::Autolock _l(mLock); + for (auto& msg : msgs) { + releaseRecordingFrameLocked( + msg.data, msg.bufferIndex, msg.frameData.getNativeHandle()); + } + return Void(); +} + Return<Status> CameraDevice::autoFocus() { ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); Mutex::Autolock _l(mLock); |