#define ION_EXYNOS_FIMD_VIDEO_MASK (1 << 28)
#define ION_EXYNOS_MFC_OUTPUT_MASK (1 << 26)
#define ION_EXYNOS_MFC_INPUT_MASK (1 << 25)
+#define MB_1 (1024*1024)
/*****************************************************************************/
static int gralloc_alloc_rgb(int ionfd, int w, int h, int format, int usage,
unsigned int ion_flags, private_handle_t **hnd, int *stride)
{
- size_t size, bpr;
+ size_t size, bpr, alignment = 0;
int bpp = 0, vstride, fd, err;
unsigned int heap_mask = _select_heap(usage);
bpp = 2;
break;
case HAL_PIXEL_FORMAT_BLOB:
- bpp = 1;
+ *stride = w;
+ vstride = h;
+ size = w * h;
break;
default:
return -EINVAL;
}
- bpr = ALIGN(w*bpp, 16);
- vstride = ALIGN(h, 16);
- if (vstride == h)
- size = bpr * (vstride + 1);
- else
- size = bpr * vstride;
- *stride = bpr / bpp;
- size = ALIGN(size, PAGE_SIZE);
- if (usage & GRALLOC_USAGE_PROTECTED)
+ if (format != HAL_PIXEL_FORMAT_BLOB) {
+ bpr = ALIGN(w*bpp, 16);
+ vstride = ALIGN(h, 16);
+ if (vstride < h + 2)
+ size = bpr * (h + 2);
+ else
+ size = bpr * vstride;
+ *stride = bpr / bpp;
+ size = ALIGN(size, PAGE_SIZE);
+ }
+
+ if (usage & GRALLOC_USAGE_PROTECTED) {
+ alignment = MB_1;
ion_flags |= ION_EXYNOS_FIMD_VIDEO_MASK;
+ }
- err = ion_alloc_fd(ionfd, size, 0, heap_mask, ion_flags,
+ err = ion_alloc_fd(ionfd, size, alignment, heap_mask, ion_flags,
&fd);
*hnd = new private_handle_t(fd, size, usage, w, h, format, *stride,
vstride);
switch (format) {
case HAL_PIXEL_FORMAT_EXYNOS_YV12:
{
+ *stride = ALIGN(w, 32);
luma_vstride = ALIGN(h, 16);
luma_size = luma_vstride * *stride;
chroma_size = (luma_vstride / 2) * ALIGN(*stride / 2, 16);
if (err)
return err;
- err = grallocMap(module, hnd);
-
if (err != 0)
goto err;
private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle);
gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>(
dev->common.module);
+ if (hnd->base)
+ grallocUnmap(module, const_cast<private_handle_t*>(hnd));
- grallocUnmap(module, const_cast<private_handle_t*>(hnd));
close(hnd->fd);
if (hnd->fd1 >= 0)
close(hnd->fd1);