static void gst_cc_extractor_init (GstCCExtractor * filter) { filter->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); gst_pad_set_event_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_cc_extractor_sink_event)); gst_pad_set_chain_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_cc_extractor_chain)); gst_pad_set_iterate_internal_links_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_cc_extractor_iterate_internal_links)); GST_PAD_SET_PROXY_CAPS (filter->sinkpad); GST_PAD_SET_PROXY_ALLOCATION (filter->sinkpad); GST_PAD_SET_PROXY_SCHEDULING (filter->sinkpad); filter->srcpad = gst_pad_new_from_static_template (&srctemplate, "src"); gst_pad_set_iterate_internal_links_function (filter->srcpad, GST_DEBUG_FUNCPTR (gst_cc_extractor_iterate_internal_links)); GST_PAD_SET_PROXY_CAPS (filter->srcpad); GST_PAD_SET_PROXY_ALLOCATION (filter->srcpad); GST_PAD_SET_PROXY_SCHEDULING (filter->srcpad); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); filter->combiner = gst_flow_combiner_new (); gst_cc_extractor_reset (filter); }
static void gst_timecodewait_init (GstTimeCodeWait * self) { self->asinkpad = gst_pad_new_from_static_template (&audio_sink_template, "asink"); gst_pad_set_chain_function (self->asinkpad, GST_DEBUG_FUNCPTR (gst_timecodewait_asink_chain)); gst_pad_set_event_function (self->asinkpad, GST_DEBUG_FUNCPTR (gst_timecodewait_asink_event)); gst_pad_set_iterate_internal_links_function (self->asinkpad, GST_DEBUG_FUNCPTR (gst_timecodewait_iterate_internal_links)); gst_element_add_pad (GST_ELEMENT (self), self->asinkpad); self->vsinkpad = gst_pad_new_from_static_template (&video_sink_template, "vsink"); gst_pad_set_chain_function (self->vsinkpad, GST_DEBUG_FUNCPTR (gst_timecodewait_vsink_chain)); gst_pad_set_event_function (self->vsinkpad, GST_DEBUG_FUNCPTR (gst_timecodewait_vsink_event)); gst_pad_set_iterate_internal_links_function (self->vsinkpad, GST_DEBUG_FUNCPTR (gst_timecodewait_iterate_internal_links)); gst_element_add_pad (GST_ELEMENT (self), self->vsinkpad); self->asrcpad = gst_pad_new_from_static_template (&audio_src_template, "asrc"); gst_pad_set_iterate_internal_links_function (self->asrcpad, GST_DEBUG_FUNCPTR (gst_timecodewait_iterate_internal_links)); gst_element_add_pad (GST_ELEMENT (self), self->asrcpad); self->vsrcpad = gst_pad_new_from_static_template (&video_src_template, "vsrc"); gst_pad_set_iterate_internal_links_function (self->vsrcpad, GST_DEBUG_FUNCPTR (gst_timecodewait_iterate_internal_links)); gst_element_add_pad (GST_ELEMENT (self), self->vsrcpad); GST_PAD_SET_PROXY_CAPS (self->asinkpad); GST_PAD_SET_PROXY_ALLOCATION (self->asinkpad); GST_PAD_SET_PROXY_CAPS (self->asrcpad); GST_PAD_SET_PROXY_SCHEDULING (self->asrcpad); GST_PAD_SET_PROXY_CAPS (self->vsinkpad); GST_PAD_SET_PROXY_ALLOCATION (self->vsinkpad); GST_PAD_SET_PROXY_CAPS (self->vsrcpad); GST_PAD_SET_PROXY_SCHEDULING (self->vsrcpad); self->running_time_of_timecode = GST_CLOCK_TIME_NONE; self->video_eos_flag = FALSE; self->audio_flush_flag = FALSE; self->shutdown_flag = FALSE; self->from_string = FALSE; self->tc = gst_video_time_code_new_empty (); g_mutex_init (&self->mutex); g_cond_init (&self->cond); }
static void gst_proxy_pad_init (GstProxyPad * ppad) { GstPad *pad = (GstPad *) ppad; GST_PROXY_PAD_PRIVATE (ppad) = gst_proxy_pad_get_instance_private (ppad); gst_pad_set_iterate_internal_links_function (pad, gst_proxy_pad_iterate_internal_links_default); GST_PAD_SET_PROXY_CAPS (pad); GST_PAD_SET_PROXY_SCHEDULING (pad); GST_PAD_SET_PROXY_ALLOCATION (pad); }
static void gst_proxy_pad_init (GstProxyPad * ppad) { GstPad *pad = (GstPad *) ppad; GST_PROXY_PAD_PRIVATE (ppad) = G_TYPE_INSTANCE_GET_PRIVATE (ppad, GST_TYPE_PROXY_PAD, GstProxyPadPrivate); gst_pad_set_iterate_internal_links_function (pad, gst_proxy_pad_iterate_internal_links_default); GST_PAD_SET_PROXY_CAPS (pad); GST_PAD_SET_PROXY_SCHEDULING (pad); GST_PAD_SET_PROXY_ALLOCATION (pad); }
/* GstElement vfuncs */ static GstPad * gst_stream_synchronizer_request_new_pad (GstElement * element, GstPadTemplate * temp, const gchar * name, const GstCaps * caps) { GstStreamSynchronizer *self = GST_STREAM_SYNCHRONIZER (element); GstSyncStream *stream; gchar *tmp; GST_STREAM_SYNCHRONIZER_LOCK (self); GST_DEBUG_OBJECT (self, "Requesting new pad for stream %d", self->current_stream_number); stream = g_slice_new0 (GstSyncStream); stream->transform = self; stream->stream_number = self->current_stream_number; g_cond_init (&stream->stream_finish_cond); stream->stream_start_seqnum = G_MAXUINT32; stream->segment_seqnum = G_MAXUINT32; stream->group_id = G_MAXUINT; stream->seen_data = FALSE; tmp = g_strdup_printf ("sink_%u", self->current_stream_number); stream->sinkpad = gst_pad_new_from_static_template (&sinktemplate, tmp); g_free (tmp); gst_pad_set_element_private (stream->sinkpad, stream); gst_pad_set_iterate_internal_links_function (stream->sinkpad, GST_DEBUG_FUNCPTR (gst_stream_synchronizer_iterate_internal_links)); gst_pad_set_event_function (stream->sinkpad, GST_DEBUG_FUNCPTR (gst_stream_synchronizer_sink_event)); gst_pad_set_chain_function (stream->sinkpad, GST_DEBUG_FUNCPTR (gst_stream_synchronizer_sink_chain)); GST_PAD_SET_PROXY_CAPS (stream->sinkpad); GST_PAD_SET_PROXY_ALLOCATION (stream->sinkpad); GST_PAD_SET_PROXY_SCHEDULING (stream->sinkpad); tmp = g_strdup_printf ("src_%u", self->current_stream_number); stream->srcpad = gst_pad_new_from_static_template (&srctemplate, tmp); g_free (tmp); gst_pad_set_element_private (stream->srcpad, stream); gst_pad_set_iterate_internal_links_function (stream->srcpad, GST_DEBUG_FUNCPTR (gst_stream_synchronizer_iterate_internal_links)); gst_pad_set_event_function (stream->srcpad, GST_DEBUG_FUNCPTR (gst_stream_synchronizer_src_event)); GST_PAD_SET_PROXY_CAPS (stream->srcpad); GST_PAD_SET_PROXY_ALLOCATION (stream->srcpad); GST_PAD_SET_PROXY_SCHEDULING (stream->srcpad); gst_segment_init (&stream->segment, GST_FORMAT_UNDEFINED); self->streams = g_list_prepend (self->streams, stream); self->current_stream_number++; GST_STREAM_SYNCHRONIZER_UNLOCK (self); /* Add pads and activate unless we're going to NULL */ g_rec_mutex_lock (GST_STATE_GET_LOCK (self)); if (GST_STATE_TARGET (self) != GST_STATE_NULL) { gst_pad_set_active (stream->srcpad, TRUE); gst_pad_set_active (stream->sinkpad, TRUE); } gst_element_add_pad (GST_ELEMENT_CAST (self), stream->srcpad); gst_element_add_pad (GST_ELEMENT_CAST (self), stream->sinkpad); g_rec_mutex_unlock (GST_STATE_GET_LOCK (self)); return stream->sinkpad; }
static void gst_videoframe_audiolevel_init (GstVideoFrameAudioLevel * self) { self->asinkpad = gst_pad_new_from_static_template (&audio_sink_template, "asink"); gst_pad_set_chain_function (self->asinkpad, GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_asink_chain)); gst_pad_set_event_function (self->asinkpad, GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_asink_event)); gst_pad_set_iterate_internal_links_function (self->asinkpad, GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_iterate_internal_links)); gst_element_add_pad (GST_ELEMENT (self), self->asinkpad); self->vsinkpad = gst_pad_new_from_static_template (&video_sink_template, "vsink"); gst_pad_set_chain_function (self->vsinkpad, GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_vsink_chain)); gst_pad_set_event_function (self->vsinkpad, GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_vsink_event)); gst_pad_set_iterate_internal_links_function (self->vsinkpad, GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_iterate_internal_links)); gst_element_add_pad (GST_ELEMENT (self), self->vsinkpad); self->asrcpad = gst_pad_new_from_static_template (&audio_src_template, "asrc"); gst_pad_set_iterate_internal_links_function (self->asrcpad, GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_iterate_internal_links)); gst_element_add_pad (GST_ELEMENT (self), self->asrcpad); self->vsrcpad = gst_pad_new_from_static_template (&video_src_template, "vsrc"); gst_pad_set_iterate_internal_links_function (self->vsrcpad, GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_iterate_internal_links)); gst_element_add_pad (GST_ELEMENT (self), self->vsrcpad); GST_PAD_SET_PROXY_CAPS (self->asinkpad); GST_PAD_SET_PROXY_ALLOCATION (self->asinkpad); GST_PAD_SET_PROXY_CAPS (self->asrcpad); GST_PAD_SET_PROXY_SCHEDULING (self->asrcpad); GST_PAD_SET_PROXY_CAPS (self->vsinkpad); GST_PAD_SET_PROXY_ALLOCATION (self->vsinkpad); GST_PAD_SET_PROXY_CAPS (self->vsrcpad); GST_PAD_SET_PROXY_SCHEDULING (self->vsrcpad); self->adapter = gst_adapter_new (); g_queue_init (&self->vtimeq); self->first_time = GST_CLOCK_TIME_NONE; self->total_frames = 0; /* alignment_threshold and discont_wait should become properties if needed */ self->alignment_threshold = 40 * GST_MSECOND; self->discont_time = GST_CLOCK_TIME_NONE; self->next_offset = -1; self->discont_wait = 1 * GST_SECOND; self->video_eos_flag = FALSE; self->audio_flush_flag = FALSE; self->shutdown_flag = FALSE; g_mutex_init (&self->mutex); g_cond_init (&self->cond); }