diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2018-04-04 09:41:36 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2018-04-04 09:41:36 +0000 |
commit | 10b7ccae68870fef5f30f3381970b4322abf6024 (patch) | |
tree | c1950f35fa1cc7e5c07ec870fe8934c251319286 /camera/device | |
parent | eac7714719a230194b8161cf8d3aa3af038bcde0 (diff) | |
parent | bc0e16519f6f0b98508720d11be34e871be7470f (diff) | |
download | android_hardware_interfaces-10b7ccae68870fef5f30f3381970b4322abf6024.tar.gz android_hardware_interfaces-10b7ccae68870fef5f30f3381970b4322abf6024.tar.bz2 android_hardware_interfaces-10b7ccae68870fef5f30f3381970b4322abf6024.zip |
Merge "Camera: Check external camera v4l2 buffer size" into pi-dev
Diffstat (limited to 'camera/device')
-rw-r--r-- | camera/device/3.4/default/ExternalCameraDeviceSession.cpp | 13 | ||||
-rw-r--r-- | camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraDeviceSession.h | 2 |
2 files changed, 15 insertions, 0 deletions
diff --git a/camera/device/3.4/default/ExternalCameraDeviceSession.cpp b/camera/device/3.4/default/ExternalCameraDeviceSession.cpp index 7015bcb44..2c03d81f2 100644 --- a/camera/device/3.4/default/ExternalCameraDeviceSession.cpp +++ b/camera/device/3.4/default/ExternalCameraDeviceSession.cpp @@ -2149,6 +2149,13 @@ int ExternalCameraDeviceSession::configureV4l2StreamLocked( } uint32_t bufferSize = fmt.fmt.pix.sizeimage; ALOGI("%s: V4L2 buffer size is %d", __FUNCTION__, bufferSize); + uint32_t expectedMaxBufferSize = kMaxBytesPerPixel * fmt.fmt.pix.width * fmt.fmt.pix.height; + if ((bufferSize == 0) || (bufferSize > expectedMaxBufferSize)) { + ALOGE("%s: V4L2 buffer size: %u looks invalid. Expected maximum size: %u", __FUNCTION__, + bufferSize, expectedMaxBufferSize); + return -EINVAL; + } + mMaxV4L2BufferSize = bufferSize; const double kDefaultFps = 30.0; double fps = 1000.0; @@ -2296,6 +2303,12 @@ sp<V4L2Frame> ExternalCameraDeviceSession::dequeueV4l2FrameLocked(/*out*/nsecs_t // TODO: try to dequeue again } + if (buffer.bytesused > mMaxV4L2BufferSize) { + ALOGE("%s: v4l2 buffer bytes used: %u maximum %u", __FUNCTION__, buffer.bytesused, + mMaxV4L2BufferSize); + return ret; + } + if (buffer.flags & V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC) { // Ideally we should also check for V4L2_BUF_FLAG_TSTAMP_SRC_SOE, but // even V4L2_BUF_FLAG_TSTAMP_SRC_EOF is better than capture a timestamp now diff --git a/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraDeviceSession.h b/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraDeviceSession.h index 53150970e..64134c566 100644 --- a/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraDeviceSession.h +++ b/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraDeviceSession.h @@ -108,6 +108,7 @@ struct ExternalCameraDeviceSession : public virtual RefBase { static const int kMaxProcessedStream = 2; static const int kMaxStallStream = 1; + static const uint32_t kMaxBytesPerPixel = 2; protected: @@ -319,6 +320,7 @@ protected: std::mutex mV4l2BufferLock; // protect the buffer count and condition below std::condition_variable mV4L2BufferReturned; size_t mNumDequeuedV4l2Buffers = 0; + uint32_t mMaxV4L2BufferSize = 0; // Not protected by mLock (but might be used when mLock is locked) sp<OutputThread> mOutputThread; |