Camera3: Calculate end of Jpeg buffer according to spec
Actual buffer size may be different due to padding, f/w
expects end of buffer address based on size calculated
as per spec, change made to align with f/w
Bug: 14320895
Change-Id: Ie29178c8c979b8ab3f59e4606724d321d2ebe191
diff --git a/camera/QCamera2/HAL3/QCamera3Channel.cpp b/camera/QCamera2/HAL3/QCamera3Channel.cpp
index 91d2740..22e75b3 100644
--- a/camera/QCamera2/HAL3/QCamera3Channel.cpp
+++ b/camera/QCamera2/HAL3/QCamera3Channel.cpp
@@ -981,7 +981,7 @@
mm_jpeg_output_t *p_output,
void *userdata)
{
- buffer_handle_t *resultBuffer;
+ buffer_handle_t *resultBuffer, *jpegBufferHandle;
int32_t resultFrameNumber;
int resultStatus = CAMERA3_BUFFER_STATUS_OK;
camera3_stream_buffer_t result;
@@ -1017,8 +1017,19 @@
char* jpeg_buf = (char *)p_output->buf_vaddr;
- // Gralloc provides a proper sized (no padding) buffer already.
- maxJpegSize = obj->mMemory.getSize(obj->mCurrentBufIndex);
+ // Gralloc buffer may have additional padding for 4K page size
+ // Follow size guidelines based on spec since framework relies
+ // on that to reach end of buffer and with it the header
+
+ //Handle same as resultBuffer, but for readablity
+ jpegBufferHandle =
+ (buffer_handle_t *)obj->mMemory.getBufferHandle(obj->mCurrentBufIndex);
+
+ maxJpegSize = ((private_handle_t*)(*jpegBufferHandle))->width;
+ if (maxJpegSize > obj->mMemory.getSize(obj->mCurrentBufIndex)) {
+ maxJpegSize = obj->mMemory.getSize(obj->mCurrentBufIndex);
+ }
+
jpeg_eof = &jpeg_buf[maxJpegSize-sizeof(jpegHeader)];
memcpy(jpeg_eof, &jpegHeader, sizeof(jpegHeader));
obj->mMemory.cleanInvalidateCache(obj->mCurrentBufIndex);