static void gst_rtp_rtx_receive_init (GstRtpRtxReceive * rtx) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (rtx); rtx->srcpad = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "src"), "src"); GST_PAD_SET_PROXY_CAPS (rtx->srcpad); GST_PAD_SET_PROXY_ALLOCATION (rtx->srcpad); gst_pad_set_event_function (rtx->srcpad, GST_DEBUG_FUNCPTR (gst_rtp_rtx_receive_src_event)); gst_element_add_pad (GST_ELEMENT (rtx), rtx->srcpad); rtx->sinkpad = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "sink"), "sink"); GST_PAD_SET_PROXY_CAPS (rtx->sinkpad); GST_PAD_SET_PROXY_ALLOCATION (rtx->sinkpad); gst_pad_set_chain_function (rtx->sinkpad, GST_DEBUG_FUNCPTR (gst_rtp_rtx_receive_chain)); gst_element_add_pad (GST_ELEMENT (rtx), rtx->sinkpad); rtx->ssrc2_ssrc1_map = g_hash_table_new (g_direct_hash, g_direct_equal); rtx->seqnum_ssrc1_map = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) ssrc_assoc_free); rtx->rtx_pt_map = g_hash_table_new (g_direct_hash, g_direct_equal); }
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_valve_init (GstValve * valve) { valve->drop = FALSE; valve->discont = FALSE; valve->srcpad = gst_pad_new_from_static_template (&srctemplate, "src"); gst_pad_set_event_function (valve->srcpad, GST_DEBUG_FUNCPTR (gst_valve_event)); gst_pad_set_query_function (valve->srcpad, GST_DEBUG_FUNCPTR (gst_valve_query)); GST_PAD_SET_PROXY_CAPS (valve->srcpad); gst_element_add_pad (GST_ELEMENT (valve), valve->srcpad); valve->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); gst_pad_set_chain_function (valve->sinkpad, GST_DEBUG_FUNCPTR (gst_valve_chain)); gst_pad_set_event_function (valve->sinkpad, GST_DEBUG_FUNCPTR (gst_valve_event)); gst_pad_set_query_function (valve->sinkpad, GST_DEBUG_FUNCPTR (gst_valve_query)); GST_PAD_SET_PROXY_CAPS (valve->sinkpad); GST_PAD_SET_PROXY_ALLOCATION (valve->sinkpad); gst_element_add_pad (GST_ELEMENT (valve), valve->sinkpad); }
static void gst_dvd_spu_init (GstDVDSpu * dvdspu) { dvdspu->videosinkpad = gst_pad_new_from_static_template (&video_sink_factory, "video"); gst_pad_set_chain_function (dvdspu->videosinkpad, gst_dvd_spu_video_chain); gst_pad_set_event_function (dvdspu->videosinkpad, gst_dvd_spu_video_event); gst_pad_set_query_function (dvdspu->videosinkpad, gst_dvd_spu_video_query); dvdspu->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); gst_pad_set_event_function (dvdspu->srcpad, gst_dvd_spu_src_event); gst_pad_set_query_function (dvdspu->srcpad, gst_dvd_spu_src_query); dvdspu->subpic_sinkpad = gst_pad_new_from_static_template (&subpic_sink_factory, "subpicture"); gst_pad_set_chain_function (dvdspu->subpic_sinkpad, gst_dvd_spu_subpic_chain); gst_pad_set_event_function (dvdspu->subpic_sinkpad, gst_dvd_spu_subpic_event); GST_PAD_SET_PROXY_ALLOCATION (dvdspu->videosinkpad); gst_element_add_pad (GST_ELEMENT (dvdspu), dvdspu->videosinkpad); gst_element_add_pad (GST_ELEMENT (dvdspu), dvdspu->subpic_sinkpad); gst_element_add_pad (GST_ELEMENT (dvdspu), dvdspu->srcpad); g_mutex_init (&dvdspu->spu_lock); dvdspu->pending_spus = g_queue_new (); gst_dvd_spu_clear (dvdspu); }
static void gst_segment_clip_init (GstSegmentClip * self, GstSegmentClipClass * g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstPadTemplate *templ; templ = gst_element_class_get_pad_template (element_class, "sink"); g_assert (templ); self->sinkpad = gst_pad_new_from_template (templ, "sink"); gst_pad_set_chain_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_segment_clip_sink_chain)); gst_pad_set_event_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_segment_clip_event)); gst_pad_set_query_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_segment_clip_query)); GST_PAD_SET_PROXY_ALLOCATION (self->sinkpad); gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); gst_object_unref (templ); templ = gst_element_class_get_pad_template (element_class, "src"); g_assert (templ); self->srcpad = gst_pad_new_from_template (templ, "src"); gst_pad_set_event_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_segment_clip_event)); gst_pad_set_query_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_segment_clip_query)); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); gst_segment_clip_reset (self); }
static void gst_image_freeze_init (GstImageFreeze * self) { self->sinkpad = gst_pad_new_from_static_template (&sink_pad_template, "sink"); gst_pad_set_chain_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_image_freeze_sink_chain)); gst_pad_set_event_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_image_freeze_sink_event)); gst_pad_set_query_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_image_freeze_sink_query)); GST_PAD_SET_PROXY_ALLOCATION (self->sinkpad); gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); self->srcpad = gst_pad_new_from_static_template (&src_pad_template, "src"); gst_pad_set_event_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_image_freeze_src_event)); gst_pad_set_query_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_image_freeze_src_query)); gst_pad_use_fixed_caps (self->srcpad); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); g_mutex_init (&self->lock); gst_image_freeze_reset (self); }
static void gst_rtp_ulpfec_dec_init (GstRtpUlpFecDec * self) { self->srcpad = gst_pad_new_from_static_template (&srctemplate, "src"); self->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); GST_PAD_SET_PROXY_CAPS (self->sinkpad); GST_PAD_SET_PROXY_ALLOCATION (self->sinkpad); gst_pad_set_chain_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_rtp_ulpfec_dec_chain)); gst_pad_set_event_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_rtp_ulpfec_dec_handle_sink_event)); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); self->fec_pt = DEFAULT_FEC_PT; self->next_seqnum = g_random_int_range (0, G_MAXINT16); self->chain_return_val = GST_FLOW_OK; self->have_caps_ssrc = FALSE; self->caps_ssrc = 0; self->info_fec = g_ptr_array_new (); self->info_arr = g_array_new (FALSE, TRUE, sizeof (RtpUlpFecMapInfo)); g_array_set_clear_func (self->info_arr, (GDestroyNotify) rtp_ulpfec_map_info_unmap); self->scratch_buf = g_array_new (FALSE, TRUE, sizeof (guint8)); }
static void gst_dvbsub_overlay_init (GstDVBSubOverlay * render) { GST_DEBUG_OBJECT (render, "init"); render->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); render->video_sinkpad = gst_pad_new_from_static_template (&video_sink_factory, "video_sink"); render->text_sinkpad = gst_pad_new_from_static_template (&text_sink_factory, "text_sink"); gst_pad_set_chain_function (render->video_sinkpad, GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_chain_video)); gst_pad_set_chain_function (render->text_sinkpad, GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_chain_text)); gst_pad_set_event_function (render->video_sinkpad, GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_event_video)); gst_pad_set_event_function (render->text_sinkpad, GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_event_text)); gst_pad_set_event_function (render->srcpad, GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_event_src)); gst_pad_set_query_function (render->video_sinkpad, GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_query_video)); gst_pad_set_query_function (render->srcpad, GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_query_src)); GST_PAD_SET_PROXY_ALLOCATION (render->video_sinkpad); gst_element_add_pad (GST_ELEMENT (render), render->srcpad); gst_element_add_pad (GST_ELEMENT (render), render->video_sinkpad); gst_element_add_pad (GST_ELEMENT (render), render->text_sinkpad); gst_video_info_init (&render->info); render->current_subtitle = NULL; render->pending_subtitles = g_queue_new (); render->enable = DEFAULT_ENABLE; render->max_page_timeout = DEFAULT_MAX_PAGE_TIMEOUT; render->force_end = DEFAULT_FORCE_END; g_mutex_init (&render->dvbsub_mutex); gst_dvbsub_overlay_flush_subtitles (render); gst_segment_init (&render->video_segment, GST_FORMAT_TIME); gst_segment_init (&render->subtitle_segment, GST_FORMAT_TIME); GST_DEBUG_OBJECT (render, "init complete"); }
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); }
static void gst_jp2k_decimator_init (GstJP2kDecimator * self) { self->max_layers = DEFAULT_MAX_LAYERS; self->max_decomposition_levels = DEFAULT_MAX_DECOMPOSITION_LEVELS; self->sinkpad = gst_pad_new_from_static_template (&sink_pad_template, "sink"); GST_PAD_SET_PROXY_CAPS (self->sinkpad); GST_PAD_SET_PROXY_ALLOCATION (self->sinkpad); gst_pad_set_chain_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_jp2k_decimator_sink_chain)); gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); self->srcpad = gst_pad_new_from_static_template (&src_pad_template, "src"); GST_PAD_SET_PROXY_CAPS (self->srcpad); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); }
static void gst_type_find_element_init (GstTypeFindElement * typefind) { /* sinkpad */ typefind->sink = gst_pad_new_from_static_template (&type_find_element_sink_template, "sink"); gst_pad_set_activate_function (typefind->sink, GST_DEBUG_FUNCPTR (gst_type_find_element_activate_sink)); gst_pad_set_activatemode_function (typefind->sink, GST_DEBUG_FUNCPTR (gst_type_find_element_activate_sink_mode)); gst_pad_set_chain_function (typefind->sink, GST_DEBUG_FUNCPTR (gst_type_find_element_chain)); gst_pad_set_event_function (typefind->sink, GST_DEBUG_FUNCPTR (gst_type_find_element_sink_event)); GST_PAD_SET_PROXY_ALLOCATION (typefind->sink); gst_element_add_pad (GST_ELEMENT (typefind), typefind->sink); /* srcpad */ typefind->src = gst_pad_new_from_static_template (&type_find_element_src_template, "src"); gst_pad_set_activatemode_function (typefind->src, GST_DEBUG_FUNCPTR (gst_type_find_element_activate_src_mode)); gst_pad_set_getrange_function (typefind->src, GST_DEBUG_FUNCPTR (gst_type_find_element_getrange)); gst_pad_set_event_function (typefind->src, GST_DEBUG_FUNCPTR (gst_type_find_element_src_event)); gst_pad_set_query_function (typefind->src, GST_DEBUG_FUNCPTR (gst_type_find_handle_src_query)); gst_pad_use_fixed_caps (typefind->src); gst_element_add_pad (GST_ELEMENT (typefind), typefind->src); typefind->mode = MODE_TYPEFIND; typefind->caps = NULL; typefind->min_probability = 1; typefind->adapter = gst_adapter_new (); }
/* 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); }