From: Sangchul Lee Date: Fri, 9 Aug 2024 01:02:45 +0000 (+0900) Subject: Add webrtc_start_sync() X-Git-Tag: accepted/tizen/unified/20240821.081515~6 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=faa30bf01c33962da45c9fb7a37e64f18659e94b;p=platform%2Fcore%2Fapi%2Fwebrtc.git Add webrtc_start_sync() [Version] 1.1.23 [Issue Type] API Change-Id: I1093273002c4774835cdf067d89ef25ae138a3c3 Signed-off-by: Sangchul Lee --- diff --git a/include/webrtc.h b/include/webrtc.h index 5131a17b..de8d4490 100644 --- a/include/webrtc.h +++ b/include/webrtc.h @@ -940,12 +940,37 @@ int webrtc_create(webrtc_h *webrtc); * @pre webrtc_ice_candidate_cb() must be set by calling webrtc_set_ice_candidate_cb(). * @pre webrtc_media_packet_source_set_format() must be called if @a webrtc has a media packet source. * @pre @a webrtc state must be set to #WEBRTC_STATE_IDLE. + * @post webrtc_state_changed_cb() will be invoked. * @post @a webrtc state will be #WEBRTC_STATE_NEGOTIATING. * @see webrtc_create() * @see webrtc_stop() + * @see webrtc_start_sync() */ int webrtc_start(webrtc_h webrtc); +/** + * @brief Starts the WebRTC synchronously. + * @since_tizen 9.0 + * @remarks The main difference with webrtc_start() is that this returns after changing state to #WEBRTC_STATE_NEGOTIATING.\n + * webrtc_state_changed_cb() will not be invoked. + * @param[in] webrtc WebRTC handle + * @return @c 0 on success, + * otherwise a negative error value + * @retval #WEBRTC_ERROR_NONE Successful + * @retval #WEBRTC_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation + * @retval #WEBRTC_ERROR_INVALID_STATE Invalid state + * @retval #WEBRTC_ERROR_RESOURCE_FAILED Resource failed + * @pre webrtc_ice_candidate_cb() must be set by calling webrtc_set_ice_candidate_cb(). + * @pre webrtc_media_packet_source_set_format() must be called if @a webrtc has a media packet source. + * @pre @a webrtc state must be set to #WEBRTC_STATE_IDLE. + * @post @a webrtc state will be #WEBRTC_STATE_NEGOTIATING. + * @see webrtc_create() + * @see webrtc_start() + * @see webrtc_stop() + */ +int webrtc_start_sync(webrtc_h webrtc); + /** * @brief Stops the WebRTC. * @since_tizen 6.5 diff --git a/include/webrtc_internal.h b/include/webrtc_internal.h index f7660705..5a8e63d7 100644 --- a/include/webrtc_internal.h +++ b/include/webrtc_internal.h @@ -511,30 +511,6 @@ int webrtc_set_rtp_packet_drop_probability(webrtc_h webrtc, bool sender, float p */ int webrtc_get_rtp_packet_drop_probability(webrtc_h webrtc, bool sender, float *probability); -/** - * @internal - * @brief Starts the WebRTC synchronously. - * @since_tizen 8.0 - * @remarks The main difference with webrtc_start() is that this returns after changing state to #WEBRTC_STATE_NEGOTIATING.\n - * webrtc_state_changed_cb() will not be invoked. - * @param[in] webrtc WebRTC handle - * @return @c 0 on success, - * otherwise a negative error value - * @retval #WEBRTC_ERROR_NONE Successful - * @retval #WEBRTC_ERROR_INVALID_PARAMETER Invalid parameter - * @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation - * @retval #WEBRTC_ERROR_INVALID_STATE Invalid state - * @retval #WEBRTC_ERROR_RESOURCE_FAILED Resource failed - * @pre webrtc_ice_candidate_cb() must be set by calling webrtc_set_ice_candidate_cb(). - * @pre webrtc_media_packet_source_set_format() must be called if @a webrtc has a media packet source. - * @pre @a webrtc state must be set to #WEBRTC_STATE_IDLE. - * @post @a webrtc state is #WEBRTC_STATE_NEGOTIATING. - * @see webrtc_create() - * @see webrtc_start() - * @see webrtc_stop() - */ -int webrtc_start_sync(webrtc_h webrtc); - /** * @internal * @brief Strips the session description. diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index d5b9f3d6..09c3e752 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: 1.1.22 +Version: 1.1.23 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc.c b/src/webrtc.c index d20fed62..e9042564 100644 --- a/src/webrtc.c +++ b/src/webrtc.c @@ -227,7 +227,6 @@ int webrtc_start(webrtc_h webrtc) RET_VAL_IF(_webrtc->ice_candidate_cb.callback == NULL, WEBRTC_ERROR_INVALID_OPERATION, "the ice candidate callback should be set"); RET_VAL_IF(_webrtc->state != WEBRTC_STATE_IDLE, WEBRTC_ERROR_INVALID_STATE, "the state should be IDLE"); - RET_VAL_IF(_webrtc->gst.webrtcbin == NULL, WEBRTC_ERROR_INVALID_OPERATION, "webrtcbin is NULL"); RET_VAL_IF(!_check_if_format_is_set_to_packet_sources(_webrtc), WEBRTC_ERROR_INVALID_OPERATION, "the media format should be set"); RET_VAL_IF(!_check_if_path_is_set_to_file_sources(_webrtc), WEBRTC_ERROR_INVALID_OPERATION, "the media path should be set"); RET_VAL_IF(!_check_if_codec_is_set_to_null_sources(_webrtc), WEBRTC_ERROR_INVALID_OPERATION, "transceiver codec is should be set"); @@ -249,6 +248,57 @@ int webrtc_start(webrtc_h webrtc) return WEBRTC_ERROR_NONE; } +int webrtc_start_sync(webrtc_h webrtc) +{ + int ret = WEBRTC_ERROR_NONE; + g_autoptr(GMutexLocker) locker = NULL; + webrtc_s *_webrtc = (webrtc_s *)webrtc; + gint64 end_time; + + RET_VAL_IF(_webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL"); + + locker = g_mutex_locker_new(&_webrtc->mutex); + + RET_VAL_IF(_webrtc->ice_candidate_cb.callback == NULL, WEBRTC_ERROR_INVALID_OPERATION, "the ice candidate callback should be set"); + RET_VAL_IF(_webrtc->state != WEBRTC_STATE_IDLE, WEBRTC_ERROR_INVALID_STATE, "the state should be IDLE"); + RET_VAL_IF(!_check_if_format_is_set_to_packet_sources(_webrtc), WEBRTC_ERROR_INVALID_OPERATION, "the media format should be set"); + RET_VAL_IF(!_check_if_path_is_set_to_file_sources(_webrtc), WEBRTC_ERROR_INVALID_OPERATION, "the media path should be set"); + RET_VAL_IF(!_check_if_codec_is_set_to_null_sources(_webrtc), WEBRTC_ERROR_INVALID_OPERATION, "transceiver codec is should be set"); + +#ifndef TIZEN_TV + if ((ret = _acquire_resource_if_needed(_webrtc)) != WEBRTC_ERROR_NONE) + return ret; +#endif + ret = _complete_sources(_webrtc); + RET_VAL_IF(ret != WEBRTC_ERROR_NONE, ret, "failed to complete sources"); + + g_mutex_lock(&_webrtc->state_mutex); + + _webrtc->is_start_sync = true; + _webrtc->pend_state = WEBRTC_STATE_NEGOTIATING; + + if ((ret = _gst_pipeline_set_state(_webrtc, GST_STATE_PLAYING)) != WEBRTC_ERROR_NONE) { + _webrtc->pend_state = WEBRTC_STATE_IDLE; + goto out; + } + + end_time = g_get_monotonic_time() + 10 * G_TIME_SPAN_SECOND; + LOG_DEBUG("wait..."); + if (!g_cond_wait_until(&_webrtc->state_cond, &_webrtc->state_mutex, end_time)) { + LOG_ERROR("timeout of g_cond_wait_until()"); + _webrtc->pend_state = WEBRTC_STATE_IDLE; + ret = WEBRTC_ERROR_INVALID_OPERATION; + goto out; + } + + LOG_INFO("webrtc[%p] is started", webrtc); + +out: + _webrtc->is_start_sync = false; + g_mutex_unlock(&_webrtc->state_mutex); + return ret; +} + int webrtc_stop(webrtc_h webrtc) { webrtc_s *_webrtc = (webrtc_s *)webrtc; diff --git a/src/webrtc_internal.c b/src/webrtc_internal.c index 0a633814..a4f5d71b 100644 --- a/src/webrtc_internal.c +++ b/src/webrtc_internal.c @@ -567,56 +567,4 @@ int webrtc_get_rtp_packet_drop_probability(webrtc_h webrtc, bool sender, float * return _get_packet_drop_probability(webrtc, sender, probability); } - -int webrtc_start_sync(webrtc_h webrtc) -{ - int ret = WEBRTC_ERROR_NONE; - g_autoptr(GMutexLocker) locker = NULL; - webrtc_s *_webrtc = (webrtc_s *)webrtc; - gint64 end_time; - - RET_VAL_IF(_webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL"); - - locker = g_mutex_locker_new(&_webrtc->mutex); - - RET_VAL_IF(_webrtc->ice_candidate_cb.callback == NULL, WEBRTC_ERROR_INVALID_OPERATION, "the ice candidate callback should be set"); - RET_VAL_IF(_webrtc->state != WEBRTC_STATE_IDLE, WEBRTC_ERROR_INVALID_STATE, "the state should be IDLE"); - RET_VAL_IF(_webrtc->gst.webrtcbin == NULL, WEBRTC_ERROR_INVALID_OPERATION, "webrtcbin is NULL"); - RET_VAL_IF(!_check_if_format_is_set_to_packet_sources(_webrtc), WEBRTC_ERROR_INVALID_OPERATION, "the media format should be set"); - RET_VAL_IF(!_check_if_path_is_set_to_file_sources(_webrtc), WEBRTC_ERROR_INVALID_OPERATION, "the media path should be set"); - RET_VAL_IF(!_check_if_codec_is_set_to_null_sources(_webrtc), WEBRTC_ERROR_INVALID_OPERATION, "transceiver codec is should be set"); - -#ifndef TIZEN_TV - if ((ret = _acquire_resource_if_needed(_webrtc)) != WEBRTC_ERROR_NONE) - return ret; -#endif - ret = _complete_sources(_webrtc); - RET_VAL_IF(ret != WEBRTC_ERROR_NONE, ret, "failed to complete sources"); - - g_mutex_lock(&_webrtc->state_mutex); - - _webrtc->is_start_sync = true; - _webrtc->pend_state = WEBRTC_STATE_NEGOTIATING; - - if ((ret = _gst_pipeline_set_state(_webrtc, GST_STATE_PLAYING)) != WEBRTC_ERROR_NONE) { - _webrtc->pend_state = WEBRTC_STATE_IDLE; - goto out; - } - - end_time = g_get_monotonic_time() + 10 * G_TIME_SPAN_SECOND; - LOG_DEBUG("wait..."); - if (!g_cond_wait_until(&_webrtc->state_cond, &_webrtc->state_mutex, end_time)) { - LOG_ERROR("timeout of g_cond_wait_until()"); - _webrtc->pend_state = WEBRTC_STATE_IDLE; - ret = WEBRTC_ERROR_INVALID_OPERATION; - goto out; - } - - LOG_INFO("webrtc[%p] is started", webrtc); - -out: - _webrtc->is_start_sync = false; - g_mutex_unlock(&_webrtc->state_mutex); - return ret; -} //LCOV_EXCL_STOP