static void kms_recorder_endpoint_stopped (KmsUriEndpoint * obj) { KmsRecorderEndpoint *self = KMS_RECORDER_ENDPOINT (obj); kms_recorder_endpoint_change_state (self); if (kms_base_media_muxer_get_state (self->priv->mux) >= GST_STATE_PAUSED) { kms_recorder_endpoint_send_eos_to_appsrcs (self); self->priv->stopping = TRUE; } kms_recorder_endpoint_remove_pads (self); // Reset base time data BASE_TIME_LOCK (self); g_object_set_data_full (G_OBJECT (self), BASE_TIME_DATA, NULL, NULL); self->priv->paused_time = G_GUINT64_CONSTANT (0); self->priv->paused_start = GST_CLOCK_TIME_NONE; BASE_TIME_UNLOCK (self); if (kms_base_media_muxer_get_state (self->priv->mux) < GST_STATE_PAUSED && !self->priv->stopping) { kms_base_media_muxer_set_state (self->priv->mux, GST_STATE_NULL); kms_recorder_endpoint_state_changed (self, KMS_URI_ENDPOINT_STATE_STOP); } }
static void kms_recorder_endpoint_started (KmsUriEndpoint * obj) { KmsRecorderEndpoint *self = KMS_RECORDER_ENDPOINT (obj); kms_recorder_endpoint_create_parent_directories (self); kms_recorder_endpoint_change_state (self); /* Set internal pipeline to playing */ kms_base_media_muxer_set_state (self->priv->mux, GST_STATE_PLAYING); BASE_TIME_LOCK (self); if (GST_CLOCK_TIME_IS_VALID (self->priv->paused_start)) { self->priv->paused_time += gst_clock_get_time (kms_base_media_muxer_get_clock (self->priv->mux)) - self->priv->paused_start; self->priv->paused_start = GST_CLOCK_TIME_NONE; } BASE_TIME_UNLOCK (self); kms_recorder_generate_pads (self); kms_recorder_endpoint_state_changed (self, KMS_URI_ENDPOINT_STATE_START); }
static void kms_recorder_endpoint_dispose (GObject * object) { KmsRecorderEndpoint *self = KMS_RECORDER_ENDPOINT (object); GST_DEBUG_OBJECT (self, "dispose"); KMS_ELEMENT_LOCK (KMS_ELEMENT (self)); if (self->priv->mux != NULL) { if (kms_base_media_muxer_get_state (self->priv->mux) != GST_STATE_NULL) { GST_ELEMENT_WARNING (self, RESOURCE, BUSY, ("Recorder may have buffers to save"), ("Disposing recorder when it isn't stopped.")); } kms_base_media_muxer_set_state (self->priv->mux, GST_STATE_NULL); if (self->priv->stopping) { GST_WARNING_OBJECT (self, "Forcing pending stop operation to finish"); kms_recorder_endpoint_state_changed (self, KMS_URI_ENDPOINT_STATE_STOP); self->priv->stopping = FALSE; } } KMS_ELEMENT_UNLOCK (KMS_ELEMENT (self)); g_mutex_clear (&self->priv->base_time_lock); /* clean up as possible. may be called multiple times */ G_OBJECT_CLASS (kms_recorder_endpoint_parent_class)->dispose (object); }
static void kms_recorder_endpoint_paused (KmsUriEndpoint * obj) { KmsRecorderEndpoint *self = KMS_RECORDER_ENDPOINT (obj); GstClock *clk; kms_recorder_endpoint_change_state (self, KMS_URI_ENDPOINT_STATE_PAUSE); kms_recorder_endpoint_remove_pads (self); KMS_ELEMENT_UNLOCK (self); /* Set internal pipeline to GST_STATE_PAUSED */ kms_base_media_muxer_set_state (self->priv->mux, GST_STATE_PAUSED); KMS_ELEMENT_LOCK (self); clk = kms_base_media_muxer_get_clock (self->priv->mux); if (clk) { self->priv->paused_start = gst_clock_get_time (clk); } kms_recorder_endpoint_state_changed (self, KMS_URI_ENDPOINT_STATE_PAUSE); }
static void kms_recorder_endpoint_send_eos_to_appsrcs (KmsRecorderEndpoint * self) { if (g_hash_table_size (self->priv->srcs) == 0) { KMS_ELEMENT_UNLOCK (KMS_ELEMENT (self)); kms_base_media_muxer_set_state (self->priv->mux, GST_STATE_NULL); KMS_ELEMENT_LOCK (KMS_ELEMENT (self)); return; } KMS_ELEMENT_UNLOCK (KMS_ELEMENT (self)); kms_base_media_muxer_set_state (self->priv->mux, GST_STATE_PLAYING); KMS_ELEMENT_LOCK (KMS_ELEMENT (self)); g_hash_table_foreach (self->priv->srcs, (GHFunc) send_eos_cb, NULL); }
static void kms_recorder_endpoint_send_eos_to_appsrcs (KmsRecorderEndpoint * self) { KMS_ELEMENT_LOCK (KMS_ELEMENT (self)); if (g_hash_table_size (self->priv->srcs) == 0) { kms_base_media_muxer_set_state (self->priv->mux, GST_STATE_NULL); kms_recorder_endpoint_state_changed (self, KMS_URI_ENDPOINT_STATE_STOP); goto end; } kms_base_media_muxer_set_state (self->priv->mux, GST_STATE_PLAYING); g_hash_table_foreach (self->priv->srcs, (GHFunc) send_eos_cb, NULL); end: KMS_ELEMENT_UNLOCK (KMS_ELEMENT (self)); }
static void kms_recorder_endpoint_on_eos (KmsBaseMediaMuxer * obj, gpointer user_data) { KmsRecorderEndpoint *recorder = KMS_RECORDER_ENDPOINT (user_data); GST_DEBUG_OBJECT (recorder, "Received EOS in muxing pipeline, setting NULL state"); kms_base_media_muxer_set_state (recorder->priv->mux, GST_STATE_NULL); KMS_ELEMENT_LOCK (KMS_ELEMENT (recorder)); if (recorder->priv->stopping) { GST_WARNING_OBJECT (recorder, "Releasing pending pads"); g_slist_foreach (recorder->priv->pending_pads, (GFunc) kms_recorder_release_pending_pad, recorder); g_slist_free_full (recorder->priv->pending_pads, g_free); recorder->priv->pending_pads = NULL; recorder->priv->stopping = FALSE; } KMS_ELEMENT_UNLOCK (KMS_ELEMENT (recorder)); }