/* Instruct the pipeline to seek to a different position */ void gst_native_set_position (JNIEnv* env, jobject thiz, int milliseconds) { CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id); if (!data) return; gint64 desired_position = (gint64)(milliseconds * GST_MSECOND); if (data->state >= GST_STATE_PAUSED) { execute_seek(desired_position, data); } else { GST_DEBUG ("Scheduling seek to %" GST_TIME_FORMAT " for later", GST_TIME_ARGS (desired_position)); data->desired_position = desired_position; } }
void state_changed_cb(GstBus *bus, GstMessage *msg, CustomData *data) { GstState old_state, new_state, pending_state; gst_message_parse_state_changed(msg, &old_state, &new_state, &pending_state); /* Only pay attention to messages coming from the pipeline, not its children */ if (GST_MESSAGE_SRC(msg) == GST_OBJECT(data->pipeline)) { data->state = new_state; if (new_state == GST_STATE_PLAYING) { data->buffering_time = 0; gplayer_playback_running(data); if (GST_CLOCK_TIME_IS_VALID(data->desired_position)) { execute_seek(data->desired_position, data); } } } }
/* Notify UI about pipeline state changes */ static void state_changed_cb (GstBus *bus, GstMessage *msg, CustomData *data) { GstState old_state, new_state, pending_state; gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state); /* Only pay attention to messages coming from the pipeline, not its children */ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data->pipeline)) { data->state = new_state; gchar *message = g_strdup_printf("State changed to %s", gst_element_state_get_name(new_state)); set_ui_message(message, data); g_free (message); /* The Ready to Paused state change is particularly interesting: */ if (old_state == GST_STATE_READY && new_state == GST_STATE_PAUSED) { /* By now the sink already knows the media size */ check_media_size(data); /* If there was a scheduled seek, perform it now that we have moved to the Paused state */ if (GST_CLOCK_TIME_IS_VALID (data->desired_position)) execute_seek (data->desired_position, data); } } }
/* Called when the End Of the Stream is reached. Just move to the beginning of the media and pause. */ static void eos_cb (GstBus *bus, GstMessage *msg, CustomData *data) { data->target_state = GST_STATE_PAUSED; data->is_live = (gst_element_set_state (data->pipeline, GST_STATE_PAUSED) == GST_STATE_CHANGE_NO_PREROLL); execute_seek (0, data); }
/* Delayed seek callback. This gets called by the timer setup in the above function. */ static gboolean delayed_seek_cb (CustomData *data) { GST_DEBUG ("Doing delayed seek to %" GST_TIME_FORMAT, GST_TIME_ARGS (data->desired_position)); execute_seek (data->desired_position, data); return FALSE; }