_gst_init(_webrtc);
_gst_build_pipeline(_webrtc);
- _webrtc->state = WEBRTC_STATE_IDLE;
+ _webrtc->pend_state = WEBRTC_STATE_IDLE;
+ _webrtc->state = _webrtc->pend_state;
*webrtc = _webrtc;
g_mutex_lock(&_webrtc->mutex);
- /* set state to null here */
+ _gst_pipeline_set_state(webrtc, GST_STATE_NULL);
+
+ _webrtc->pend_state = WEBRTC_STATE_IDLE;
+ _webrtc->state = _webrtc->pend_state;
_gst_destroy_pipeline(_webrtc);
/* Implementation */
+ _gst_pipeline_set_state(webrtc, GST_STATE_PLAYING);
+ _webrtc->pend_state = WEBRTC_STATE_PLAYING;
+
g_mutex_unlock(&_webrtc->mutex);
LOG_INFO("webrtc[%p] is started", webrtc);
RET_VAL_IF(_webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
- LOG_DEBUG_ENTER();
-
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");
/* Implementation */
+ _gst_pipeline_set_state(webrtc, GST_STATE_READY);
+ _webrtc->pend_state = WEBRTC_STATE_IDLE;
+
g_mutex_unlock(&_webrtc->mutex);
LOG_INFO("webrtc[%p] is stopped", webrtc);
RET_VAL_IF(_webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
+ g_mutex_lock(&_webrtc->mutex);
+
*state = _webrtc->state;
+ g_mutex_unlock(&_webrtc->mutex);
+
LOG_INFO("state[%d]", *state);
return WEBRTC_ERROR_NONE;
LOG_INFO("stun_server[%s]", stun_server);
return WEBRTC_ERROR_NONE;
-}
\ No newline at end of file
+}
#include "webrtc.h"
#include "webrtc_private.h"
+static gboolean __meet_gst_state(webrtc_state_e state, GstState gst_state)
+{
+ if (state == WEBRTC_STATE_IDLE && gst_state == GST_STATE_READY)
+ return TRUE;
+
+ if (state == WEBRTC_STATE_PLAYING && gst_state == GST_STATE_PLAYING)
+ return TRUE;
+
+ return FALSE;
+}
+
static gboolean __bus_watch_cb(GstBus *bus, GstMessage *message, gpointer user_data)
{
webrtc_s *webrtc = (webrtc_s *)user_data;
gst_element_state_get_name(gst_state_pending));
LOG_INFO("GST_MESSAGE_STATE_CHANGED: %s", state_transition_name);
+ g_free(state_transition_name);
- /* FIXME : set pipeline state */
+ /* TODO: generate dot */
+
+ 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);
+ g_mutex_unlock(&webrtc->mutex);
+ break;
+ }
+
+ if (__meet_gst_state(webrtc->pend_state, gst_state_new)) {
+ LOG_INFO("webrtc state is changed [%d] -> [%d]", webrtc->state, webrtc->pend_state);
+ webrtc->state = webrtc->pend_state;
+ /* TODO: trigger state changed cb */
+ }
+ g_mutex_unlock(&webrtc->mutex);
- g_free(state_transition_name);
break;
case GST_MESSAGE_ASYNC_DONE:
return TRUE;
LOG_INFO("GST_MESSAGE_ASYNC_DONE");
-
break;
case GST_MESSAGE_EOS:
LOG_INFO("GST_MESSAGE_EOS end-of-stream");
-
break;
default:
}
}
+int _gst_pipeline_set_state(webrtc_s *webrtc, GstState state)
+{
+ GstStateChangeReturn ret;
+
+ RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
+ RET_VAL_IF(webrtc->gst.pipeline == NULL, WEBRTC_ERROR_INVALID_OPERATION, "pipeline is NULL");
+
+ ret = gst_element_set_state(webrtc->gst.pipeline, state);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ LOG_ERROR("failed to gst_element_set_state(), state[%s]", gst_element_state_get_name(state));
+ return WEBRTC_ERROR_INVALID_OPERATION;
+ }
+
+ return WEBRTC_ERROR_NONE;
+}
+