static void kms_recorder_endpoint_new_media_muxer (KmsRecorderEndpoint * self) { GstBus *bus; kms_recorder_endpoint_create_base_media_muxer (self); g_signal_connect (self->priv->mux, "on-sink-added", G_CALLBACK (kms_recorder_endpoint_on_sink_added), self); kms_recorder_endpoint_update_media_stats (self); bus = kms_base_media_muxer_get_bus (self->priv->mux); gst_bus_set_sync_handler (bus, bus_sync_signal_handler, self, NULL); g_object_unref (bus); if (kms_recording_profile_supports_type (self->priv->profile, KMS_ELEMENT_PAD_TYPE_AUDIO)) { kms_recorder_endpoint_add_appsink (self, KMS_ELEMENT_PAD_TYPE_AUDIO, NULL, AUDIO_STREAM_NAME RECORDER_DEFAULT_SUFFIX, FALSE); } if (kms_recording_profile_supports_type (self->priv->profile, KMS_ELEMENT_PAD_TYPE_VIDEO)) { kms_recorder_endpoint_add_appsink (self, KMS_ELEMENT_PAD_TYPE_VIDEO, NULL, VIDEO_STREAM_NAME RECORDER_DEFAULT_SUFFIX, FALSE); } }
static void kms_recorder_endpoint_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { KmsRecorderEndpoint *self = KMS_RECORDER_ENDPOINT (object); KMS_ELEMENT_LOCK (KMS_ELEMENT (self)); switch (property_id) { case PROP_DVR: self->priv->use_dvr = g_value_get_boolean (value); break; case PROP_PROFILE:{ if (self->priv->profile == KMS_RECORDING_PROFILE_NONE) { self->priv->profile = g_value_get_enum (value); if (self->priv->profile != KMS_RECORDING_PROFILE_NONE) { GstElement *sink; GstBus *bus; sink = kms_recorder_endpoint_create_sink (self); self->priv->mux = kms_muxing_pipeline_new (KMS_MUXING_PIPELINE_PROFILE, self->priv->profile, KMS_MUXING_PIPELINE_SINK, sink, NULL); g_object_unref (sink); bus = kms_muxing_pipeline_get_bus (self->priv->mux); gst_bus_set_sync_handler (bus, bus_sync_signal_handler, self, NULL); g_object_unref (bus); if (kms_recording_profile_supports_type (self->priv->profile, KMS_ELEMENT_PAD_TYPE_AUDIO)) { kms_recorder_endpoint_add_appsink (self, KMS_ELEMENT_PAD_TYPE_AUDIO); } if (kms_recording_profile_supports_type (self->priv->profile, KMS_ELEMENT_PAD_TYPE_VIDEO)) { kms_recorder_endpoint_add_appsink (self, KMS_ELEMENT_PAD_TYPE_VIDEO); } } } else { GST_ERROR_OBJECT (self, "Profile can only be configured once"); } break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } KMS_ELEMENT_UNLOCK (KMS_ELEMENT (self)); }
static void kms_recorder_generate_pads (KmsRecorderEndpoint * self) { KmsElement *elem = KMS_ELEMENT (self); if (kms_recording_profile_supports_type (self->priv->profile, KMS_ELEMENT_PAD_TYPE_AUDIO)) { kms_element_connect_sink_target (elem, self->priv->audio_target, KMS_ELEMENT_PAD_TYPE_AUDIO); } if (kms_recording_profile_supports_type (self->priv->profile, KMS_ELEMENT_PAD_TYPE_VIDEO)) { kms_element_connect_sink_target (elem, self->priv->video_target, KMS_ELEMENT_PAD_TYPE_VIDEO); } }
static void kms_muxing_pipeline_prepare_pipeline (KmsMuxingPipeline * self) { self->priv->pipeline = gst_pipeline_new (KMS_MUXING_PIPELINE_NAME); self->priv->videosrc = gst_element_factory_make ("appsrc", "videoSrc"); self->priv->audiosrc = gst_element_factory_make ("appsrc", "audioSrc"); self->priv->encodebin = gst_element_factory_make ("encodebin", NULL); kms_muxing_pipeline_add_injector_probe (self, self->priv->videosrc); kms_muxing_pipeline_add_injector_probe (self, self->priv->audiosrc); kms_muxing_pipeline_configure (self); gst_bin_add_many (GST_BIN (self->priv->pipeline), self->priv->videosrc, self->priv->audiosrc, self->priv->encodebin, self->priv->sink, NULL); if (!gst_element_link (self->priv->encodebin, self->priv->sink)) { GST_ERROR_OBJECT (self, "Could not link elements: %" GST_PTR_FORMAT ", %" GST_PTR_FORMAT, self->priv->encodebin, self->priv->sink); } if (kms_recording_profile_supports_type (self->priv->profile, KMS_ELEMENT_PAD_TYPE_VIDEO)) { if (!gst_element_link_pads (self->priv->videosrc, "src", self->priv->encodebin, "video_%u")) { GST_ERROR_OBJECT (self, "Could not link elements: %" GST_PTR_FORMAT ", %" GST_PTR_FORMAT, self->priv->videosrc, self->priv->encodebin); } } if (kms_recording_profile_supports_type (self->priv->profile, KMS_ELEMENT_PAD_TYPE_AUDIO)) { if (!gst_element_link_pads (self->priv->audiosrc, "src", self->priv->encodebin, "audio_%u")) { GST_ERROR_OBJECT (self, "Could not link elements: %" GST_PTR_FORMAT ", %" GST_PTR_FORMAT, self->priv->audiosrc, self->priv->encodebin); } } }
static void kms_av_muxer_prepare_pipeline (KmsAVMuxer * self) { self->priv->videosrc = gst_element_factory_make ("appsrc", "videoSrc"); self->priv->audiosrc = gst_element_factory_make ("appsrc", "audioSrc"); self->priv->sink = KMS_BASE_MEDIA_MUXER_GET_CLASS (self)->create_sink (KMS_BASE_MEDIA_MUXER (self), KMS_BASE_MEDIA_MUXER_GET_URI (self)); g_object_set (self->priv->videosrc, "format", 3 /* GST_FORMAT_TIME */ , NULL); g_object_set (self->priv->audiosrc, "format", 3 /* GST_FORMAT_TIME */ , NULL); kms_av_muxer_add_injector_probe (self, self->priv->videosrc); kms_av_muxer_add_injector_probe (self, self->priv->audiosrc); self->priv->mux = kms_av_muxer_create_muxer (self); gst_bin_add_many (GST_BIN (KMS_BASE_MEDIA_MUXER_GET_PIPELINE (self)), self->priv->videosrc, self->priv->audiosrc, self->priv->mux, self->priv->sink, NULL); if (!gst_element_link (self->priv->mux, self->priv->sink)) { GST_ERROR_OBJECT (self, "Could not link elements: %" GST_PTR_FORMAT ", %" GST_PTR_FORMAT, self->priv->mux, self->priv->sink); } if (kms_recording_profile_supports_type (KMS_BASE_MEDIA_MUXER_GET_PROFILE (self), KMS_ELEMENT_PAD_TYPE_VIDEO)) { const gchar *pad_name = kms_av_muxer_get_sink_pad_name (KMS_BASE_MEDIA_MUXER_GET_PROFILE (self), KMS_ELEMENT_PAD_TYPE_VIDEO); if (pad_name == NULL) { GST_ERROR_OBJECT (self, "Unsupported pad for recording"); return; } if (!gst_element_link_pads (self->priv->videosrc, "src", self->priv->mux, pad_name)) { GST_ERROR_OBJECT (self, "Could not link elements: %" GST_PTR_FORMAT ", %" GST_PTR_FORMAT, self->priv->videosrc, self->priv->mux); } } if (kms_recording_profile_supports_type (KMS_BASE_MEDIA_MUXER_GET_PROFILE (self), KMS_ELEMENT_PAD_TYPE_AUDIO)) { const gchar *pad_name = kms_av_muxer_get_sink_pad_name (KMS_BASE_MEDIA_MUXER_GET_PROFILE (self), KMS_ELEMENT_PAD_TYPE_AUDIO); if (pad_name == NULL) { GST_ERROR_OBJECT (self, "Unsupported pad for recording"); return; } if (!gst_element_link_pads (self->priv->audiosrc, "src", self->priv->mux, pad_name)) { GST_ERROR_OBJECT (self, "Could not link elements: %" GST_PTR_FORMAT ", %" GST_PTR_FORMAT, self->priv->audiosrc, self->priv->mux); } } }