From e33fc7953bb08e45776dcbb54f01c607680c2c29 Mon Sep 17 00:00:00 2001 From: Sangchul Lee Date: Wed, 21 Jul 2021 20:53:59 +0900 Subject: [PATCH] webrtc_display: Add _set_display_type_and_surface() and use it display 'object' is renamed to 'surface'. Some codes regarding locking/unlocking display mutex are revised. Level of some logs are changed. [Version] 0.2.52 [Issue Type] Improvement Change-Id: Ib2e70ea2ac6506cb91edf4a3f036a22e6b3cf17f Signed-off-by: Sangchul Lee --- include/webrtc_private.h | 3 +- packaging/capi-media-webrtc.spec | 2 +- src/webrtc_display.c | 55 ++++++++++++++++++-------------- src/webrtc_sink.c | 11 +++---- src/webrtc_source.c | 9 +++--- 5 files changed, 43 insertions(+), 37 deletions(-) diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 9de7b9dc..405c0e8a 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -352,7 +352,7 @@ typedef struct _webrtc_tbm_s { } webrtc_tbm_s; typedef struct _webrtc_display { - void *object; + void *surface; int type; int overlay_surface_id; @@ -585,6 +585,7 @@ GstStructure* _get_structure_from_data_channel_options(bundle *options); webrtc_display_s *_alloc_display(void); void _release_display(webrtc_display_s *display); int _apply_display(webrtc_display_s *display); +void _set_display_type_and_surface(webrtc_display_s *display, webrtc_display_type_e type, void *surface); void _video_stream_decoded_cb(GstElement *object, GstBuffer *buffer, GstPad *pad, gpointer data); #ifndef TIZEN_TV diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index eb8969d7..1298c672 100644 --- a/packaging/capi-media-webrtc.spec +++ b/packaging/capi-media-webrtc.spec @@ -1,6 +1,6 @@ Name: capi-media-webrtc Summary: A WebRTC library in Tizen Native API -Version: 0.2.51 +Version: 0.2.52 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_display.c b/src/webrtc_display.c index 803eb73d..44248a30 100644 --- a/src/webrtc_display.c +++ b/src/webrtc_display.c @@ -643,19 +643,14 @@ static int __set_overlay_display(webrtc_display_s *display) RET_VAL_IF(display->type != WEBRTC_DISPLAY_TYPE_OVERLAY && display->type != WEBRTC_DISPLAY_TYPE_ECORE_WL, WEBRTC_ERROR_INVALID_OPERATION, "invalid display type(%d)", display->type); - g_mutex_lock(&display->mutex); - if (display->type == WEBRTC_DISPLAY_TYPE_ECORE_WL) type = MM_DISPLAY_TYPE_OVERLAY_EXT; - ret = mm_display_interface_set_display_mainloop_sync(display->mm_display, type, display->object, &display->overlay_surface_id); - RET_VAL_WITH_UNLOCK_IF(ret != MM_ERROR_NONE, WEBRTC_ERROR_INVALID_OPERATION, &display->mutex, - "failed to mm_display_interface_set_display_mainloop_sync()"); + ret = mm_display_interface_set_display_mainloop_sync(display->mm_display, type, display->surface, &display->overlay_surface_id); + RET_VAL_IF(ret != MM_ERROR_NONE, WEBRTC_ERROR_INVALID_OPERATION, "failed to mm_display_interface_set_display_mainloop_sync()"); LOG_INFO("overlay_surface_id[%d]", display->overlay_surface_id); - g_mutex_unlock(&display->mutex); - return WEBRTC_ERROR_NONE; } @@ -666,26 +661,18 @@ static int __set_evas_display(webrtc_display_s *display) RET_VAL_IF(display == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "display is NULL"); RET_VAL_IF(display->type != WEBRTC_DISPLAY_TYPE_EVAS, WEBRTC_ERROR_INVALID_OPERATION, "invalid display type(%d)", display->type); - g_mutex_lock(&display->mutex); - - ret = mm_display_interface_set_display_mainloop_sync(display->mm_display, MM_DISPLAY_TYPE_EVAS, display->object, NULL); - RET_VAL_WITH_UNLOCK_IF(ret != MM_ERROR_NONE, WEBRTC_ERROR_INVALID_OPERATION, &display->mutex, - "failed to mm_display_interface_set_display_mainloop_sync()"); + ret = mm_display_interface_set_display_mainloop_sync(display->mm_display, MM_DISPLAY_TYPE_EVAS, display->surface, NULL); + RET_VAL_IF(ret != MM_ERROR_NONE, WEBRTC_ERROR_INVALID_OPERATION, "failed to mm_display_interface_set_display_mainloop_sync()"); /* FIXE: get mode and rotation value from handle */ ret = mm_display_interface_evas_set_mode(display->mm_display, 0); /* 0: letter box, 1: origin size, 2: full screen */ - RET_VAL_WITH_UNLOCK_IF(ret != MM_ERROR_NONE, WEBRTC_ERROR_INVALID_OPERATION, &display->mutex, - "failed to mm_display_interface_evas_set_mode()"); + RET_VAL_IF(ret != MM_ERROR_NONE, WEBRTC_ERROR_INVALID_OPERATION, "failed to mm_display_interface_evas_set_mode()"); ret = mm_display_interface_evas_set_rotation(display->mm_display, 0); /* 0: not rotate, 1: 90 degree, 2, 180 degree, 3, 270 degree */ - RET_VAL_WITH_UNLOCK_IF(ret != MM_ERROR_NONE, WEBRTC_ERROR_INVALID_OPERATION, &display->mutex, - "failed to mm_display_interface_evas_set_rotation()"); + RET_VAL_IF(ret != MM_ERROR_NONE, WEBRTC_ERROR_INVALID_OPERATION, "failed to mm_display_interface_evas_set_rotation()"); ret = mm_display_interface_evas_set_visible(display->mm_display, true); - RET_VAL_WITH_UNLOCK_IF(ret != MM_ERROR_NONE, WEBRTC_ERROR_INVALID_OPERATION, &display->mutex, - "failed to mm_display_interface_evas_set_visible()"); - - g_mutex_unlock(&display->mutex); + RET_VAL_IF(ret != MM_ERROR_NONE, WEBRTC_ERROR_INVALID_OPERATION, "failed to mm_display_interface_evas_set_visible()"); return WEBRTC_ERROR_NONE; } @@ -696,15 +683,17 @@ int _apply_display(webrtc_display_s *display) RET_VAL_IF(display == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "display is NULL"); + g_mutex_lock(&display->mutex); + switch (display->type) { case WEBRTC_DISPLAY_TYPE_OVERLAY: - LOG_DEBUG("it's OVERLAY type"); + LOG_INFO("it's OVERLAY type"); ret = __set_overlay_display(display); break; case WEBRTC_DISPLAY_TYPE_EVAS: - LOG_DEBUG("it's EVAS type"); + LOG_INFO("it's EVAS type"); if (display->tbm == NULL) display->tbm = _alloc_tbm(); @@ -713,16 +702,19 @@ int _apply_display(webrtc_display_s *display) break; case WEBRTC_DISPLAY_TYPE_ECORE_WL: - LOG_DEBUG("it's ECORE_WL type"); + LOG_INFO("it's ECORE_WL type"); ret = __set_overlay_display(display); break; default: LOG_ERROR_IF_REACHED("type(%d)", display->type); - return WEBRTC_ERROR_INVALID_PARAMETER; + ret = WEBRTC_ERROR_INVALID_PARAMETER; + break; } + g_mutex_unlock(&display->mutex); + return ret; } @@ -742,6 +734,21 @@ webrtc_display_s *_alloc_display(void) return display; } +void _set_display_type_and_surface(webrtc_display_s *display, webrtc_display_type_e type, void *surface) +{ + RET_IF(display == NULL, "display is NULL"); + RET_IF(surface == NULL, "surface is NULL"); + + g_mutex_lock(&display->mutex); + + display->type = type; + display->surface = surface; + + LOG_INFO("display[%p, type:%d, surface:%p]", display, type, surface); + + g_mutex_unlock(&display->mutex); +} + void _release_display(webrtc_display_s *display) { RET_IF(display == NULL, "display is NULL"); diff --git a/src/webrtc_sink.c b/src/webrtc_sink.c index bba5879f..1b6a35c3 100644 --- a/src/webrtc_sink.c +++ b/src/webrtc_sink.c @@ -100,9 +100,9 @@ static const char *__get_videosink_factory_name(webrtc_display_s *display, webrt RET_VAL_IF(ini == NULL, NULL, "ini is NULL"); RET_VAL_IF(display_is_set == NULL, NULL, "display_is_set is NULL"); - if (display->object == NULL) { + if (display->surface == NULL) { *display_is_set = false; - LOG_INFO("display object is not set, use [%s]", ini->rendering_sink.v_sink_element); + LOG_INFO("display surface is not set, use [%s]", ini->rendering_sink.v_sink_element); return ini->rendering_sink.v_sink_element; } @@ -121,7 +121,7 @@ static const char *__get_videosink_factory_name(webrtc_display_s *display, webrt break; } - LOG_INFO("use [%s] for object[%p], type[%d]", factory_name, display->object, display->type); + LOG_INFO("use [%s] for surface[%p], type[%d]", factory_name, display->surface, display->type); return factory_name; } @@ -955,10 +955,9 @@ int _set_display_to_sink(webrtc_s *webrtc, unsigned int track_id, unsigned int t RET_VAL_IF(sink->display == NULL, WEBRTC_ERROR_INVALID_OPERATION, "sink->display is NULL"); } - LOG_INFO("track_id[%u] type[%d] object[%p]", track_id, type, display); + LOG_INFO("track_id[%u]", track_id); - sink->display->type = type; - sink->display->object = display; + _set_display_type_and_surface(sink->display, type, display); return _apply_display(sink->display); } diff --git a/src/webrtc_source.c b/src/webrtc_source.c index 973822e5..90e81fb4 100644 --- a/src/webrtc_source.c +++ b/src/webrtc_source.c @@ -3383,7 +3383,7 @@ static int __build_loopback_videosink(webrtc_gst_slot_s *source, GstElement *lin RET_VAL_IF(link_with == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "link_with is NULL"); RET_VAL_IF(source->webrtc == NULL, WEBRTC_ERROR_INVALID_OPERATION, "webrtc is NULL"); RET_VAL_IF(source->display == NULL, WEBRTC_ERROR_INVALID_OPERATION, "display is NULL"); - RET_VAL_IF(source->display->object == NULL, WEBRTC_ERROR_INVALID_OPERATION, "display->object is NULL"); + RET_VAL_IF(source->display->surface == NULL, WEBRTC_ERROR_INVALID_OPERATION, "display->surface is NULL"); webrtc = source->webrtc; @@ -3491,7 +3491,7 @@ static int __build_loopback_render_pipeline(webrtc_s *webrtc, webrtc_gst_slot_s RET_VAL_IF(source == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL"); if (type == MEDIA_TYPE_VIDEO) { RET_VAL_IF(source->display == NULL, WEBRTC_ERROR_INVALID_OPERATION, "display is NULL"); - RET_VAL_IF(source->display->object == NULL, WEBRTC_ERROR_INVALID_OPERATION, "display->object is NULL"); + RET_VAL_IF(source->display->surface == NULL, WEBRTC_ERROR_INVALID_OPERATION, "display->surface is NULL"); } pipeline_name = g_strdup_printf("webrtc-source_%u-%s-render-pipeline", source->id, type == MEDIA_TYPE_AUDIO ? "audio" : "video"); @@ -3617,10 +3617,9 @@ int _set_video_loopback(webrtc_s *webrtc, unsigned int source_id, unsigned int t RET_VAL_IF(source->display == NULL, WEBRTC_ERROR_INVALID_OPERATION, "source->display is NULL"); } - LOG_INFO("source_id[%u] type[%d] display[%p]", source_id, type, display); + LOG_INFO("source_id[%u]", source_id); - source->display->type = type; - source->display->object = display; + _set_display_type_and_surface(source->display, type, display); ret = _apply_display(source->display); if (ret != WEBRTC_ERROR_NONE) -- 2.34.1