From ada72c06f366fb95df3bfe31c1651914786635e8 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Thu, 1 Apr 2021 20:35:43 +0900 Subject: [PATCH] Refactoring code related with media packet - Replace deprecated APIs by new added APIs - Remove duplicated and unncessary code [Version] 0.4.49 [Issue Type] Refactoring Change-Id: I4a229fe93803c52a11baeb44028f8a11562c54e7 Signed-off-by: Jeongmo Yang --- include/camera_private.h | 3 +- packaging/capi-media-camera.spec | 2 +- src/camera.c | 527 ++++++++++++++++++--------------------- 3 files changed, 247 insertions(+), 285 deletions(-) diff --git a/include/camera_private.h b/include/camera_private.h index e2aa8d8..fe6eb16 100644 --- a/include/camera_private.h +++ b/include/camera_private.h @@ -204,7 +204,6 @@ typedef struct _camera_media_packet_data { tbm_bo buffer_bo[BUFFER_MAX_PLANE_NUM]; int num_buffer_fd; tbm_bo data_bo; - int ref_cnt; } camera_media_packet_data; typedef struct _camera_msg_param { @@ -236,7 +235,7 @@ typedef struct _camera_device_manager { int _camera_get_tbm_surface_format(int in_format, uint32_t *out_format); int _camera_get_media_packet_mimetype(int in_format, media_format_mimetype_e *mimetype); -int _camera_media_packet_finalize(media_packet_h pkt, int error_code, void *user_data); +void _camera_media_packet_dispose(media_packet_h pkt, void *user_data); int _camera_start_evas_rendering(camera_h camera); int _camera_stop_evas_rendering(camera_h camera, bool keep_screen); int _camera_independent_request(int api, int device_type, const char *key, int *value); diff --git a/packaging/capi-media-camera.spec b/packaging/capi-media-camera.spec index 2e09c89..a630686 100644 --- a/packaging/capi-media-camera.spec +++ b/packaging/capi-media-camera.spec @@ -1,6 +1,6 @@ Name: capi-media-camera Summary: A Camera API -Version: 0.4.48 +Version: 0.4.49 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/camera.c b/src/camera.c index 9187df2..d29e654 100644 --- a/src/camera.c +++ b/src/camera.c @@ -169,8 +169,6 @@ static void __camera_release_preview_buffer(camera_h camera) } CAM_LOG_INFO("Done"); - - return; } @@ -188,8 +186,6 @@ static void __camera_update_api_waiting(camera_cb_info_s *cb_info, int api, int CAM_LOG_DEBUG("api[%d], value[%d], waiting[%d]", api, value, cb_info->api_waiting[api]); - - return; } @@ -238,8 +234,6 @@ static void __camera_device_state_changed_cb(GDBusConnection *connection, _DONE: g_mutex_unlock(&g_cam_dev_state_changed_cb_lock); - - return; } @@ -264,7 +258,6 @@ static void __camera_event_handler_preview(camera_cb_info_s *cb_info, char *recv camera_stream_data_s *stream = NULL; camera_media_packet_data *mp_data = NULL; media_packet_h pkt = NULL; - media_packet_h pkt_evas = NULL; /* tfd[0]: MMCamcorderVideoStreamDataType tfd[1]: data_bo or zero copy bo[0] @@ -323,7 +316,7 @@ static void __camera_event_handler_preview(camera_cb_info_s *cb_info, char *recv } } - /* call preview callback */ + /* preview callback */ if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_PREVIEW]) { camera_create_preview_frame(stream, num_buffer_fd, buffer_bo_handle, &data_bo_handle, &frame); @@ -331,78 +324,81 @@ static void __camera_event_handler_preview(camera_cb_info_s *cb_info, char *recv cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_PREVIEW]); } - if (CHECK_PREVIEW_CB(cb_info, PREVIEW_CB_TYPE_EVAS)) { + /* make media packet with below cases. + * 1. media_packet_preview_cb is set + * 2. EVAS display rendering + */ + if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW] || + CHECK_PREVIEW_CB(cb_info, PREVIEW_CB_TYPE_EVAS)) { ret = __camera_media_packet_data_create(ret_fd, tfd, num_buffer_fd, bo, buffer_bo, data_bo, &mp_data); + if (ret != CAMERA_ERROR_NONE) { + CAM_LOG_ERROR("__camera_media_packet_data_create failed[0x%x]", ret); + goto _PREVIEW_CB_HANDLER_DONE; + } - if (ret == CAMERA_ERROR_NONE) { - ret = __camera_media_packet_create(cb_info, stream, mp_data, &pkt_evas); - if (ret != CAMERA_ERROR_NONE) { - CAM_LOG_ERROR("create pkt for evas failed"); - __camera_media_packet_data_release(mp_data, cb_info); - mp_data = NULL; - } + ret = __camera_media_packet_create(cb_info, stream, mp_data, &pkt); + if (ret != CAMERA_ERROR_NONE) { + CAM_LOG_ERROR("__camera_media_packet_create failed[0x%x]", ret); + __camera_media_packet_data_release(mp_data, cb_info); + mp_data = NULL; + goto _PREVIEW_CB_HANDLER_DONE; } } - /* call media packet callback */ + /* 1. media packet preview callback */ if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]) { - ret = __camera_media_packet_data_create(ret_fd, tfd, num_buffer_fd, bo, buffer_bo, data_bo, &mp_data); - - if (ret == CAMERA_ERROR_NONE) { - ret = __camera_media_packet_create(cb_info, stream, mp_data, &pkt); - - if (ret == CAMERA_ERROR_NONE) { - ((camera_media_packet_preview_cb)cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW])(pkt, - cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]); - } else { - __camera_media_packet_data_release(mp_data, cb_info); - mp_data = NULL; - } - } + media_packet_ref(pkt); + ((camera_media_packet_preview_cb)cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW])(pkt, + cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]); } - /* call evas renderer */ - if (pkt_evas) { + /* 2. call evas renderer */ + if (CHECK_PREVIEW_CB(cb_info, PREVIEW_CB_TYPE_EVAS)) { if (cb_info->run_evas_render) { - mm_display_interface_evas_render(cb_info->dp_interface, pkt_evas); + media_packet_ref(pkt); + ret = mm_display_interface_evas_render(cb_info->dp_interface, pkt); + if (ret != MM_ERROR_NONE) { + CAM_LOG_ERROR("mm_display_interface_evas_render failed[0x%x]", ret); + media_packet_unref(pkt); + } } else { CAM_LOG_WARNING("evas renderer is stopped, skip this buffer..."); - media_packet_destroy(pkt_evas); } - pkt_evas = NULL; } +_PREVIEW_CB_HANDLER_DONE: /* send message for preview callback return */ - if (!CHECK_PREVIEW_CB(cb_info, PREVIEW_CB_TYPE_EVAS)) + if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_PREVIEW] || + cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]) _camera_msg_send(MUSE_CAMERA_API_PREVIEW_CB_RETURN, NULL, cb_info, NULL, 0); -_PREVIEW_CB_HANDLER_DONE: - if (mp_data == NULL) { - /* release imported bo */ - for (i = 0 ; i < num_buffer_fd && i < BUFFER_MAX_PLANE_NUM ; i++) - __camera_release_imported_bo(&buffer_bo[i]); + if (pkt) { + media_packet_unref(pkt); + return; + } - /* unmap and unref tbm bo */ - __camera_release_imported_bo(&data_bo); - __camera_release_imported_bo(&bo); + /* return buffer */ + _camera_msg_send_param1(MUSE_CAMERA_API_RETURN_BUFFER, cb_info, NULL, ¶m, 0); - /* close imported fd */ - for (i = 0 ; i < MUSE_NUM_FD ; i++) { - if (tfd[i] >= 0) { - close(tfd[i]); - tfd[i] = -1; - } else { - break; - } - } + CAM_LOG_DEBUG("return buffer Done[tfd:%d, ret fd:%d]", tfd[0], ret_fd); - /* return buffer */ - _camera_msg_send_param1(MUSE_CAMERA_API_RETURN_BUFFER, cb_info, NULL, ¶m, 0); + /* release imported bo */ + for (i = 0 ; i < num_buffer_fd && i < BUFFER_MAX_PLANE_NUM ; i++) + __camera_release_imported_bo(&buffer_bo[i]); - CAM_LOG_DEBUG("return buffer Done[tfd:%d, ret fd:%d]", tfd[0], ret_fd); - } + /* unmap and unref tbm bo */ + __camera_release_imported_bo(&data_bo); + __camera_release_imported_bo(&bo); - return; + /* close imported fd */ + for (i = 0 ; i < MUSE_NUM_FD ; i++) { + if (tfd[i] >= 0) { + close(tfd[i]); + tfd[i] = -1; + } else { + break; + } + } } @@ -525,8 +521,6 @@ _CAPTURE_CB_HANDLER_DONE: } CAM_LOG_INFO("return buffer done"); - - return; } @@ -572,8 +566,6 @@ static void __camera_event_handler_face_detection(camera_cb_info_s *cb_info, cha /* return buffer */ _camera_msg_return_buffer(face_fd, cb_info); - - return; } @@ -622,8 +614,6 @@ static void __camera_release_imported_bo(tbm_bo *bo) tbm_bo_unref(*bo); *bo = NULL; - - return; } static int __camera_client_wait_for_cb_return(muse_camera_api_e api, camera_cb_info_s *cb_info, int time_out) @@ -716,8 +706,6 @@ void _camera_msg_send(int api, int *fds, camera_cb_info_s *cb_info, __camera_update_api_waiting(cb_info, api, -1); muse_core_msg_free(msg); - - return; } @@ -795,8 +783,6 @@ void _camera_msg_send_param1(int api, camera_cb_info_s *cb_info, __camera_update_api_waiting(cb_info, api, -1); muse_core_msg_free(msg); - - return; } @@ -854,8 +840,6 @@ void _camera_msg_send_param2_int(int api, camera_cb_info_s *cb_info, _SEND_PARAM2_INT_DONE: if (ret) *ret = func_ret; - - return; } @@ -871,8 +855,6 @@ void _camera_msg_return_buffer(int ret_fd, camera_cb_info_s *cb_info) CAMERA_MSG_PARAM_SET(param, INT, ret_fd); _camera_msg_send_param1(MUSE_CAMERA_API_RETURN_BUFFER, cb_info, NULL, ¶m, 0); - - return; } @@ -999,54 +981,44 @@ static int __camera_media_packet_data_create(int ret_fd, int *tfd, int num_buffe { int i = 0; int ret = CAMERA_ERROR_NONE; - camera_media_packet_data *tmp_mp_data = NULL; + camera_media_packet_data *new_mp_data = NULL; - if (!tfd) { - CAM_LOG_ERROR("NULL tfd"); + if (!tfd || !mp_data) { + CAM_LOG_ERROR("NULL param[%p,%p]", tfd, mp_data); return CAMERA_ERROR_INVALID_PARAMETER; } - if (*mp_data == NULL) { - tmp_mp_data = g_new0(camera_media_packet_data, 1); - if (tmp_mp_data) { - tmp_mp_data->ret_fd = ret_fd; - tmp_mp_data->fd = tfd[0]; - tmp_mp_data->num_buffer_fd = num_buffer_fd; - tmp_mp_data->bo = bo; + new_mp_data = g_new0(camera_media_packet_data, 1); - CAM_LOG_VERBOSE("tfd[%d], ret fd[%d]", tmp_mp_data->fd, tmp_mp_data->ret_fd); + new_mp_data->ret_fd = ret_fd; + new_mp_data->fd = tfd[0]; + new_mp_data->num_buffer_fd = num_buffer_fd; + new_mp_data->bo = bo; - if (data_bo) { - /* non-zero copy */ - tmp_mp_data->data_bo = data_bo; - tmp_mp_data->data_fd = tfd[1]; + CAM_LOG_VERBOSE("tfd[%d], ret fd[%d]", new_mp_data->fd, new_mp_data->ret_fd); - CAM_LOG_VERBOSE("bo[%p], fd[%d]", - tmp_mp_data->data_bo, tmp_mp_data->data_fd); - } else { - /* zero copy */ - for (i = 0 ; i < num_buffer_fd ; i++) { - tmp_mp_data->buffer_bo[i] = buffer_bo[i]; - tmp_mp_data->buffer_fd[i] = (tbm_fd)tfd[i + 1]; + if (data_bo) { + /* non-zero copy */ + new_mp_data->data_bo = data_bo; + new_mp_data->data_fd = tfd[1]; - CAM_LOG_VERBOSE(" [%d] bo[%p], fd[%d]", - i, tmp_mp_data->buffer_bo[i], tmp_mp_data->buffer_fd[i]); - } - } - - tmp_mp_data->ref_cnt++; - - *mp_data = tmp_mp_data; + CAM_LOG_VERBOSE("bo[%p], fd[%d]", + new_mp_data->data_bo, new_mp_data->data_fd); + } else { + /* zero copy */ + for (i = 0 ; i < num_buffer_fd ; i++) { + new_mp_data->buffer_bo[i] = buffer_bo[i]; + new_mp_data->buffer_fd[i] = (tbm_fd)tfd[i + 1]; - CAM_LOG_DEBUG("mp_data %p", tmp_mp_data); - } else { - ret = CAMERA_ERROR_OUT_OF_MEMORY; - CAM_LOG_ERROR("failed to alloc media packet data"); + CAM_LOG_VERBOSE(" [%d] bo[%p], fd[%d]", + i, new_mp_data->buffer_bo[i], new_mp_data->buffer_fd[i]); } - } else { - ((camera_media_packet_data *)*mp_data)->ref_cnt++; } + *mp_data = new_mp_data; + + CAM_LOG_DEBUG("mp_data %p", new_mp_data); + return ret; } @@ -1059,40 +1031,33 @@ static void __camera_media_packet_data_release(camera_media_packet_data *mp_data return; } - if (mp_data->ref_cnt > 1) { - mp_data->ref_cnt--; - CAM_LOG_INFO("ref count %d", mp_data->ref_cnt); - } else { - CAM_LOG_VERBOSE("tfd[%d], ret fd[%d]", mp_data->fd, mp_data->ret_fd); + CAM_LOG_VERBOSE("tfd[%d], ret fd[%d]", mp_data->fd, mp_data->ret_fd); - /* release imported bo and close imported fd */ - for (i = 0 ; i < mp_data->num_buffer_fd ; i++) { - tbm_bo_unref(mp_data->buffer_bo[i]); - mp_data->buffer_bo[i] = NULL; + /* release imported bo and close imported fd */ + for (i = 0 ; i < mp_data->num_buffer_fd ; i++) { + tbm_bo_unref(mp_data->buffer_bo[i]); + mp_data->buffer_bo[i] = NULL; - close(mp_data->buffer_fd[i]); - mp_data->buffer_fd[i] = -1; - } - - /* unref tbm bo and close imported fd */ - close(mp_data->fd); - mp_data->fd = -1; - - __camera_release_imported_bo(&mp_data->bo); + close(mp_data->buffer_fd[i]); + mp_data->buffer_fd[i] = -1; + } - if (mp_data->data_bo && mp_data->data_fd >= 0) { - close(mp_data->data_fd); - mp_data->data_fd = -1; - } - __camera_release_imported_bo(&mp_data->data_bo); + /* unref tbm bo and close imported fd */ + close(mp_data->fd); + mp_data->fd = -1; - /* return buffer */ - _camera_msg_return_buffer(mp_data->ret_fd, cb_info); + __camera_release_imported_bo(&mp_data->bo); - g_free(mp_data); + if (mp_data->data_bo && mp_data->data_fd >= 0) { + close(mp_data->data_fd); + mp_data->data_fd = -1; } + __camera_release_imported_bo(&mp_data->data_bo); - return; + /* return buffer */ + _camera_msg_return_buffer(mp_data->ret_fd, cb_info); + + g_free(mp_data); } static int __camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream_data_s *stream, @@ -1107,7 +1072,10 @@ static int __camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream int ret = 0; int i = 0; int num_buffer_fd = 0; + int pkt_fmt_width = 0; + int pkt_fmt_height = 0; tbm_bo *buffer_bo = NULL; + 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", @@ -1116,6 +1084,7 @@ static int __camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream } memset(&tsurf_info, 0x0, sizeof(tbm_surface_info_s)); + buffer_bo = mp_data->buffer_bo; num_buffer_fd = mp_data->num_buffer_fd; @@ -1126,160 +1095,168 @@ static int __camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream /* 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; - if (ret == CAMERA_ERROR_NONE) { - tsurf_info.width = stream->width; - tsurf_info.height = stream->height; - tsurf_info.format = bo_format; - tsurf_info.bpp = tbm_surface_internal_get_bpp(bo_format); - tsurf_info.num_planes = tbm_surface_internal_get_num_planes(bo_format); - - if (num_buffer_fd > 0) { - switch (bo_format) { - case TBM_FORMAT_NV12: - case TBM_FORMAT_NV21: - tsurf_info.planes[0].size = stream->stride[0] * stream->elevation[0]; - tsurf_info.planes[1].size = stream->stride[1] * stream->elevation[1]; - tsurf_info.planes[0].offset = 0; - if (num_buffer_fd == 1) - tsurf_info.planes[1].offset = tsurf_info.planes[0].size; - tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size; - break; -//LCOV_EXCL_START - case TBM_FORMAT_YUV420: - case TBM_FORMAT_YVU420: - tsurf_info.planes[0].size = stream->stride[0] * stream->elevation[0]; - tsurf_info.planes[1].size = stream->stride[1] * stream->elevation[1]; - tsurf_info.planes[2].size = stream->stride[2] * stream->elevation[2]; - tsurf_info.planes[0].offset = 0; - if (num_buffer_fd == 1) { - tsurf_info.planes[1].offset = tsurf_info.planes[0].size; - tsurf_info.planes[2].offset = tsurf_info.planes[0].size + tsurf_info.planes[1].size; - } - tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size + tsurf_info.planes[2].size; - break; - case TBM_FORMAT_UYVY: - case TBM_FORMAT_YUYV: - tsurf_info.planes[0].size = (stream->stride[0] * stream->elevation[0]) << 1; - tsurf_info.planes[0].offset = 0; - tsurf_info.size = tsurf_info.planes[0].size; - break; - default: - break; -//LCOV_EXCL_STOP - } - - tsurf = 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) { - case TBM_FORMAT_NV12: - case TBM_FORMAT_NV21: - tsurf_info.planes[0].size = stream->width * stream->height; - tsurf_info.planes[1].size = (tsurf_info.planes[0].size) >> 1; - tsurf_info.planes[0].offset = 0; + tsurf_info.width = stream->width; + tsurf_info.height = stream->height; + tsurf_info.format = bo_format; + tsurf_info.bpp = tbm_surface_internal_get_bpp(bo_format); + tsurf_info.num_planes = tbm_surface_internal_get_num_planes(bo_format); + + if (num_buffer_fd > 0) { + switch (bo_format) { + case TBM_FORMAT_NV12: + case TBM_FORMAT_NV21: + tsurf_info.planes[0].size = stream->stride[0] * stream->elevation[0]; + tsurf_info.planes[1].size = stream->stride[1] * stream->elevation[1]; + tsurf_info.planes[0].offset = 0; + if (num_buffer_fd == 1) tsurf_info.planes[1].offset = tsurf_info.planes[0].size; - tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size; - break; - case TBM_FORMAT_YUV420: - case TBM_FORMAT_YVU420: - tsurf_info.planes[0].size = stream->width * stream->height; - tsurf_info.planes[1].size = (stream->width >> 1) * (stream->height >> 1); - tsurf_info.planes[2].size = tsurf_info.planes[1].size; - tsurf_info.planes[0].offset = 0; + tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size; + break; +//LCOV_EXCL_START + case TBM_FORMAT_YUV420: + case TBM_FORMAT_YVU420: + tsurf_info.planes[0].size = stream->stride[0] * stream->elevation[0]; + tsurf_info.planes[1].size = stream->stride[1] * stream->elevation[1]; + tsurf_info.planes[2].size = stream->stride[2] * stream->elevation[2]; + tsurf_info.planes[0].offset = 0; + if (num_buffer_fd == 1) { tsurf_info.planes[1].offset = tsurf_info.planes[0].size; tsurf_info.planes[2].offset = tsurf_info.planes[0].size + tsurf_info.planes[1].size; - tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size + tsurf_info.planes[2].size; - break; - case TBM_FORMAT_UYVY: - case TBM_FORMAT_YUYV: - tsurf_info.planes[0].size = (stream->width * stream->height) << 1; - tsurf_info.planes[0].offset = 0; - tsurf_info.size = tsurf_info.planes[0].size; - break; - default: - break; } - - tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, &mp_data->data_bo, 1); + tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size + tsurf_info.planes[2].size; + break; + case TBM_FORMAT_UYVY: + case TBM_FORMAT_YUYV: + tsurf_info.planes[0].size = (stream->stride[0] * stream->elevation[0]) << 1; + tsurf_info.planes[0].offset = 0; + tsurf_info.size = tsurf_info.planes[0].size; + break; + default: + break; //LCOV_EXCL_STOP } - } - if (tsurf) { - /* check media packet format */ - if (cb_info->pkt_fmt) { - int pkt_fmt_width = 0; - int pkt_fmt_height = 0; - media_format_mimetype_e pkt_fmt_mimetype = MEDIA_FORMAT_NV12; - - media_format_get_video_info(cb_info->pkt_fmt, &pkt_fmt_mimetype, &pkt_fmt_width, &pkt_fmt_height, NULL, NULL); - - CAM_LOG_INFO("pkt_fmt %dx%d - stream %dx%d", pkt_fmt_width, pkt_fmt_height, stream->width, stream->height); - - if (pkt_fmt_mimetype != mimetype || - pkt_fmt_width != stream->width || - pkt_fmt_height != stream->height) { - CAM_LOG_WARNING("change fmt: current 0x%x, %dx%d", - pkt_fmt_mimetype, pkt_fmt_width, pkt_fmt_height); - media_format_unref(cb_info->pkt_fmt); - cb_info->pkt_fmt = NULL; - make_pkt_fmt = true; - } - } else { - make_pkt_fmt = true; + tsurf = 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) { + case TBM_FORMAT_NV12: + case TBM_FORMAT_NV21: + tsurf_info.planes[0].size = stream->width * stream->height; + tsurf_info.planes[1].size = (tsurf_info.planes[0].size) >> 1; + tsurf_info.planes[0].offset = 0; + tsurf_info.planes[1].offset = tsurf_info.planes[0].size; + tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size; + break; + case TBM_FORMAT_YUV420: + case TBM_FORMAT_YVU420: + tsurf_info.planes[0].size = stream->width * stream->height; + tsurf_info.planes[1].size = (stream->width >> 1) * (stream->height >> 1); + tsurf_info.planes[2].size = tsurf_info.planes[1].size; + tsurf_info.planes[0].offset = 0; + tsurf_info.planes[1].offset = tsurf_info.planes[0].size; + tsurf_info.planes[2].offset = tsurf_info.planes[0].size + tsurf_info.planes[1].size; + tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size + tsurf_info.planes[2].size; + break; + case TBM_FORMAT_UYVY: + case TBM_FORMAT_YUYV: + tsurf_info.planes[0].size = (stream->width * stream->height) << 1; + tsurf_info.planes[0].offset = 0; + tsurf_info.size = tsurf_info.planes[0].size; + break; + default: + break; } - /* create packet format */ - if (make_pkt_fmt) { - CAM_LOG_WARNING("make new pkt_fmt - 0x%x, %dx%d", mimetype, stream->width, stream->height); - ret = media_format_create(&cb_info->pkt_fmt); - if (ret == MEDIA_FORMAT_ERROR_NONE) { - ret = media_format_set_video_mime(cb_info->pkt_fmt, mimetype); - ret |= media_format_set_video_width(cb_info->pkt_fmt, stream->width); - ret |= media_format_set_video_height(cb_info->pkt_fmt, stream->height); - CAM_LOG_WARNING("media_format_set : 0x%x", ret); - } else { - CAM_LOG_WARNING("media_format_create failed 0x%x", ret); - } - } + tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, &mp_data->data_bo, 1); +//LCOV_EXCL_STOP + } - /* create media packet */ - ret = media_packet_create_from_tbm_surface(cb_info->pkt_fmt, - tsurf, (media_packet_finalize_cb)_camera_media_packet_finalize, - (void *)cb_info, &pkt); - if (ret != MEDIA_PACKET_ERROR_NONE) { - CAM_LOG_ERROR("media_packet_create failed 0x%x", ret); - tbm_surface_destroy(tsurf); - tsurf = NULL; - } - } else { + 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; } - if (pkt) { - /* set media packet data */ - ret = media_packet_set_extra(pkt, (void *)mp_data); - if (ret != MEDIA_PACKET_ERROR_NONE) { - CAM_LOG_ERROR("media_packet_set_extra failed"); + /* check media packet format */ + if (cb_info->pkt_fmt) { + media_format_get_video_info(cb_info->pkt_fmt, + &pkt_fmt_mimetype, &pkt_fmt_width, &pkt_fmt_height, NULL, NULL); - __camera_media_packet_data_release(mp_data, cb_info); + CAM_LOG_INFO("pkt_fmt %dx%d - stream %dx%d", + pkt_fmt_width, pkt_fmt_height, stream->width, stream->height); - media_packet_destroy(pkt); - } else { - /* set timestamp : msec -> nsec */ - if (media_packet_set_pts(pkt, (uint64_t)(stream->timestamp) * 1000000) != MEDIA_PACKET_ERROR_NONE) - CAM_LOG_WARNING("media_packet_set_pts failed"); + if (pkt_fmt_mimetype != mimetype || + pkt_fmt_width != stream->width || + pkt_fmt_height != stream->height) { + CAM_LOG_WARNING("change fmt[previous:0x%x,%dx%d]", + pkt_fmt_mimetype, pkt_fmt_width, pkt_fmt_height); - *packet = pkt; + media_format_unref(cb_info->pkt_fmt); + cb_info->pkt_fmt = NULL; + make_pkt_fmt = true; } + } else { + make_pkt_fmt = true; } - return ret; + /* create packet format */ + if (make_pkt_fmt) { + CAM_LOG_WARNING("make new fmt - 0x%x, %dx%d", + mimetype, stream->width, stream->height); + + ret = media_format_create(&cb_info->pkt_fmt); + if (ret != MEDIA_FORMAT_ERROR_NONE) { + CAM_LOG_WARNING("media_format_create failed 0x%x", ret); + goto _PACKET_CREATE_FAILED; + } + + ret = media_format_set_video_mime(cb_info->pkt_fmt, mimetype); + ret |= media_format_set_video_width(cb_info->pkt_fmt, stream->width); + ret |= media_format_set_video_height(cb_info->pkt_fmt, stream->height); + if (ret != MEDIA_FORMAT_ERROR_NONE) { + CAM_LOG_WARNING("media format set failed 0x%x", ret); + goto _PACKET_CREATE_FAILED; + } + } + + /* create media packet */ + ret = media_packet_new_from_tbm_surface(cb_info->pkt_fmt, + tsurf, (media_packet_dispose_cb)_camera_media_packet_dispose, + (void *)cb_info, &pkt); + if (ret != MEDIA_PACKET_ERROR_NONE) { + CAM_LOG_ERROR("media_packet_new failed 0x%x", ret); + goto _PACKET_CREATE_FAILED; + } + + /* set media packet data */ + ret = media_packet_set_extra(pkt, (void *)mp_data); + if (ret != MEDIA_PACKET_ERROR_NONE) { + CAM_LOG_ERROR("media_packet_set_extra failed"); + goto _PACKET_CREATE_FAILED; + } + + /* set timestamp : msec -> nsec */ + if (media_packet_set_pts(pkt, (uint64_t)(stream->timestamp) * 1000000) != MEDIA_PACKET_ERROR_NONE) + CAM_LOG_WARNING("media_packet_set_pts failed"); + + *packet = pkt; + + return CAMERA_ERROR_NONE; + +_PACKET_CREATE_FAILED: + if (tsurf) + tbm_surface_destroy(tsurf); + if (pkt) + media_packet_unref(pkt); + + return CAMERA_ERROR_INVALID_OPERATION; } -int _camera_media_packet_finalize(media_packet_h pkt, int error_code, void *user_data) +void _camera_media_packet_dispose(media_packet_h pkt, void *user_data) { int ret = 0; camera_cb_info_s *cb_info = (camera_cb_info_s *)user_data; @@ -1288,13 +1265,13 @@ int _camera_media_packet_finalize(media_packet_h pkt, int error_code, void *user if (!pkt || !cb_info) { CAM_LOG_ERROR("NULL pointer %p %p", pkt, cb_info); - return MEDIA_PACKET_FINALIZE; + return; } ret = media_packet_get_extra(pkt, (void **)&mp_data); if (ret != MEDIA_PACKET_ERROR_NONE) { CAM_LOG_ERROR("media_packet_get_extra failed 0x%x", ret); - return MEDIA_PACKET_FINALIZE; + return; } CAM_LOG_VERBOSE("mp_data[%p]", mp_data); @@ -1314,8 +1291,6 @@ int _camera_media_packet_finalize(media_packet_h pkt, int error_code, void *user tbm_surface_destroy(tsurf); tsurf = NULL; } - - return MEDIA_PACKET_FINALIZE; } static void __camera_client_user_callback(camera_cb_info_s *cb_info, char *recv_msg, muse_camera_event_e event, int *tfd) @@ -1511,8 +1486,6 @@ static void __camera_client_user_callback(camera_cb_info_s *cb_info, char *recv_ } g_mutex_unlock(&cb_info->user_cb_mutex[event]); - - return; } static gboolean __camera_idle_event_callback(gpointer data) @@ -1734,8 +1707,6 @@ static void __camera_deactivate_idle_event_all(camera_cb_info_s *cb_info) cb_info->idle_event_list = NULL; g_mutex_unlock(&g_cam_idle_event_lock); - - return; } @@ -1784,8 +1755,6 @@ static void __camera_add_msg_to_queue(camera_cb_info_s *cb_info, int api, int ev } cam_msg = NULL; - - return; } @@ -1906,8 +1875,6 @@ static void __camera_process_msg(camera_cb_info_s *cb_info, char *msg, int *tfd) } else { CAM_LOG_WARNING("unknown camera api %d, class %d", api, api_class); } - - return; } @@ -2067,8 +2034,6 @@ static void __destroy_msg_handler_thread(camera_msg_handler_info_s *handler_info handler_info->queue = NULL; CAM_LOG_INFO("t:%d done", type); - - return; } @@ -2215,8 +2180,6 @@ static void __camera_client_callback_destroy(camera_cb_info_s *cb_info) cb_info->preview_cb_flag = 0; g_free(cb_info); - - return; } //LCOV_EXCL_START -- 2.7.4