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);