OSDN Git Service

Camera2: Fix JPEG Transport Header offset
authorAlex Ray <aray@google.com>
Tue, 25 Sep 2012 19:37:14 +0000 (12:37 -0700)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Wed, 26 Sep 2012 18:11:43 +0000 (11:11 -0700)
Use offset into start of buffer after transport header

Bug: 7108816
Change-Id: I6f9778db313856eaeee31f6999e4e55678b09b26

services/camera/libcameraservice/camera2/JpegProcessor.cpp

index 27f0fd9..1fa56bd 100644 (file)
@@ -235,8 +235,11 @@ status_t JpegProcessor::processNewCapture(sp<Camera2Client> &client) {
     // Find size of JPEG image
     uint8_t *jpegStart; // points to start of buffer in imgBuffer.data
     size_t jpegSize = findJpegSize(imgBuffer.data, imgBuffer.width, &jpegStart);
+    if (jpegSize == 0) { // failed to find size, default to whole buffer
+        jpegStart = imgBuffer.data;
+        jpegSize = imgBuffer.width;
+    }
     size_t heapSize = mCaptureHeap->getSize();
-    if (jpegSize == 0) jpegSize = imgBuffer.width;
     if (jpegSize > heapSize) {
         ALOGW("%s: JPEG image is larger than expected, truncating "
                 "(got %d, expected at most %d bytes)",
@@ -247,7 +250,7 @@ status_t JpegProcessor::processNewCapture(sp<Camera2Client> &client) {
     // TODO: Optimize this to avoid memcopy
     sp<MemoryBase> captureBuffer = new MemoryBase(mCaptureHeap, 0, jpegSize);
     void* captureMemory = mCaptureHeap->getBase();
-    memcpy(captureMemory, imgBuffer.data, jpegSize);
+    memcpy(captureMemory, jpegStart, jpegSize);
 
     mCaptureConsumer->unlockBuffer(imgBuffer);
 
@@ -403,7 +406,8 @@ size_t JpegProcessor::findJpegSize(uint8_t* jpegBuffer,
         ALOGW("JPEG size %d too large, reducing to maxSize %d", size, maxSize);
         size = maxSize;
     }
-    ALOGV("Final JPEG size %d", size);
+    ALOGV("Final JPEG size %d, starting at %p", size, start);
+    *jpegStart = start;
     return size;
 }