static GstElement * kms_av_muxer_create_muxer (KmsAVMuxer * self) { switch (KMS_BASE_MEDIA_MUXER_GET_PROFILE (self)) { case KMS_RECORDING_PROFILE_WEBM: case KMS_RECORDING_PROFILE_WEBM_VIDEO_ONLY: case KMS_RECORDING_PROFILE_WEBM_AUDIO_ONLY: return gst_element_factory_make ("webmmux", NULL); case KMS_RECORDING_PROFILE_MP4: case KMS_RECORDING_PROFILE_MP4_VIDEO_ONLY: case KMS_RECORDING_PROFILE_MP4_AUDIO_ONLY:{ GstElement *mux = gst_element_factory_make ("mp4mux", NULL); GstElementFactory *file_sink_factory = gst_element_factory_find ("filesink"); GstElementFactory *sink_factory = gst_element_get_factory (self->priv->sink); if ((gst_element_factory_get_element_type (sink_factory) != gst_element_factory_get_element_type (file_sink_factory))) { g_object_set (mux, "faststart", TRUE, NULL); } g_object_unref (file_sink_factory); return mux; } case KMS_RECORDING_PROFILE_JPEG_VIDEO_ONLY: return gst_element_factory_make ("jifmux", NULL); default: GST_ERROR_OBJECT (self, "No valid recording profile set"); return NULL; } }
GstElement* tcam_gst_find_camera_src (GstElement* element) { GstPad* orig_pad = gst_element_get_static_pad(element, "sink"); GstPad* src_pad = gst_pad_get_peer(orig_pad); g_object_unref(orig_pad); if (!src_pad) { // this means we have reached a dead end where no valid tcamsrc exists return nullptr; } GstElement* el = gst_pad_get_parent_element(src_pad); gst_object_unref(src_pad); GstElement* ret; const char* name = g_type_name(gst_element_factory_get_element_type(gst_element_get_factory(el))); if (g_strcmp0(name, "GstTcamSrc") == 0) { return el; } ret = tcam_gst_find_camera_src(el); gst_object_unref(el); return ret; }
static struct device_resources find_source (GstElement* self) { struct device_resources res = {}; res.color.max = 255; /* if camera_src is not set we assume that the first default camera src found shall be used */ GstElement* e = GST_ELEMENT(gst_object_get_parent(GST_OBJECT(self))); GList* l = GST_BIN(e)->children; while (1==1) { const char* name = g_type_name(gst_element_factory_get_element_type(gst_element_get_factory(l->data))); if (g_strcmp0(name, "GstTcamSrc") == 0) { GST_INFO("Found tcam source element"); res.source_element = l->data; break; } if (g_list_next(l) == NULL) break; l = g_list_next(l); } update_device_resources(&res); return res; }
struct device_resources find_source (GstElement* self) { struct device_resources res = {}; res.color.max = 255; /* if camera_src is not set we assume that the first default camera src found shall be used */ GstElement* e = GST_ELEMENT( gst_object_get_parent(GST_OBJECT(self))); GList* l = GST_BIN(e)->children; while (1==1) { const char* name = g_type_name(gst_element_factory_get_element_type (gst_element_get_factory(l->data))); if (g_strcmp0(name, CAMERASRC_USB) == 0) { GST_LOG_OBJECT(self, "Found v4l2 device"); res.source_type = V4L2; res.source_element = l->data; break; } if (g_strcmp0(name, CAMERASRC_NETWORK) == 0) { GST_LOG_OBJECT(self, "Found aravis device"); res.source_type = ARAVIS; res.source_element = l->data; break; } if (g_list_next(l) == NULL) break; l = g_list_next(l); } if (res.source_type == UNKNOWN) { GST_LOG_OBJECT(self, "Unknown source type"); } update_device_resources (&res); return res; }
static GstElement * gst_auto_convert_get_or_make_element_from_factory (GstAutoConvert * autoconvert, GstElementFactory * factory) { GstElement *element = NULL; GstElementFactory *loaded_factory = GST_ELEMENT_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE (factory))); if (!loaded_factory) return NULL; element = gst_auto_convert_get_element_by_type (autoconvert, gst_element_factory_get_element_type (loaded_factory)); if (!element) { element = gst_auto_convert_add_element (autoconvert, loaded_factory); } gst_object_unref (loaded_factory); return element; }
static gint create_encoder_pipeline (Encoder *encoder) { GstElement *pipeline, *element; Bin *bin; Link *link; GSList *bins, *links, *elements; GstElementFactory *element_factory; GType type; EncoderStream *stream; GstAppSrcCallbacks callbacks = { need_data_callback, NULL, NULL }; GstAppSinkCallbacks encoder_appsink_callbacks = { NULL, NULL, new_sample_callback }; GstCaps *caps; GstBus *bus; pipeline = gst_pipeline_new (NULL); /* add element to pipeline first. */ bins = encoder->bins; while (bins != NULL) { bin = bins->data; elements = bin->elements; while (elements != NULL) { element = elements->data; if (!gst_bin_add (GST_BIN (pipeline), element)) { GST_ERROR ("add element %s to bin %s error.", gst_element_get_name (element), bin->name); return 1; } elements = g_slist_next (elements); } bins = g_slist_next (bins); } /* then links element. */ bins = encoder->bins; while (bins != NULL) { bin = bins->data; element = bin->first; element_factory = gst_element_get_factory (element); type = gst_element_factory_get_element_type (element_factory); stream = NULL; if (g_strcmp0 ("GstAppSrc", g_type_name (type)) == 0) { GST_INFO ("Encoder appsrc found."); stream = encoder_get_stream (encoder, bin->name); gst_app_src_set_callbacks (GST_APP_SRC (element), &callbacks, stream, NULL); } element = bin->last; element_factory = gst_element_get_factory (element); type = gst_element_factory_get_element_type (element_factory); if ((g_strcmp0 ("GstAppSink", g_type_name (type)) == 0) || (g_strcmp0 ("GstHlsSink", g_type_name (type)) == 0) || (g_strcmp0 ("GstFileSink", g_type_name (type)) == 0)) { GstPad *pad; if (g_strcmp0 ("GstAppSink", g_type_name (type)) == 0) { GST_INFO ("Encoder appsink found."); gst_app_sink_set_callbacks (GST_APP_SINK (element), &encoder_appsink_callbacks, encoder, NULL); } pad = gst_element_get_static_pad (element, "sink"); gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, encoder_appsink_event_probe, encoder, NULL); } links = bin->links; while (links != NULL) { link = links->data; GST_INFO ("link element: %s -> %s", link->src_name, link->sink_name); if (link->caps != NULL) { caps = gst_caps_from_string (link->caps); gst_element_link_filtered (link->src, link->sink, caps); gst_caps_unref (caps); } else { gst_element_link (link->src, link->sink); } links = g_slist_next (links); } bins = g_slist_next (bins); } bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); gst_bus_add_watch (bus, bus_callback, encoder); g_object_unref (bus); encoder->pipeline = pipeline; return 0; }
static void dvb_base_bin_class_init (DvbBaseBinClass * klass) { GObjectClass *gobject_class; GstElementClass *element_class; GstBinClass *bin_class; GstElementFactory *dvbsrc_factory; GObjectClass *dvbsrc_class; typedef struct { guint prop_id; const gchar *prop_name; } ProxyedProperty; ProxyedProperty *walk; ProxyedProperty proxyed_properties[] = { {PROP_ADAPTER, "adapter"}, {PROP_FRONTEND, "frontend"}, {PROP_DISEQC_SRC, "diseqc-source"}, {PROP_FREQUENCY, "frequency"}, {PROP_POLARITY, "polarity"}, {PROP_SYMBOL_RATE, "symbol-rate"}, {PROP_BANDWIDTH, "bandwidth"}, {PROP_CODE_RATE_HP, "code-rate-hp"}, {PROP_CODE_RATE_LP, "code-rate-lp"}, {PROP_GUARD, "guard"}, {PROP_MODULATION, "modulation"}, {PROP_TRANS_MODE, "trans-mode"}, {PROP_HIERARCHY, "hierarchy"}, {PROP_INVERSION, "inversion"}, {PROP_STATS_REPORTING_INTERVAL, "stats-reporting-interval"}, {0, NULL} }; bin_class = GST_BIN_CLASS (klass); bin_class->handle_message = dvb_base_bin_handle_message; element_class = GST_ELEMENT_CLASS (klass); element_class->change_state = dvb_base_bin_change_state; element_class->request_new_pad = dvb_base_bin_request_new_pad; element_class->release_pad = dvb_base_bin_release_pad; gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&program_template)); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_template)); gst_element_class_set_metadata (element_class, "DVB bin", "Source/Bin/Video", "Access descramble and split DVB streams", "Alessandro Decina <*****@*****.**>"); gobject_class = G_OBJECT_CLASS (klass); gobject_class->set_property = dvb_base_bin_set_property; gobject_class->get_property = dvb_base_bin_get_property; gobject_class->dispose = dvb_base_bin_dispose; gobject_class->finalize = dvb_base_bin_finalize; /* install dvbsrc properties */ dvbsrc_factory = gst_element_factory_find ("dvbsrc"); dvbsrc_class = g_type_class_ref (gst_element_factory_get_element_type (dvbsrc_factory)); walk = proxyed_properties; while (walk->prop_name != NULL) { GParamSpec *pspec; GParamSpec *our_pspec; pspec = g_object_class_find_property (dvbsrc_class, walk->prop_name); if (pspec != NULL) { GType param_type = G_PARAM_SPEC_TYPE (pspec); if (param_type == G_TYPE_PARAM_INT) { GParamSpecInt *src_pspec = G_PARAM_SPEC_INT (pspec); our_pspec = g_param_spec_int (g_param_spec_get_name (pspec), g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), src_pspec->minimum, src_pspec->maximum, src_pspec->default_value, pspec->flags); } else if (param_type == G_TYPE_PARAM_UINT) { GParamSpecUInt *src_pspec = G_PARAM_SPEC_UINT (pspec); our_pspec = g_param_spec_uint (g_param_spec_get_name (pspec), g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), src_pspec->minimum, src_pspec->maximum, src_pspec->default_value, pspec->flags); } else if (param_type == G_TYPE_PARAM_STRING) { GParamSpecString *src_pspec = G_PARAM_SPEC_STRING (pspec); our_pspec = g_param_spec_string (g_param_spec_get_name (pspec), g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), src_pspec->default_value, pspec->flags); } else if (param_type == G_TYPE_PARAM_ENUM) { GParamSpecEnum *src_pspec = G_PARAM_SPEC_ENUM (pspec); our_pspec = g_param_spec_enum (g_param_spec_get_name (pspec), g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), pspec->value_type, src_pspec->default_value, pspec->flags); } else { GST_ERROR ("Unsupported property type %s for property %s", g_type_name (param_type), g_param_spec_get_name (pspec)); ++walk; continue; } g_object_class_install_property (gobject_class, walk->prop_id, our_pspec); } else { g_warning ("dvbsrc has no property named %s", walk->prop_name); } ++walk; } g_type_class_unref (dvbsrc_class); g_object_class_install_property (gobject_class, PROP_PROGRAM_NUMBERS, g_param_spec_string ("program-numbers", "Program Numbers", "Colon separated list of programs", "", G_PARAM_READWRITE)); }
static void dvb_base_bin_class_init (DvbBaseBinClass * klass) { GObjectClass *gobject_class; GstElementClass *element_class; GstBinClass *bin_class; DvbBaseBinClass *dvbbasebin_class; GstElementFactory *dvbsrc_factory; GObjectClass *dvbsrc_class; typedef struct { guint prop_id; const gchar *prop_name; } ProxyedProperty; ProxyedProperty *walk; ProxyedProperty proxyed_properties[] = { {PROP_ADAPTER, "adapter"}, {PROP_FRONTEND, "frontend"}, {PROP_DISEQC_SRC, "diseqc-source"}, {PROP_FREQUENCY, "frequency"}, {PROP_POLARITY, "polarity"}, {PROP_SYMBOL_RATE, "symbol-rate"}, #ifndef GST_REMOVE_DEPRECATED {PROP_BANDWIDTH, "bandwidth"}, #endif {PROP_CODE_RATE_HP, "code-rate-hp"}, {PROP_CODE_RATE_LP, "code-rate-lp"}, {PROP_GUARD, "guard"}, {PROP_MODULATION, "modulation"}, {PROP_TRANS_MODE, "trans-mode"}, {PROP_HIERARCHY, "hierarchy"}, {PROP_INVERSION, "inversion"}, {PROP_STATS_REPORTING_INTERVAL, "stats-reporting-interval"}, {PROP_TUNING_TIMEOUT, "tuning-timeout"}, {PROP_DELSYS, "delsys"}, {PROP_PILOT, "pilot"}, {PROP_ROLLOFF, "rolloff"}, {PROP_STREAM_ID, "stream-id"}, {PROP_BANDWIDTH_HZ, "bandwidth-hz"}, {PROP_ISDBT_LAYER_ENABLED, "isdbt-layer-enabled"}, {PROP_ISDBT_PARTIAL_RECEPTION, "isdbt-partial-reception"}, {PROP_ISDBT_SOUND_BROADCASTING, "isdbt-sound-broadcasting"}, {PROP_ISDBT_SB_SUBCHANNEL_ID, "isdbt-sb-subchannel-id"}, {PROP_ISDBT_SB_SEGMENT_IDX, "isdbt-sb-segment-idx"}, {PROP_ISDBT_SB_SEGMENT_COUNT, "isdbt-sb-segment-count"}, {PROP_ISDBT_LAYERA_FEC, "isdbt-layera-fec"}, {PROP_ISDBT_LAYERA_MODULATION, "isdbt-layera-modulation"}, {PROP_ISDBT_LAYERA_SEGMENT_COUNT, "isdbt-layera-segment-count"}, {PROP_ISDBT_LAYERA_TIME_INTERLEAVING, "isdbt-layera-time-interleaving"}, {PROP_ISDBT_LAYERB_FEC, "isdbt-layerb-fec"}, {PROP_ISDBT_LAYERB_MODULATION, "isdbt-layerb-modulation"}, {PROP_ISDBT_LAYERB_SEGMENT_COUNT, "isdbt-layerb-segment-count"}, {PROP_ISDBT_LAYERB_TIME_INTERLEAVING, "isdbt-layerb-time-interleaving"}, {PROP_ISDBT_LAYERC_FEC, "isdbt-layerc-fec"}, {PROP_ISDBT_LAYERC_MODULATION, "isdbt-layerc-modulation"}, {PROP_ISDBT_LAYERC_SEGMENT_COUNT, "isdbt-layerc-segment-count"}, {PROP_ISDBT_LAYERC_TIME_INTERLEAVING, "isdbt-layerc-time-interleaving"}, {PROP_LNB_SLOF, "lnb-slof"}, {PROP_LNB_LOF1, "lnb-lof1"}, {PROP_LNB_LOF2, "lnb-lof2"}, {PROP_INTERLEAVING, "interleaving"}, {0, NULL} }; bin_class = GST_BIN_CLASS (klass); bin_class->handle_message = dvb_base_bin_handle_message; element_class = GST_ELEMENT_CLASS (klass); element_class->change_state = dvb_base_bin_change_state; element_class->request_new_pad = dvb_base_bin_request_new_pad; element_class->release_pad = dvb_base_bin_release_pad; gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&program_template)); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_template)); gst_element_class_set_static_metadata (element_class, "DVB bin", "Source/Bin/Video", "Access descramble and split DVB streams", "Alessandro Decina <*****@*****.**>\n" "Reynaldo H. Verdejo Pinochet <*****@*****.**>"); gobject_class = G_OBJECT_CLASS (klass); gobject_class->set_property = dvb_base_bin_set_property; gobject_class->get_property = dvb_base_bin_get_property; gobject_class->dispose = dvb_base_bin_dispose; gobject_class->finalize = dvb_base_bin_finalize; dvbbasebin_class = (DvbBaseBinClass *) klass; dvbbasebin_class->do_tune = dvb_base_bin_do_tune; /* install dvbsrc properties */ dvbsrc_factory = gst_element_factory_find ("dvbsrc"); dvbsrc_class = g_type_class_ref (gst_element_factory_get_element_type (dvbsrc_factory)); walk = proxyed_properties; while (walk->prop_name != NULL) { GParamSpec *pspec; GParamSpec *our_pspec; pspec = g_object_class_find_property (dvbsrc_class, walk->prop_name); if (pspec != NULL) { GType param_type = G_PARAM_SPEC_TYPE (pspec); if (param_type == G_TYPE_PARAM_INT) { GParamSpecInt *src_pspec = G_PARAM_SPEC_INT (pspec); our_pspec = g_param_spec_int (g_param_spec_get_name (pspec), g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), src_pspec->minimum, src_pspec->maximum, src_pspec->default_value, pspec->flags); } else if (param_type == G_TYPE_PARAM_UINT) { GParamSpecUInt *src_pspec = G_PARAM_SPEC_UINT (pspec); our_pspec = g_param_spec_uint (g_param_spec_get_name (pspec), g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), src_pspec->minimum, src_pspec->maximum, src_pspec->default_value, pspec->flags); } else if (param_type == G_TYPE_PARAM_UINT64) { GParamSpecUInt64 *src_pspec = G_PARAM_SPEC_UINT64 (pspec); our_pspec = g_param_spec_uint64 (g_param_spec_get_name (pspec), g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), src_pspec->minimum, src_pspec->maximum, src_pspec->default_value, pspec->flags); } else if (param_type == G_TYPE_PARAM_STRING) { GParamSpecString *src_pspec = G_PARAM_SPEC_STRING (pspec); our_pspec = g_param_spec_string (g_param_spec_get_name (pspec), g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), src_pspec->default_value, pspec->flags); } else if (param_type == G_TYPE_PARAM_ENUM) { GParamSpecEnum *src_pspec = G_PARAM_SPEC_ENUM (pspec); our_pspec = g_param_spec_enum (g_param_spec_get_name (pspec), g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), pspec->value_type, src_pspec->default_value, pspec->flags); } else { GST_ERROR ("Unsupported property type %s for property %s", g_type_name (param_type), g_param_spec_get_name (pspec)); ++walk; continue; } g_object_class_install_property (gobject_class, walk->prop_id, our_pspec); } else { g_warning ("dvbsrc has no property named %s", walk->prop_name); } ++walk; } g_type_class_unref (dvbsrc_class); g_object_class_install_property (gobject_class, PROP_PROGRAM_NUMBERS, g_param_spec_string ("program-numbers", "Program Numbers", "Colon separated list of programs", "", G_PARAM_READWRITE)); /** * DvbBaseBin::tuning-start: * @dvbbasebin: the element on which the signal is emitted * * Signal emited when the element first attempts to tune the * frontend tunner to a given frequency. */ dvb_base_bin_signals[SIGNAL_TUNING_START] = g_signal_new ("tuning-start", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0); /** * DvbBaseBin::tuning-done: * @dvbbasebin: the element on which the signal is emitted * * Signal emited when the tunner has successfully got a lock on a signal. */ dvb_base_bin_signals[SIGNAL_TUNING_DONE] = g_signal_new ("tuning-done", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0); /** * DvbBaseBin::tuning-fail: * @dvbbasebin: the element on which the signal is emitted * * Signal emited when the tunner failed to get a lock on the * signal. */ dvb_base_bin_signals[SIGNAL_TUNING_FAIL] = g_signal_new ("tuning-fail", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0); /** * DvbBaseBin::tune: * @dvbbasesink: the element on which the signal is emitted * * Signal emited from the application to the element, instructing it * to tune. */ dvb_base_bin_signals[SIGNAL_TUNE] = g_signal_new ("tune", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (DvbBaseBinClass, do_tune), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); }