gralloc: Support camera and video encoder flags
- Set private flags for these formats so that the camera HAL
can differentiate between the allocated buffers.
- Usage flags define format
Change-Id: Ib3cfad12ab2ba79662207609138633769b1504e6
diff --git a/libgralloc/gpu.cpp b/libgralloc/gpu.cpp
index 2db6274..6759b55 100644
--- a/libgralloc/gpu.cpp
+++ b/libgralloc/gpu.cpp
@@ -152,6 +152,18 @@
}
}
+ if (usage & GRALLOC_USAGE_HW_VIDEO_ENCODER ) {
+ flags |= private_handle_t::PRIV_FLAGS_VIDEO_ENCODER;
+ }
+
+ if (usage & GRALLOC_USAGE_HW_CAMERA_WRITE) {
+ flags |= private_handle_t::PRIV_FLAGS_CAMERA_WRITE;
+ }
+
+ if (usage & GRALLOC_USAGE_HW_CAMERA_READ) {
+ flags |= private_handle_t::PRIV_FLAGS_CAMERA_READ;
+ }
+
if (err == 0) {
flags |= data.allocType;
private_handle_t* hnd = new private_handle_t(data.fd, size, flags,
@@ -168,19 +180,15 @@
}
void gpu_context_t::getGrallocInformationFromFormat(int inputFormat,
- int *colorFormat,
int *bufferType)
{
*bufferType = BUFFER_TYPE_VIDEO;
- *colorFormat = inputFormat;
if (inputFormat < 0x7) {
// RGB formats
- *colorFormat = inputFormat;
*bufferType = BUFFER_TYPE_UI;
} else if ((inputFormat == HAL_PIXEL_FORMAT_R_8) ||
(inputFormat == HAL_PIXEL_FORMAT_RG_88)) {
- *colorFormat = inputFormat;
*bufferType = BUFFER_TYPE_UI;
}
}
@@ -193,9 +201,20 @@
size_t size;
int alignedw, alignedh;
- int colorFormat, bufferType;
- getGrallocInformationFromFormat(format, &colorFormat, &bufferType);
- size = getBufferSizeAndDimensions(w, h, colorFormat, alignedw, alignedh);
+ int grallocFormat = format;
+ int bufferType;
+ getGrallocInformationFromFormat(format, &bufferType);
+
+ //XXX: This should only be done if format is
+ // HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED
+ if(usage & GRALLOC_USAGE_HW_VIDEO_ENCODER)
+ grallocFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP; //NV12
+ if(usage & GRALLOC_USAGE_HW_CAMERA_READ)
+ grallocFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; //NV21
+ if(usage & GRALLOC_USAGE_HW_CAMERA_WRITE)
+ grallocFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; //NV21
+
+ size = getBufferSizeAndDimensions(w, h, grallocFormat, alignedw, alignedh);
if ((ssize_t)size <= 0)
return -EINVAL;
@@ -213,7 +232,7 @@
err = gralloc_alloc_framebuffer(size, usage, pHandle);
} else {
err = gralloc_alloc_buffer(size, usage, pHandle, bufferType,
- format, alignedw, alignedh);
+ grallocFormat, alignedw, alignedh);
}
if (err < 0) {