OSDN Git Service

Camera2Api: Creating a JPEG stream needs to use the right size
authorEino-Ville Talvala <etalvala@google.com>
Mon, 1 Jul 2013 16:23:55 +0000 (09:23 -0700)
committerEino-Ville Talvala <etalvala@google.com>
Mon, 1 Jul 2013 16:25:10 +0000 (09:25 -0700)
JPEG streams have variable size, so use the HAL-provided max size
to size the stream buffers.

Change-Id: Ie6900bc9ece6e972eae93fca6aca779224c9bfc6

services/camera/libcameraservice/photography/CameraDeviceClient.cpp

index 3209a56..bd6b60a 100644 (file)
@@ -337,8 +337,23 @@ status_t CameraDeviceClient::createStream(int width, int height, int format,
     // after each call, but only once we are done with all.
 
     int streamId = -1;
-    res = mDevice->createStream(anw, width, height, format, /*size*/1,
-                                &streamId);
+    if (format == HAL_PIXEL_FORMAT_BLOB) {
+        // JPEG buffers need to be sized for maximum possible compressed size
+        CameraMetadata staticInfo = mDevice->info();
+        camera_metadata_entry_t entry = staticInfo.find(ANDROID_JPEG_MAX_SIZE);
+        if (entry.count == 0) {
+            ALOGE("%s: Camera %d: Can't find maximum JPEG size in "
+                    "static metadata!", __FUNCTION__, mCameraId);
+            return INVALID_OPERATION;
+        }
+        int32_t maxJpegSize = entry.data.i32[0];
+        res = mDevice->createStream(anw, width, height, format, maxJpegSize,
+                &streamId);
+    } else {
+        // All other streams are a known size
+        res = mDevice->createStream(anw, width, height, format, /*size*/0,
+                &streamId);
+    }
 
     if (res == OK) {
         mStreamMap.add(bufferProducer->asBinder(), streamId);