From: Jeongmo Yang Date: Fri, 18 Nov 2022 05:37:26 +0000 (+0900) Subject: Add preview callback information for debug X-Git-Tag: accepted/tizen/unified/20221128.014943^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=65bbb3eac8e2ae76594b4573b5fd13562c93ed18;p=platform%2Fcore%2Fapi%2Fcamera.git Add preview callback information for debug - Print log including frame count and elapsed time. - The "stream id" for normal preview callback is -1. - The "stream id" for media packet preview callback is -2. [Version] 0.4.97 [Issue Type] Debug Change-Id: I9c60027274046eca5f36d0ee2c31db02e1eaee85 Signed-off-by: Jeongmo Yang --- diff --git a/include/camera_private.h b/include/camera_private.h index 40cbf5e..343c2b0 100644 --- a/include/camera_private.h +++ b/include/camera_private.h @@ -14,12 +14,9 @@ * limitations under the License. */ - - - - #ifndef __TIZEN_MULTIMEDIA_CAMERA_PRIVATE_H__ #define __TIZEN_MULTIMEDIA_CAMERA_PRIVATE_H__ + #include #include #include @@ -38,6 +35,8 @@ extern "C" { #define CAMERA_CB_NO_TIMEOUT 0 #define CAMERA_FD_INIT -1 #define CAMERA_IS_FD_VALID(fd) (fd > CAMERA_FD_INIT) +#define CAMERA_MONITORING_INFO_STREAM_ID_PREVIEW -1 +#define CAMERA_MONITORING_INFO_STREAM_ID_PREVIEW_MP -2 #define CAMERA_MSG_PARAM_SET(param, msg_type, set_value) { \ @@ -131,6 +130,20 @@ typedef struct _camera_msg_handler_info_s { GThread *thread; } camera_msg_handler_info_s; +typedef struct _monitoring_info_sub_s { + unsigned long long frame_count; + gdouble elapsed_sec_accum; + gdouble elapsed_sec_peak; +} monitoring_info_sub_s; + +typedef struct _camera_preview_cb_monitoring_info_s { + int stream_id; + GTimer *timer_calling; + GTimer *timer_interval; + monitoring_info_sub_s *total; + monitoring_info_sub_s *interval; +} camera_preview_cb_monitoring_info_s; + typedef struct _camera_cb_info_s { /* server connection */ gint fd; @@ -198,6 +211,9 @@ typedef struct _camera_cb_info_s { /* preview stream */ MMCamcorderVideoStreamDataType *stream_data; + camera_preview_cb_monitoring_info_s *monitoring_info_preview; + camera_preview_cb_monitoring_info_s *monitoring_info_preview_mp; + camera_preview_cb_monitoring_info_s *monitoring_info_preview_ex[MM_CAMCORDER_EXTRA_PREVIEW_STREAM_MAX]; /* network */ gboolean is_network; diff --git a/packaging/capi-media-camera.spec b/packaging/capi-media-camera.spec index 5ace965..624636c 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.96 +Version: 0.4.97 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/camera.c b/src/camera.c index 71e1bf7..a0a07e9 100644 --- a/src/camera.c +++ b/src/camera.c @@ -274,6 +274,88 @@ _DONE: } +static void __camera_preview_cb_monitoring_info_sub_reset(monitoring_info_sub_s *info_sub) +{ + if (!info_sub) { + CAM_LOG_ERROR("NULL info_sub"); + return; + } + + info_sub->frame_count = 0; + info_sub->elapsed_sec_accum = 0.0; + info_sub->elapsed_sec_peak = 0.0; +} + + +static void __camera_preview_cb_monitoring_info_reset(camera_preview_cb_monitoring_info_s *info) +{ + if (!info) { + CAM_LOG_ERROR("NULL info"); + return; + } + + __camera_preview_cb_monitoring_info_sub_reset(info->total); + __camera_preview_cb_monitoring_info_sub_reset(info->interval); +} + + +static void __camera_preview_cb_monitoring_info_start(camera_preview_cb_monitoring_info_s *info) +{ + if (!info) { + CAM_LOG_ERROR("NULL info"); + return; + } + + g_timer_start(info->timer_calling); + + if (info->interval->frame_count == 0) + g_timer_start(info->timer_interval); +} + + +static void __camera_preview_cb_monitoring_info_sub_update(monitoring_info_sub_s *info_sub, gdouble elapsed_sec) +{ + if (!info_sub) { + CAM_LOG_ERROR("NULL info_sub"); + return; + } + + info_sub->frame_count++; + info_sub->elapsed_sec_accum += elapsed_sec; + + if (info_sub->elapsed_sec_peak < elapsed_sec) + info_sub->elapsed_sec_peak = elapsed_sec; +} + + +static void __camera_preview_cb_monitoring_info_end(camera_preview_cb_monitoring_info_s *info) +{ + gdouble elapsed_sec = 0.0; + gdouble elapsed_sec_interval = 0.0; + + if (!info) { + CAM_LOG_ERROR("NULL info"); + return; + } + + elapsed_sec = g_timer_elapsed(info->timer_calling, NULL); + elapsed_sec_interval = g_timer_elapsed(info->timer_interval, NULL); + + __camera_preview_cb_monitoring_info_sub_update(info->total, elapsed_sec); + __camera_preview_cb_monitoring_info_sub_update(info->interval, elapsed_sec); + + if (elapsed_sec_interval >= 1.0) { + CAM_LOG_INFO("id[%d], frame count[t:%llu,i:%llu], elapsed - avg[t:%dms,i:%dms], peak[t:%dms,i:%dms]", + info->stream_id, info->total->frame_count, info->interval->frame_count, + (int)((info->total->elapsed_sec_accum / (gdouble)info->total->frame_count) * 1000), + (int)((info->interval->elapsed_sec_accum / (gdouble)info->interval->frame_count) * 1000), + (int)(info->total->elapsed_sec_peak * 1000), (int)(info->interval->elapsed_sec_peak * 1000)); + + __camera_preview_cb_monitoring_info_sub_reset(info->interval); + } +} + + static void __camera_event_handler_preview(camera_cb_info_s *cb_info, char *recv_msg, int *tfd) { int i = 0; @@ -295,6 +377,7 @@ static void __camera_event_handler_preview(camera_cb_info_s *cb_info, char *recv MMCamcorderVideoStreamDataType *stream = NULL; camera_media_packet_data *mp_data = NULL; media_packet_h pkt = NULL; + camera_preview_cb_monitoring_info_s *monitoring_info = NULL; /* tfd[0]: MMCamcorderVideoStreamDataType tfd[1]: data_bo or zero copy bo[0] @@ -373,15 +456,23 @@ static void __camera_event_handler_preview(camera_cb_info_s *cb_info, char *recv cb_info->stream_data = stream; if (stream->extra_stream_id < 0) { + monitoring_info = cb_info->monitoring_info_preview; + __camera_preview_cb_monitoring_info_start(monitoring_info); + if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_PREVIEW]) ((camera_preview_cb)cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_PREVIEW])(&frame, cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_PREVIEW]); } else { + monitoring_info = cb_info->monitoring_info_preview_ex[stream->extra_stream_id]; + __camera_preview_cb_monitoring_info_start(monitoring_info); + if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_EXTRA_PREVIEW]) ((camera_extra_preview_cb)cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_EXTRA_PREVIEW])(&frame, stream->extra_stream_id, cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_EXTRA_PREVIEW]); } + __camera_preview_cb_monitoring_info_end(monitoring_info); + cb_info->stream_data = NULL; } @@ -414,8 +505,14 @@ static void __camera_event_handler_preview(camera_cb_info_s *cb_info, char *recv /* 1. media packet preview callback */ if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]) { media_packet_ref(pkt); + + monitoring_info = cb_info->monitoring_info_preview_mp; + __camera_preview_cb_monitoring_info_start(monitoring_info); + ((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]); + + __camera_preview_cb_monitoring_info_end(monitoring_info); } /* 2. call evas renderer */ @@ -2284,10 +2381,42 @@ static void __camera_mutex_cond_clear(camera_cb_info_s *cb_info) } +static camera_preview_cb_monitoring_info_s *__camera_preview_cb_monitoring_info_create(int stream_id) +{ + camera_preview_cb_monitoring_info_s *new_info = g_new0(camera_preview_cb_monitoring_info_s, 1); + + new_info->stream_id = stream_id; + new_info->total = g_new0(monitoring_info_sub_s, 1); + new_info->interval = g_new0(monitoring_info_sub_s, 1); + new_info->timer_calling = g_timer_new(); + new_info->timer_interval = g_timer_new(); + + CAM_LOG_INFO("create preview cb monitoring info[%p]", new_info); + + return new_info; +} + + +static void __camera_preview_cb_monitoring_info_destroy(camera_preview_cb_monitoring_info_s *info) +{ + if (!info) + return; + + g_timer_destroy(info->timer_calling); + g_timer_destroy(info->timer_interval); + g_free(info->total); + g_free(info->interval); + + CAM_LOG_INFO("destroy preview cb monitoring info[%p]", info); + + g_free(info); +} + + static camera_cb_info_s *__camera_client_callback_new(gint sockfd) { + int i = 0; camera_cb_info_s *cb_info = NULL; - gint i = 0; g_return_val_if_fail(sockfd > 0, NULL); @@ -2332,6 +2461,11 @@ static camera_cb_info_s *__camera_client_callback_new(gint sockfd) cb_info->is_server_connected = TRUE; + cb_info->monitoring_info_preview = __camera_preview_cb_monitoring_info_create(CAMERA_MONITORING_INFO_STREAM_ID_PREVIEW); + cb_info->monitoring_info_preview_mp = __camera_preview_cb_monitoring_info_create(CAMERA_MONITORING_INFO_STREAM_ID_PREVIEW_MP); + for (i = 0 ; i < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_MAX ; i++) + cb_info->monitoring_info_preview_ex[i] = __camera_preview_cb_monitoring_info_create(i); + return cb_info; //LCOV_EXCL_START ErrorExit: @@ -2352,6 +2486,8 @@ ErrorExit: static void __camera_client_callback_destroy(camera_cb_info_s *cb_info) { + int i = 0; + if (!cb_info) { CAM_LOG_ERROR("NULL cb_info"); return; @@ -2390,6 +2526,11 @@ static void __camera_client_callback_destroy(camera_cb_info_s *cb_info) cb_info->dp_interface = NULL; } + __camera_preview_cb_monitoring_info_destroy(cb_info->monitoring_info_preview); + __camera_preview_cb_monitoring_info_destroy(cb_info->monitoring_info_preview_mp); + for (i = 0 ; i < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_MAX ; i++) + __camera_preview_cb_monitoring_info_destroy(cb_info->monitoring_info_preview_ex[i]); + g_free(cb_info); } @@ -2743,6 +2884,7 @@ int camera_destroy(camera_h camera) int camera_start_preview(camera_h camera) { + int i = 0; int ret = CAMERA_ERROR_NONE; int *fds = NULL; muse_camera_api_e api = MUSE_CAMERA_API_START_PREVIEW; @@ -2768,6 +2910,11 @@ int camera_start_preview(camera_h camera) } if (current_state == CAMERA_STATE_CREATED) { + __camera_preview_cb_monitoring_info_reset(pc->cb_info->monitoring_info_preview); + __camera_preview_cb_monitoring_info_reset(pc->cb_info->monitoring_info_preview_mp); + for (i = 0 ; i < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_MAX ; i++) + __camera_preview_cb_monitoring_info_reset(pc->cb_info->monitoring_info_preview_ex[i]); + if (!__create_msg_handler_thread(&pc->cb_info->preview_cb_info, CAMERA_MESSAGE_HANDLER_TYPE_PREVIEW_CB, "cam:preview_cb", pc->cb_info)) { CAM_LOG_ERROR("preview_cb_info failed");