WEBRTC_STATE_NEGOTIATING is added.
[Version] 0.1.22
[Issue Type] API
Change-Id: Ibedaadb1f82e5482174da6d85f46e7f42073cd8a
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
*/
typedef enum
{
- WEBRTC_STATE_IDLE, /**< Created but not started */
- WEBRTC_STATE_PLAYING, /**< Started */
+ WEBRTC_STATE_IDLE, /**< Created but not started */
+ WEBRTC_STATE_NEGOTIATING, /**< Started but negotiation stage */
+ WEBRTC_STATE_PLAYING, /**< Started all streams */
} webrtc_state_e;
/**
* @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation
* @retval #WEBRTC_ERROR_INVALID_STATE Invalid state
* @pre @a webrtc state must be set to #WEBRTC_STATE_IDLE.
- * @post @a webrtc state will be #WEBRTC_STATE_PLAYING.
+ * @post @a webrtc state will be #WEBRTC_STATE_NEGOTIATING.
* @see webrtc_create()
* @see webrtc_stop()
*/
* @retval #WEBRTC_ERROR_INVALID_PARAMETER Invalid parameter
* @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation
* @retval #WEBRTC_ERROR_INVALID_STATE Invalid state
- * @pre @a webrtc state will be #WEBRTC_STATE_PLAYING.
+ * @pre @a webrtc state must be set to #WEBRTC_STATE_NEGOTIATING or #WEBRTC_STATE_PLAYING.
* @post @a webrtc state will be #WEBRTC_STATE_IDLE.
* @see webrtc_create()
* @see webrtc_start()
* @retval #WEBRTC_ERROR_INVALID_PARAMETER Invalid parameter
* @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation
* @retval #WEBRTC_ERROR_INVALID_STATE Invalid state
- * @pre @a webrtc state must be set to #WEBRTC_STATE_PLAYING.
+ * @pre @a webrtc state must be set to #WEBRTC_STATE_NEGOTIATING.
* @see webrtc_negotiation_needed_cb()
* @see webrtc_set_local_description()
*/
* @retval #WEBRTC_ERROR_INVALID_PARAMETER Invalid parameter
* @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation
* @retval #WEBRTC_ERROR_INVALID_STATE Invalid state
- * @pre @a webrtc state must be set to #WEBRTC_STATE_PLAYING.
+ * @pre @a webrtc state must be set to #WEBRTC_STATE_NEGOTIATING.
* @see webrtc_set_local_description()
*/
int webrtc_create_answer(webrtc_h webrtc, char **answer);
* @retval #WEBRTC_ERROR_INVALID_PARAMETER Invalid parameter
* @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation
* @retval #WEBRTC_ERROR_INVALID_STATE Invalid state
- * @pre @a webrtc state must be set to #WEBRTC_STATE_PLAYING.
+ * @pre @a webrtc state must be set to #WEBRTC_STATE_NEGOTIATING.
* @see webrtc_create_offer()
* @see webrtc_create_answer()
*/
* @retval #WEBRTC_ERROR_INVALID_PARAMETER Invalid parameter
* @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation
* @retval #WEBRTC_ERROR_INVALID_STATE Invalid state
- * @pre @a webrtc state must be set to #WEBRTC_STATE_PLAYING.
+ * @pre @a webrtc state must be set to #WEBRTC_STATE_NEGOTIATING.
*/
int webrtc_set_remote_description(webrtc_h webrtc, const char *description);
* @retval #WEBRTC_ERROR_INVALID_PARAMETER Invalid parameter
* @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation
* @retval #WEBRTC_ERROR_INVALID_STATE Invalid state
- * @pre @a webrtc state must be set to #WEBRTC_STATE_PLAYING.
+ * @pre @a webrtc state must be set to #WEBRTC_STATE_NEGOTIATING.
*/
int webrtc_add_ice_candidate(webrtc_h webrtc, const char *candidate);
Name: capi-media-webrtc
Summary: A WebRTC library in Tizen Native API
-Version: 0.1.21
+Version: 0.1.22
Release: 0
Group: Multimedia/API
License: Apache-2.0
RET_VAL_WITH_UNLOCK_IF(_webrtc->gst.webrtcbin == NULL, WEBRTC_ERROR_INVALID_OPERATION, &_webrtc->mutex, "webrtcbin is NULL");
_gst_pipeline_set_state(webrtc, GST_STATE_PLAYING);
- _webrtc->pend_state = WEBRTC_STATE_PLAYING;
+ _webrtc->pend_state = WEBRTC_STATE_NEGOTIATING;
g_mutex_unlock(&_webrtc->mutex);
g_mutex_lock(&_webrtc->mutex);
- RET_VAL_WITH_UNLOCK_IF(_webrtc->state != WEBRTC_STATE_PLAYING, WEBRTC_ERROR_INVALID_STATE, &_webrtc->mutex, "the state should be PLAYING");
+ RET_VAL_WITH_UNLOCK_IF(_webrtc->state == WEBRTC_STATE_IDLE, WEBRTC_ERROR_INVALID_STATE, &_webrtc->mutex, "the state should not be IDLE");
_gst_pipeline_set_state(webrtc, GST_STATE_READY);
_webrtc->pend_state = WEBRTC_STATE_IDLE;
g_mutex_lock(&_webrtc->mutex);
- RET_VAL_WITH_UNLOCK_IF(_webrtc->state != WEBRTC_STATE_PLAYING, WEBRTC_ERROR_INVALID_STATE, &_webrtc->mutex, "the state should be PLAYING");
+ RET_VAL_WITH_UNLOCK_IF(_webrtc->state != WEBRTC_STATE_NEGOTIATING, WEBRTC_ERROR_INVALID_STATE, &_webrtc->mutex, "the state should be NEGOTIATING");
LOG_INFO("offer[%p]", offer);
g_mutex_lock(&_webrtc->mutex);
- RET_VAL_WITH_UNLOCK_IF(_webrtc->state != WEBRTC_STATE_PLAYING, WEBRTC_ERROR_INVALID_STATE, &_webrtc->mutex, "the state should be PLAYING");
+ RET_VAL_WITH_UNLOCK_IF(_webrtc->state != WEBRTC_STATE_NEGOTIATING, WEBRTC_ERROR_INVALID_STATE, &_webrtc->mutex, "the state should be NEGOTIATING");
/* FIXME: remote description should be set before this API */
LOG_INFO("answer[%p]", answer);
g_mutex_lock(&_webrtc->mutex);
- RET_VAL_WITH_UNLOCK_IF(_webrtc->state != WEBRTC_STATE_PLAYING, WEBRTC_ERROR_INVALID_STATE, &_webrtc->mutex, "the state should be PLAYING");
+ RET_VAL_WITH_UNLOCK_IF(_webrtc->state != WEBRTC_STATE_NEGOTIATING, WEBRTC_ERROR_INVALID_STATE, &_webrtc->mutex, "the state should be NEGOTIATING");
LOG_INFO("description[ %s ]", description);
g_mutex_lock(&_webrtc->mutex);
- RET_VAL_WITH_UNLOCK_IF(_webrtc->state != WEBRTC_STATE_PLAYING, WEBRTC_ERROR_INVALID_STATE, &_webrtc->mutex, "the state should be PLAYING");
+ RET_VAL_WITH_UNLOCK_IF(_webrtc->state != WEBRTC_STATE_NEGOTIATING, WEBRTC_ERROR_INVALID_STATE, &_webrtc->mutex, "the state should be NEGOTIATING");
LOG_INFO("description[ %s ]", description);
g_mutex_lock(&_webrtc->mutex);
- RET_VAL_WITH_UNLOCK_IF(_webrtc->state != WEBRTC_STATE_PLAYING, WEBRTC_ERROR_INVALID_STATE, &_webrtc->mutex, "the state should be PLAYING");
+ RET_VAL_WITH_UNLOCK_IF(_webrtc->state != WEBRTC_STATE_NEGOTIATING, WEBRTC_ERROR_INVALID_STATE, &_webrtc->mutex, "the state should be NEGOTIATING");
LOG_INFO("candidate[ %s ]", candidate);
} \
} while (0)
+static const char* __state_str[] = {
+ "IDLE",
+ "NEGOTIATING",
+ "PLAYING",
+};
+
/* Use g_free() to release the return value. */
static gchar* __get_string_from_json_object(JsonObject *object)
{
if (state == WEBRTC_STATE_IDLE && gst_state == GST_STATE_READY)
return TRUE;
- if (state == WEBRTC_STATE_PLAYING && gst_state == GST_STATE_PLAYING)
+ if (state == WEBRTC_STATE_NEGOTIATING && gst_state == GST_STATE_PLAYING)
return TRUE;
return FALSE;
}
+static void __invoke_state_changed_cb(webrtc_s *webrtc, webrtc_state_e old, webrtc_state_e new)
+{
+ RET_IF(webrtc == NULL, "webrtc is NULL");
+
+ LOG_INFO("state is changed [%s] -> [%s]", __state_str[old], __state_str[new]);
+
+ if (webrtc->state_changed_cb.callback) {
+ LOG_DEBUG(">>> callback[%p], user_data[%p]", webrtc->state_changed_cb.callback, webrtc->state_changed_cb.user_data);
+ ((webrtc_state_changed_cb)(webrtc->state_changed_cb.callback))((webrtc_h)webrtc, old, new, webrtc->state_changed_cb.user_data);
+ LOG_DEBUG("<<< end of the callback");
+ }
+}
+
static gboolean __bus_watch_cb(GstBus *bus, GstMessage *message, gpointer user_data)
{
webrtc_s *webrtc = (webrtc_s *)user_data;
g_mutex_lock(&webrtc->mutex);
if (webrtc->pend_state == webrtc->state) {
- LOG_DEBUG("pend_state(%d) is same with current state(%d)", webrtc->pend_state, webrtc->state);
+ LOG_DEBUG("pend_state[%s] is same with current state", __state_str[webrtc->pend_state]);
g_mutex_unlock(&webrtc->mutex);
break;
}
if (__meet_gst_state(webrtc->pend_state, gst_state_new)) {
webrtc_state_e old_state = webrtc->state;
-
- LOG_INFO("webrtc state is changed [%d] -> [%d]", webrtc->state, webrtc->pend_state);
webrtc->state = webrtc->pend_state;
- if (webrtc->state_changed_cb.callback) {
- LOG_DEBUG(">>> invoke state_changed_cb[%p], user_data[%p]",
- webrtc->state_changed_cb.callback, webrtc->state_changed_cb.user_data);
- ((webrtc_state_changed_cb)(webrtc->state_changed_cb.callback))((webrtc_h)webrtc, old_state, webrtc->state, webrtc->state_changed_cb.user_data);
- LOG_DEBUG("<<< end of the callback");
- }
+ __invoke_state_changed_cb(webrtc, old_state, webrtc->state);
}
g_mutex_unlock(&webrtc->mutex);
switch (peer_connection_state) {
case GST_WEBRTC_PEER_CONNECTION_STATE_NEW:
new_state = "NEW";
+ if (webrtc->state == WEBRTC_STATE_NEGOTIATING) {
+ webrtc_state_e old_state = webrtc->state;
+ webrtc->state = webrtc->pend_state = WEBRTC_STATE_PLAYING;
+ __invoke_state_changed_cb(webrtc, old_state, webrtc->state);
+ }
break;
+
case GST_WEBRTC_PEER_CONNECTION_STATE_CONNECTING:
new_state = "CONNECTING";
break;
+
case GST_WEBRTC_PEER_CONNECTION_STATE_CONNECTED:
new_state = "CONNECTED";
break;
+
+ /* FIXME: error forwarding in case of disconnection/failed via error callback */
case GST_WEBRTC_PEER_CONNECTION_STATE_DISCONNECTED:
new_state = "DISCONNECTED";
break;
+
case GST_WEBRTC_PEER_CONNECTION_STATE_FAILED:
new_state = "FAILED";
break;
+
case GST_WEBRTC_PEER_CONNECTION_STATE_CLOSED:
new_state = "CLOSED";
break;
case GST_WEBRTC_SIGNALING_STATE_STABLE:
new_state = "STABLE";
break;
+
case GST_WEBRTC_SIGNALING_STATE_CLOSED:
new_state = "CLOSED";
break;
+
case GST_WEBRTC_SIGNALING_STATE_HAVE_LOCAL_OFFER:
new_state = "HAVE_LOCAL_OFFER";
break;
+
case GST_WEBRTC_SIGNALING_STATE_HAVE_REMOTE_OFFER:
new_state = "HAVE_REMOTE_OFFER";
break;
+
case GST_WEBRTC_SIGNALING_STATE_HAVE_LOCAL_PRANSWER:
new_state = "HAVE_LOCAL_PRANSWER";
break;
+
case GST_WEBRTC_SIGNALING_STATE_HAVE_REMOTE_PRANSWER:
new_state = "HAVE_REMOTE_PRANSWER";
break;
case GST_WEBRTC_ICE_GATHERING_STATE_NEW:
new_state = "NEW";
break;
+
case GST_WEBRTC_ICE_GATHERING_STATE_GATHERING:
new_state = "GATHERING";
break;
+
case GST_WEBRTC_ICE_GATHERING_STATE_COMPLETE:
new_state = "COMPLETE";
break;
case GST_WEBRTC_ICE_CONNECTION_STATE_NEW:
new_state = "NEW";
break;
+
case GST_WEBRTC_ICE_CONNECTION_STATE_CHECKING:
new_state = "CHECKING";
break;
+
case GST_WEBRTC_ICE_CONNECTION_STATE_CONNECTED:
new_state = "CONNECTED";
break;
+
case GST_WEBRTC_ICE_CONNECTION_STATE_COMPLETED:
new_state = "COMPLETED";
break;
+
case GST_WEBRTC_ICE_CONNECTION_STATE_FAILED:
new_state = "FAILED";
break;
+
case GST_WEBRTC_ICE_CONNECTION_STATE_DISCONNECTED:
new_state = "DISCONNECTED";
break;
+
case GST_WEBRTC_ICE_CONNECTION_STATE_CLOSED:
new_state = "CLOSED";
break;