Buffer transfer and locking workarounds for EVS
These changes get EVS working for 3 frames with validated buffer contents
before HIDL reports a error on the 4th frame when running on Marlin. More
investigation is required to resolve the HIDL issue.
Test: Build and run againsgt evs_test
Change-Id: I5096e74aa897e690900620b77a47f79646b0f040
diff --git a/evs/1.0/default/EvsCamera.cpp b/evs/1.0/default/EvsCamera.cpp
index a539b23..df7e844 100644
--- a/evs/1.0/default/EvsCamera.cpp
+++ b/evs/1.0/default/EvsCamera.cpp
@@ -69,7 +69,8 @@
mHeight = (mDescription.defaultVerResolution) ? mDescription.defaultVerResolution : 480;
mFormat = HAL_PIXEL_FORMAT_RGBA_8888;
- mUsage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_CAMERA_WRITE;
+ mUsage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_CAMERA_WRITE |
+ GRALLOC_USAGE_SW_READ_RARELY | GRALLOC_USAGE_SW_WRITE_RARELY;
}
@@ -440,7 +441,7 @@
}
-void EvsCamera::fillTestFrame(BufferDesc buff) {
+void EvsCamera::fillTestFrame(const BufferDesc& buff) {
// Lock our output buffer for writing
uint32_t *pixels = nullptr;
GraphicBufferMapper &mapper = GraphicBufferMapper::get();
@@ -474,7 +475,8 @@
pixels[col] = expectedPixel;
}
// Point to the next row
- pixels = pixels + (buff.stride / sizeof(*pixels));
+ // NOTE: stride retrieved from gralloc is in units of pixels
+ pixels = pixels + buff.stride;
}
// Release our output buffer
diff --git a/evs/1.0/default/EvsCamera.h b/evs/1.0/default/EvsCamera.h
index 8d644a0..02a677c 100644
--- a/evs/1.0/default/EvsCamera.h
+++ b/evs/1.0/default/EvsCamera.h
@@ -58,7 +58,7 @@
unsigned decreaseAvailableFrames_Locked(unsigned numToRemove);
void generateFrames();
- void fillTestFrame(BufferDesc buff);
+ void fillTestFrame(const BufferDesc& buff);
CameraDesc mDescription = {}; // The properties of this camera
diff --git a/evs/1.0/default/EvsDisplay.cpp b/evs/1.0/default/EvsDisplay.cpp
index 7208395..bbfff35 100644
--- a/evs/1.0/default/EvsDisplay.cpp
+++ b/evs/1.0/default/EvsDisplay.cpp
@@ -169,7 +169,7 @@
mBuffer.memHandle = handle;
mFrameBusy = false;
ALOGD("Allocated new buffer %p with stride %u",
- mBuffer.memHandle.getNativeHandle(), mStride);
+ mBuffer.memHandle.getNativeHandle(), mBuffer.stride);
}
// Do we have a frame available?
@@ -263,7 +263,8 @@
continue;
}
// Walk across this row (we'll step rows below)
- if (pixels[col] != expectedPixel) {
+ uint32_t receivedPixel = pixels[col];
+ if (receivedPixel != expectedPixel) {
ALOGE("Pixel check mismatch in frame buffer");
frameLooksGood = false;
break;
@@ -274,8 +275,8 @@
break;
}
- // Point to the next row
- pixels = pixels + (mStride / sizeof(*pixels));
+ // Point to the next row (NOTE: gralloc reports stride in units of pixels)
+ pixels = pixels + mBuffer.stride;
}
// Ensure we don't see the same buffer twice without it being rewritten
diff --git a/evs/1.0/default/EvsDisplay.h b/evs/1.0/default/EvsDisplay.h
index 6e0111e..f4d7ee9 100644
--- a/evs/1.0/default/EvsDisplay.h
+++ b/evs/1.0/default/EvsDisplay.h
@@ -42,7 +42,6 @@
private:
DisplayDesc mInfo = {};
BufferDesc mBuffer = {}; // A graphics buffer into which we'll store images
- uint32_t mStride = 0; // Bytes per line in the buffer
bool mFrameBusy = false; // A flag telling us our buffer is in use
DisplayState mRequestedState = DisplayState::NOT_VISIBLE;