External: Switch to legacy V4L2 buffer mapping
Required for older kernels like 3.x
Change-Id: I0680320b606727bdb0b22dab1df8c5954d623f10
diff --git a/camera/device/3.4/default/ExternalCameraDeviceSession.cpp b/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
index e8982e5..51bfe36 100644
--- a/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
+++ b/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
@@ -611,7 +611,12 @@
}
}
}
- mCallback->processCaptureResult(results);
+ auto status = mCallback->processCaptureResult(results);
+ if (!status.isOk()) {
+ ALOGE("%s: processCaptureResult ERROR : %s", __FUNCTION__,
+ status.description().c_str());
+ }
+
mProcessCaptureResultLock.unlock();
}
@@ -1835,7 +1840,7 @@
return -1;
}
}
- mV4l2Buffers.clear(); // VIDIOC_REQBUFS will fail if FDs are not clear first
+ mV4L2BufferCount = 0;
// VIDIOC_STREAMOFF
v4l2_buf_type capture_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
@@ -1955,24 +1960,20 @@
return NO_MEMORY;
}
- // VIDIOC_EXPBUF: export buffers as FD
+ // VIDIOC_QUERYBUF: get buffer offset in the V4L2 fd
// VIDIOC_QBUF: send buffer to driver
- mV4l2Buffers.resize(req_buffers.count);
+ mV4L2BufferCount = req_buffers.count;
for (uint32_t i = 0; i < req_buffers.count; i++) {
- v4l2_exportbuffer expbuf {};
- expbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- expbuf.index = i;
- if (TEMP_FAILURE_RETRY(ioctl(mV4l2Fd.get(), VIDIOC_EXPBUF, &expbuf)) < 0) {
- ALOGE("%s: EXPBUF %d failed: %s", __FUNCTION__, i, strerror(errno));
- return -errno;
- }
- mV4l2Buffers[i].reset(expbuf.fd);
-
v4l2_buffer buffer = {
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
.index = i,
.memory = V4L2_MEMORY_MMAP};
+ if (TEMP_FAILURE_RETRY(ioctl(mV4l2Fd.get(), VIDIOC_QUERYBUF, &buffer)) < 0) {
+ ALOGE("%s: QUERYBUF %d failed: %s", __FUNCTION__, i, strerror(errno));
+ return -errno;
+ }
+
if (TEMP_FAILURE_RETRY(ioctl(mV4l2Fd.get(), VIDIOC_QBUF, &buffer)) < 0) {
ALOGE("%s: QBUF %d failed: %s", __FUNCTION__, i, strerror(errno));
return -errno;
@@ -2012,7 +2013,7 @@
{
std::unique_lock<std::mutex> lk(mV4l2BufferLock);
- if (mNumDequeuedV4l2Buffers == mV4l2Buffers.size()) {
+ if (mNumDequeuedV4l2Buffers == mV4L2BufferCount) {
std::chrono::seconds timeout = std::chrono::seconds(kBufferWaitTimeoutSec);
mLock.unlock();
auto st = mV4L2BufferReturned.wait_for(lk, timeout);
@@ -2032,7 +2033,7 @@
return ret;
}
- if (buffer.index >= mV4l2Buffers.size()) {
+ if (buffer.index >= mV4L2BufferCount) {
ALOGE("%s: Invalid buffer id: %d", __FUNCTION__, buffer.index);
return ret;
}
@@ -2048,7 +2049,7 @@
}
return new V4L2Frame(
mV4l2StreamingFmt.width, mV4l2StreamingFmt.height, mV4l2StreamingFmt.fourcc,
- buffer.index, mV4l2Buffers[buffer.index].get(), buffer.bytesused);
+ buffer.index, mV4l2Fd.get(), buffer.bytesused, buffer.m.offset);
}
void ExternalCameraDeviceSession::enqueueV4l2Frame(const sp<V4L2Frame>& frame) {
@@ -2243,7 +2244,7 @@
BufferUsage::CPU_WRITE_OFTEN |
BufferUsage::CAMERA_OUTPUT;
out->streams[i].v3_2.consumerUsage = 0;
- out->streams[i].v3_2.maxBuffers = mV4l2Buffers.size();
+ out->streams[i].v3_2.maxBuffers = mV4L2BufferCount;
switch (config.streams[i].format) {
case PixelFormat::BLOB: