From ea447a6e79264c19335ea8b6a13d8b88580c0188 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 23 Apr 2018 17:18:21 +0900 Subject: [PATCH] surface_internal: make _tbm_surface_internal_get_bpp function Change-Id: I544d4e2320cce6dd2667d1a5515276f4e3cede5f --- src/tbm_surface_internal.c | 211 ++++++++++++++++++++++++++------------------- 1 file changed, 124 insertions(+), 87 deletions(-) diff --git a/src/tbm_surface_internal.c b/src/tbm_surface_internal.c index ade66ef..bb70ff4 100644 --- a/src/tbm_surface_internal.c +++ b/src/tbm_surface_internal.c @@ -484,6 +484,100 @@ _tbm_surface_internal_get_num_planes(tbm_format format) return num_planes; } +static int +_tbm_surface_internal_get_bpp(tbm_format format) +{ + + int bpp = 0; + + switch (format) { + case TBM_FORMAT_C8: + case TBM_FORMAT_RGB332: + case TBM_FORMAT_BGR233: + bpp = 8; + break; + case TBM_FORMAT_XRGB4444: + case TBM_FORMAT_XBGR4444: + case TBM_FORMAT_RGBX4444: + case TBM_FORMAT_BGRX4444: + case TBM_FORMAT_ARGB4444: + case TBM_FORMAT_ABGR4444: + case TBM_FORMAT_RGBA4444: + case TBM_FORMAT_BGRA4444: + case TBM_FORMAT_XRGB1555: + case TBM_FORMAT_XBGR1555: + case TBM_FORMAT_RGBX5551: + case TBM_FORMAT_BGRX5551: + case TBM_FORMAT_ARGB1555: + case TBM_FORMAT_ABGR1555: + case TBM_FORMAT_RGBA5551: + case TBM_FORMAT_BGRA5551: + case TBM_FORMAT_RGB565: + case TBM_FORMAT_BGR565: + bpp = 16; + break; + case TBM_FORMAT_RGB888: + case TBM_FORMAT_BGR888: + bpp = 24; + break; + case TBM_FORMAT_XRGB8888: + case TBM_FORMAT_XBGR8888: + case TBM_FORMAT_RGBX8888: + case TBM_FORMAT_BGRX8888: + case TBM_FORMAT_ARGB8888: + case TBM_FORMAT_ABGR8888: + case TBM_FORMAT_RGBA8888: + case TBM_FORMAT_BGRA8888: + case TBM_FORMAT_XRGB2101010: + case TBM_FORMAT_XBGR2101010: + case TBM_FORMAT_RGBX1010102: + case TBM_FORMAT_BGRX1010102: + case TBM_FORMAT_ARGB2101010: + case TBM_FORMAT_ABGR2101010: + case TBM_FORMAT_RGBA1010102: + case TBM_FORMAT_BGRA1010102: + case TBM_FORMAT_YUYV: + case TBM_FORMAT_YVYU: + case TBM_FORMAT_UYVY: + case TBM_FORMAT_VYUY: + case TBM_FORMAT_AYUV: + bpp = 32; + break; + case TBM_FORMAT_NV12: + case TBM_FORMAT_NV12MT: + case TBM_FORMAT_NV21: + bpp = 12; + break; + case TBM_FORMAT_NV16: + case TBM_FORMAT_NV61: + bpp = 16; + break; + case TBM_FORMAT_YUV410: + case TBM_FORMAT_YVU410: + bpp = 9; + break; + case TBM_FORMAT_YUV411: + case TBM_FORMAT_YVU411: + case TBM_FORMAT_YUV420: + case TBM_FORMAT_YVU420: + bpp = 12; + break; + case TBM_FORMAT_YUV422: + case TBM_FORMAT_YVU422: + bpp = 16; + break; + case TBM_FORMAT_YUV444: + case TBM_FORMAT_YVU444: + bpp = 24; + break; + default: + _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER); + break; + } + + return bpp; +} + int tbm_surface_internal_is_valid(tbm_surface_h surface) { @@ -601,93 +695,20 @@ tbm_surface_internal_get_num_planes(tbm_format format) int tbm_surface_internal_get_bpp(tbm_format format) { - int bpp = 0; - switch (format) { - case TBM_FORMAT_C8: - case TBM_FORMAT_RGB332: - case TBM_FORMAT_BGR233: - bpp = 8; - break; - case TBM_FORMAT_XRGB4444: - case TBM_FORMAT_XBGR4444: - case TBM_FORMAT_RGBX4444: - case TBM_FORMAT_BGRX4444: - case TBM_FORMAT_ARGB4444: - case TBM_FORMAT_ABGR4444: - case TBM_FORMAT_RGBA4444: - case TBM_FORMAT_BGRA4444: - case TBM_FORMAT_XRGB1555: - case TBM_FORMAT_XBGR1555: - case TBM_FORMAT_RGBX5551: - case TBM_FORMAT_BGRX5551: - case TBM_FORMAT_ARGB1555: - case TBM_FORMAT_ABGR1555: - case TBM_FORMAT_RGBA5551: - case TBM_FORMAT_BGRA5551: - case TBM_FORMAT_RGB565: - case TBM_FORMAT_BGR565: - bpp = 16; - break; - case TBM_FORMAT_RGB888: - case TBM_FORMAT_BGR888: - bpp = 24; - break; - case TBM_FORMAT_XRGB8888: - case TBM_FORMAT_XBGR8888: - case TBM_FORMAT_RGBX8888: - case TBM_FORMAT_BGRX8888: - case TBM_FORMAT_ARGB8888: - case TBM_FORMAT_ABGR8888: - case TBM_FORMAT_RGBA8888: - case TBM_FORMAT_BGRA8888: - case TBM_FORMAT_XRGB2101010: - case TBM_FORMAT_XBGR2101010: - case TBM_FORMAT_RGBX1010102: - case TBM_FORMAT_BGRX1010102: - case TBM_FORMAT_ARGB2101010: - case TBM_FORMAT_ABGR2101010: - case TBM_FORMAT_RGBA1010102: - case TBM_FORMAT_BGRA1010102: - case TBM_FORMAT_YUYV: - case TBM_FORMAT_YVYU: - case TBM_FORMAT_UYVY: - case TBM_FORMAT_VYUY: - case TBM_FORMAT_AYUV: - bpp = 32; - break; - case TBM_FORMAT_NV12: - case TBM_FORMAT_NV12MT: - case TBM_FORMAT_NV21: - bpp = 12; - break; - case TBM_FORMAT_NV16: - case TBM_FORMAT_NV61: - bpp = 16; - break; - case TBM_FORMAT_YUV410: - case TBM_FORMAT_YVU410: - bpp = 9; - break; - case TBM_FORMAT_YUV411: - case TBM_FORMAT_YVU411: - case TBM_FORMAT_YUV420: - case TBM_FORMAT_YVU420: - bpp = 12; - break; - case TBM_FORMAT_YUV422: - case TBM_FORMAT_YVU422: - bpp = 16; - break; - case TBM_FORMAT_YUV444: - case TBM_FORMAT_YVU444: - bpp = 24; - break; - default: - break; + _tbm_surface_mutex_lock(); + _tbm_set_last_result(TBM_ERROR_NONE); + + bpp = _tbm_surface_internal_get_bpp(format); + if (!bpp) { + TBM_ERR("error: tbm_error(%s)\n", tbm_error_str(tbm_get_last_error())); + _tbm_surface_mutex_unlock(); + return 0; } + _tbm_surface_mutex_unlock(); + TBM_TRACE_SURFACE_INTERNAL("tbm_format(%s) bpp(%d)\n", _tbm_surface_internal_format_to_str(format), bpp); return bpp; @@ -740,7 +761,11 @@ tbm_surface_internal_create_with_flags(int width, int height, surf->info.width = width; surf->info.height = height; surf->info.format = format; - surf->info.bpp = tbm_surface_internal_get_bpp(format); + surf->info.bpp = _tbm_surface_internal_get_bpp(format); + if (!surf->info.bpp) { + TBM_ERR("fail to get bpp. error(%s)\n", tbm_error_str(tbm_get_last_error())); + goto bpp_fail; + } surf->info.num_planes = _tbm_surface_internal_get_num_planes(format); if (!surf->info.num_planes) { TBM_ERR("fail to get num_planes. error(%s)\n", tbm_error_str(tbm_get_last_error())); @@ -883,6 +908,7 @@ alloc_bo_fail: tbm_bo_unref(surf->bos[j]); } query_plane_data_fail: +bpp_fail: num_planes_fail: free(surf); alloc_surf_fail: @@ -944,8 +970,13 @@ tbm_surface_internal_create_with_bos(tbm_surface_info_s *info, surf->info.format = info->format; if (info->bpp > 0) surf->info.bpp = info->bpp; - else - surf->info.bpp = tbm_surface_internal_get_bpp(info->format); + else { + surf->info.bpp = _tbm_surface_internal_get_bpp(info->format); + if (!surf->info.bpp) { + TBM_ERR("fail to get bpp. error(%s)\n", tbm_error_str(tbm_get_last_error())); + goto bpp_fail; + } + } surf->info.num_planes = info->num_planes; surf->refcnt = 1; @@ -1006,6 +1037,7 @@ tbm_surface_internal_create_with_bos(tbm_surface_info_s *info, /* LCOV_EXCL_START */ check_bo_fail: +bpp_fail: for (i = 0; i < num; i++) { if (surf->bos[i]) tbm_bo_unref(surf->bos[i]); @@ -2136,7 +2168,12 @@ tbm_surface_internal_dump_buffer(tbm_surface_h surface, const char *type) buf_info->info.width = info.width * scale_factor; buf_info->info.height = info.height * scale_factor; buf_info->info.format = info.format; - buf_info->info.bpp = tbm_surface_internal_get_bpp(buf_info->info.format); + buf_info->info.bpp = _tbm_surface_internal_get_bpp(buf_info->info.format); + if (!buf_info->info.bpp) { + TBM_ERR("fail to get bpp. error(%s)\n", tbm_error_str(tbm_get_last_error())); + tbm_surface_unmap(surface); + return; + } buf_info->info.num_planes = 1; buf_info->info.planes[0].stride = buf_info->info.width * bpp; buf_info->info.size = buf_info->info.width * buf_info->info.height * bpp; -- 2.7.4