From: Jeongmo Yang Date: Tue, 18 Jan 2022 12:23:42 +0000 (+0900) Subject: Add sub function to create tbm surface X-Git-Tag: accepted/tizen/unified/20220224.125816~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d0fbc7bc055409094e3ad93dabccb37b9597e916;p=platform%2Fcore%2Fapi%2Fcamera.git Add sub function to create tbm surface - Minor change : Remove duplicated structure and definition. : Add missing dependency in pc file. [Version] 0.4.72 [Issue Type] Update Change-Id: I3196a2ae26fa2d874a7604f9ecde0a2f0eb4e840 Signed-off-by: Jeongmo Yang --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 1cb03ea..ca27ab3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,8 +9,8 @@ SET(service "media") SET(submodule "camera") # for package file -SET(dependents "glib-2.0 gio-2.0 libtbm dlog mm-common capi-base-common capi-media-tool mmsvc-camera muse-client mm-display-interface") -SET(pc_dependents "capi-base-common capi-media-tool mm-common") +SET(dependents "glib-2.0 gio-2.0 libtbm dlog mm-common mm-camcorder capi-base-common capi-media-tool mmsvc-camera muse-client mm-display-interface") +SET(pc_dependents "capi-base-common capi-media-tool libtbm mm-common mm-camcorder") SET(fw_name "${project_prefix}-${service}-${submodule}") PROJECT(${fw_name}) diff --git a/include/camera_internal.h b/include/camera_internal.h index 51ae1fe..c0bf836 100644 --- a/include/camera_internal.h +++ b/include/camera_internal.h @@ -19,6 +19,7 @@ #include #include +#include #include #ifdef __cplusplus @@ -36,59 +37,10 @@ extern "C" { * @{ */ -#ifdef BUFFER_MAX_PLANE_NUM -#undef BUFFER_MAX_PLANE_NUM -#endif /* BUFFER_MAX_PLANE_NUM */ - -#define BUFFER_MAX_PLANE_NUM 4 #define CAMERA_DEVICE_MAX ((CAMERA_DEVICE_CAMERA9 + 1) * 2) #define DEVICE_NAME_MAX_LENGTH 64 #define DEVICE_ID_MAX_LENGTH 64 -typedef struct _camera_stream_data_s { - union { - struct { - unsigned char *yuv; - unsigned int length_yuv; - } yuv420, yuv422; - struct { - unsigned char *y; - unsigned int length_y; - unsigned char *uv; - unsigned int length_uv; - } yuv420sp; - struct { - unsigned char *y; - unsigned int length_y; - unsigned char *u; - unsigned int length_u; - unsigned char *v; - unsigned int length_v; - } yuv420p, yuv422p; - struct { - unsigned char *data; - unsigned int length_data; - int is_delta_frame; - } encoded, depth, rgb; - } data; /**< pointer of captured stream */ - int data_type; /**< data type */ - unsigned int length_total; /**< total length of stream buffer (in byte)*/ - unsigned int num_planes; /**< number of planes */ - MMPixelFormatType format; /**< image format */ - int width; /**< width of video buffer */ - int height; /**< height of video buffer */ - unsigned int timestamp; /**< timestamp of stream buffer (msec)*/ - void *bo[BUFFER_MAX_PLANE_NUM]; /**< TBM buffer object */ - void *internal_buffer; /**< Internal buffer pointer */ - int stride[BUFFER_MAX_PLANE_NUM]; /**< Stride of each plane */ - int elevation[BUFFER_MAX_PLANE_NUM]; /**< Elevation of each plane */ - int extra_stream_id; /**< ID of extra preview stream */ - int focus_state; /**< Focus state */ - int facing_direction; /**< Facing direction */ - int flip; /**< Flip */ - int rotation; /**< Rotation */ -} camera_stream_data_s; - typedef enum { CAMERA_DEVICE_TYPE_BUILTIN = 0, /**< Built-in camera */ @@ -201,7 +153,7 @@ int camera_set_ecore_wl_display(camera_h camera, void *ecore_wl_window); * @param[in] data_bo_handle The bo handle of data * @param[out] frame The frame which will be filled */ -void camera_create_preview_frame(camera_stream_data_s *stream, int num_buffer_fd, +void camera_create_preview_frame(MMCamcorderVideoStreamDataType *stream, int num_buffer_fd, tbm_bo_handle *buffer_bo_handle, tbm_bo_handle *data_bo_handle, camera_preview_data_s *frame); /** diff --git a/include/camera_private.h b/include/camera_private.h index 01fbddf..aa95198 100644 --- a/include/camera_private.h +++ b/include/camera_private.h @@ -177,7 +177,7 @@ typedef struct _camera_cb_info_s { GMutex bridge_lock; /* preview stream */ - camera_stream_data_s *stream_data; + MMCamcorderVideoStreamDataType *stream_data; } camera_cb_info_s; typedef struct _camera_message_s { diff --git a/packaging/capi-media-camera.spec b/packaging/capi-media-camera.spec index d744337..cf5246c 100644 --- a/packaging/capi-media-camera.spec +++ b/packaging/capi-media-camera.spec @@ -1,7 +1,7 @@ Name: capi-media-camera Summary: A Camera API -Version: 0.4.71 -Release: 1 +Version: 0.4.72 +Release: 0 Group: Multimedia/API License: Apache-2.0 Source0: %{name}-%{version}.tar.gz @@ -11,6 +11,7 @@ BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(gio-2.0) BuildRequires: pkgconfig(muse-client) BuildRequires: pkgconfig(mm-common) +BuildRequires: pkgconfig(mm-camcorder) BuildRequires: pkgconfig(mm-display-interface) BuildRequires: pkgconfig(capi-base-common) BuildRequires: pkgconfig(mmsvc-camera) diff --git a/src/camera.c b/src/camera.c index 46679c0..bb180cd 100644 --- a/src/camera.c +++ b/src/camera.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -46,7 +47,7 @@ static int g_camera_log_level = CAMERA_LOG_LEVEL_INFO; static bool __camera_import_tbm_fd(tbm_bufmgr bufmgr, int fd, tbm_bo *bo, tbm_bo_handle *bo_handle); static void __camera_release_imported_bo(tbm_bo *bo); -static int __camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream_data_s *stream, +static int __camera_media_packet_create(camera_cb_info_s *cb_info, MMCamcorderVideoStreamDataType *stream, camera_media_packet_data *mp_data, media_packet_h *packet); static int __camera_media_packet_data_create(int ret_fd, int *tfd, int num_buffer_fd, tbm_bo bo, tbm_bo *buffer_bo, tbm_bo data_bo, camera_media_packet_data **mp_data); @@ -279,7 +280,7 @@ static void __camera_event_handler_preview(camera_cb_info_s *cb_info, char *recv camera_msg_param param; camera_preview_data_s frame; - camera_stream_data_s *stream = NULL; + MMCamcorderVideoStreamDataType *stream = NULL; camera_media_packet_data *mp_data = NULL; media_packet_h pkt = NULL; @@ -330,7 +331,7 @@ static void __camera_event_handler_preview(camera_cb_info_s *cb_info, char *recv buf_pos = (unsigned char *)bo_handle.ptr; /* get stream info */ - stream = (camera_stream_data_s *)buf_pos; + stream = (MMCamcorderVideoStreamDataType *)buf_pos; for (i = 0 ; i < num_buffer_fd ; i++) { /* import buffer bo and get virtual address */ @@ -1119,43 +1120,32 @@ static void __camera_media_packet_data_release(camera_media_packet_data *mp_data g_free(mp_data); } -static int __camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream_data_s *stream, - camera_media_packet_data *mp_data, media_packet_h *packet) + +static tbm_surface_h __camera_get_tbm_surface(MMCamcorderVideoStreamDataType *stream, camera_media_packet_data *mp_data) { - media_packet_h pkt = NULL; - bool make_pkt_fmt = false; - tbm_surface_h tsurf = NULL; - tbm_surface_info_s tsurf_info; - media_format_mimetype_e mimetype = MEDIA_FORMAT_NV12; - uint32_t bo_format = 0; - int ret = 0; int i = 0; + int ret = CAMERA_ERROR_NONE; int num_buffer_fd = 0; - int pkt_fmt_width = 0; - int pkt_fmt_height = 0; + uint32_t bo_format = 0; tbm_bo *buffer_bo = NULL; - media_format_mimetype_e pkt_fmt_mimetype = MEDIA_FORMAT_NV12; + tbm_surface_info_s tsurf_info; - if (cb_info == NULL || stream == NULL || mp_data == NULL || packet == NULL) { - CAM_LOG_ERROR("invalid parameter - cb_info:%p, stream:%p, mp_data:%p, packet:%p", - cb_info, stream, mp_data, packet); - return CAMERA_ERROR_INVALID_PARAMETER; + if (!stream || !mp_data) { + CAM_LOG_ERROR("NULL param [%p,%p]", stream, mp_data); + return NULL; } - memset(&tsurf_info, 0x0, sizeof(tbm_surface_info_s)); - buffer_bo = mp_data->buffer_bo; num_buffer_fd = mp_data->num_buffer_fd; - /* create tbm surface */ + memset(&tsurf_info, 0x0, sizeof(tbm_surface_info_s)); + for (i = 0 ; i < BUFFER_MAX_PLANE_NUM ; i++) tsurf_info.planes[i].stride = stream->stride[i]; - /* get tbm surface format */ ret = _camera_get_tbm_surface_format(stream->format, &bo_format); - ret |= _camera_get_media_packet_mimetype(stream->format, &mimetype); if (ret != CAMERA_ERROR_NONE) - return ret; + return NULL; tsurf_info.width = stream->width; tsurf_info.height = stream->height; @@ -1198,7 +1188,7 @@ static int __camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream //LCOV_EXCL_STOP } - tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, buffer_bo, num_buffer_fd); + return tbm_surface_internal_create_with_bos(&tsurf_info, buffer_bo, num_buffer_fd); } else if (mp_data->data_bo) { //LCOV_EXCL_START switch (bo_format) { @@ -1230,14 +1220,55 @@ static int __camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream break; } - tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, &mp_data->data_bo, 1); + return tbm_surface_internal_create_with_bos(&tsurf_info, &mp_data->data_bo, 1); //LCOV_EXCL_STOP } - if (!tsurf) { - CAM_LOG_ERROR("tbm surface failed. %dx%d, format %d, num_buffer_fd %d, data_bo %p", - stream->width, stream->height, stream->format, num_buffer_fd, mp_data->data_bo); - return CAMERA_ERROR_INVALID_OPERATION; + CAM_LOG_ERROR("should not be reached here"); + + return NULL; +} + + +static int __camera_media_packet_create(camera_cb_info_s *cb_info, MMCamcorderVideoStreamDataType *stream, + camera_media_packet_data *mp_data, media_packet_h *packet) +{ + media_packet_h pkt = NULL; + bool make_pkt_fmt = false; + tbm_surface_h tsurf = NULL; + media_format_mimetype_e mimetype = MEDIA_FORMAT_NV12; + int ret = 0; + int pkt_fmt_width = 0; + int pkt_fmt_height = 0; + media_format_mimetype_e pkt_fmt_mimetype = MEDIA_FORMAT_NV12; + + if (cb_info == NULL || stream == NULL || mp_data == NULL || packet == NULL) { + CAM_LOG_ERROR("invalid parameter - cb_info:%p, stream:%p, mp_data:%p, packet:%p", + cb_info, stream, mp_data, packet); + return CAMERA_ERROR_INVALID_PARAMETER; + } + + ret = _camera_get_media_packet_mimetype(stream->format, &mimetype); + if (ret != CAMERA_ERROR_NONE) + return ret; + + switch (stream->data_type) { + case MM_CAM_STREAM_DATA_ENCODED: + /* TODO */ + break; + case MM_CAM_STREAM_DATA_DEPTH: + /* TODO */ + break; + case MM_CAM_STREAM_DATA_RGB: + break; + default: /* YUV */ + tsurf = __camera_get_tbm_surface(stream, mp_data); + if (!tsurf) { + CAM_LOG_ERROR("tbm surface failed. %dx%d, format %d, num_buffer_fd %d, data_bo %p", + stream->width, stream->height, stream->format, mp_data->num_buffer_fd, mp_data->data_bo); + return CAMERA_ERROR_INVALID_OPERATION; + } + break; } /* check media packet format */ diff --git a/src/camera_internal.c b/src/camera_internal.c index 15e50d6..6618838 100644 --- a/src/camera_internal.c +++ b/src/camera_internal.c @@ -58,7 +58,7 @@ int camera_set_ecore_wl_display(camera_h camera, void *ecore_wl_window) //LCOV_EXCL_STOP -void camera_create_preview_frame(camera_stream_data_s *stream, int num_buffer_fd, +void camera_create_preview_frame(MMCamcorderVideoStreamDataType *stream, int num_buffer_fd, tbm_bo_handle *buffer_bo_handle, tbm_bo_handle *data_bo_handle, camera_preview_data_s *frame) { int total_size = 0;