* @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation
* @retval #WEBRTC_ERROR_INVALID_STATE Invalid state
* @pre @a webrtc state must be set to #WEBRTC_STATE_NEGOTIATING.
+ * @see webrtc_state_changed_cb()
* @see webrtc_negotiation_needed_cb()
* @see webrtc_set_local_description()
*/
webrtc_callbacks_s encoded_video_frame_cb;
webrtc_callbacks_s data_channel_cb;
+ /* FIXME: Once signal is emitted by webrtcbin, it'll not be triggered
+ * even if the pipeline state is changed to NULL to PLAYING again.
+ * This variable could be removed, some improvements are applied to webrtcbin. */
+ bool negotiation_needed_cb_invoked;
+
webrtc_negotiation_states_s negotiation_states;
#ifdef TIZEN_FEATURE_RES_MGR
webrtc_resource_s resource;
return text;
}
-static bool __meet_gst_state(webrtc_state_e state, GstState gst_state)
+static bool __meet_gst_state(webrtc_state_e state, GstState gst_state, bool negotiation_needed_cb_invoked)
{
if (state == WEBRTC_STATE_IDLE && gst_state == GST_STATE_READY)
return true;
- if (state == WEBRTC_STATE_NEGOTIATING && gst_state == GST_STATE_PLAYING)
+ if (state == WEBRTC_STATE_NEGOTIATING && gst_state == GST_STATE_PLAYING && negotiation_needed_cb_invoked)
return true;
return false;
{
RET_IF(webrtc == NULL, "webrtc is NULL");
+ if (old == new)
+ return;
+
LOG_INFO("state is changed [%s] -> [%s]", __state_str[old], __state_str[new]);
if (webrtc->state_changed_cb.callback) {
break;
}
- if (__meet_gst_state(webrtc->pend_state, gst_state_new)) {
+ if (__meet_gst_state(webrtc->pend_state, gst_state_new, webrtc->negotiation_needed_cb_invoked)) {
webrtc_state_e old_state = webrtc->state;
webrtc->state = webrtc->pend_state;
g_mutex_unlock(&webrtc->mutex);
static void __webrtcbin_on_negotiation_needed_cb(GstElement *webrtcbin, gpointer user_data)
{
webrtc_s *webrtc = (webrtc_s *)user_data;
+ webrtc_state_e old_state;
RET_IF(webrtcbin == NULL, "webrtcbin is NULL");
RET_IF(webrtc == NULL, "webrtc is NULL");
+ g_mutex_lock(&webrtc->mutex);
+
+ old_state = webrtc->state;
+ webrtc->state = webrtc->pend_state;
+
+ g_mutex_unlock(&webrtc->mutex);
+ _invoke_state_changed_cb(webrtc, old_state, webrtc->state);
+ webrtc->negotiation_needed_cb_invoked = true;
+
if (webrtc->negotiation_needed_cb.callback == NULL) {
LOG_DEBUG("negotiation_needed_cb is NULL, skip it");
return;