static KmsCompositeMixerData * kms_composite_mixer_port_data_create (KmsCompositeMixer * mixer, gint id) { KmsCompositeMixerData *data; gchar *padname; GstCaps *filtercaps; data = kms_create_composite_mixer_data (); data->mixer = mixer; data->id = id; data->input = FALSE; data->removing = FALSE; data->eos_managed = FALSE; data->videoconvert = gst_element_factory_make ("videoconvert", NULL); data->input_capsfilter = gst_element_factory_make ("capsfilter", NULL); filtercaps = gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, "AYUV", "width", G_TYPE_INT, mixer->priv->output_width, "height", G_TYPE_INT, mixer->priv->output_height, "framerate", GST_TYPE_FRACTION, 15, 1, NULL); g_object_set (G_OBJECT (data->input_capsfilter), "caps", filtercaps, NULL); gst_caps_unref (filtercaps); gst_bin_add_many (GST_BIN (mixer), data->input_capsfilter, data->videoconvert, NULL); gst_element_sync_state_with_parent (data->videoconvert); gst_element_sync_state_with_parent (data->input_capsfilter); /*link basemixer -> video_agnostic */ kms_base_hub_link_video_sink (KMS_BASE_HUB (mixer), data->id, data->input_capsfilter, "sink", FALSE); gst_element_link (data->input_capsfilter, data->videoconvert); padname = g_strdup_printf (AUDIO_SINK_PAD, id); kms_base_hub_link_audio_sink (KMS_BASE_HUB (mixer), id, mixer->priv->audiomixer, padname, FALSE); g_free (padname); data->videoconvert_sink_pad = gst_element_get_static_pad (data->videoconvert, "sink"); data->link_probe_id = gst_pad_add_probe (data->videoconvert_sink_pad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | GST_PAD_PROBE_TYPE_BLOCK, (GstPadProbeCallback) link_to_videomixer, KMS_COMPOSITE_MIXER_REF (data), (GDestroyNotify) kms_ref_struct_unref); return data; }
static KmsCompositeMixerData * kms_composite_mixer_port_data_create (KmsCompositeMixer * mixer, gint id) { KmsCompositeMixerData *data; gchar *padname; GstPad *tee_src; GstCaps *filtercaps; data = kms_create_composite_mixer_data (); data->mixer = mixer; data->id = id; data->input = FALSE; data->removing = FALSE; data->eos_managed = FALSE; data->tee = gst_element_factory_make ("tee", NULL); data->fakesink = gst_element_factory_make ("fakesink", NULL); data->capsfilter = gst_element_factory_make ("capsfilter", NULL); g_object_set (G_OBJECT (data->capsfilter), "caps-change-mode", 1 /*delayed */ , NULL); g_object_set (G_OBJECT (data->fakesink), "async", FALSE, "sync", FALSE, NULL); gst_bin_add_many (GST_BIN (mixer), data->capsfilter, data->tee, data->fakesink, NULL); gst_element_sync_state_with_parent (data->capsfilter); gst_element_sync_state_with_parent (data->tee); gst_element_sync_state_with_parent (data->fakesink); filtercaps = gst_caps_new_simple ("video/x-raw", "width", G_TYPE_INT, mixer->priv->output_width, "height", G_TYPE_INT, mixer->priv->output_height, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, NULL); g_object_set (data->capsfilter, "caps", filtercaps, NULL); gst_caps_unref (filtercaps); /*link basemixer -> video_agnostic */ kms_base_hub_link_video_sink (KMS_BASE_HUB (mixer), data->id, data->capsfilter, "sink", FALSE); data->tee_sink_pad = gst_element_get_static_pad (data->tee, "sink"); gst_element_link_pads (data->capsfilter, NULL, data->tee, GST_OBJECT_NAME (data->tee_sink_pad)); tee_src = gst_element_get_request_pad (data->tee, "src_%u"); gst_element_link_pads (data->tee, GST_OBJECT_NAME (tee_src), data->fakesink, "sink"); g_object_unref (tee_src); padname = g_strdup_printf (AUDIO_SINK_PAD, id); kms_base_hub_link_audio_sink (KMS_BASE_HUB (mixer), id, mixer->priv->audiomixer, padname, FALSE); g_free (padname); data->link_probe_id = gst_pad_add_probe (data->tee_sink_pad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | GST_PAD_PROBE_TYPE_BLOCK, (GstPadProbeCallback) link_to_videomixer, KMS_COMPOSITE_MIXER_REF (data), (GDestroyNotify) kms_ref_struct_unref); return data; }