static void dvb_base_bin_init (DvbBaseBin * dvbbasebin) { DvbBaseBinStream *stream; GstPad *ghost, *pad; int i; dvbbasebin->dvbsrc = gst_element_factory_make ("dvbsrc", NULL); dvbbasebin->buffer_queue = gst_element_factory_make ("queue", NULL); dvbbasebin->tsparse = gst_element_factory_make ("tsparse", NULL); g_object_set (dvbbasebin->buffer_queue, "max-size-buffers", 0, "max-size-bytes", 0, "max-size-time", 0, NULL); gst_bin_add_many (GST_BIN (dvbbasebin), dvbbasebin->dvbsrc, dvbbasebin->buffer_queue, dvbbasebin->tsparse, NULL); gst_element_link_many (dvbbasebin->dvbsrc, dvbbasebin->buffer_queue, dvbbasebin->tsparse, NULL); /* Expose tsparse source pad */ pad = gst_element_get_static_pad (dvbbasebin->tsparse, "src"); gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_DATA_DOWNSTREAM, dvb_base_bin_ts_pad_probe_cb, dvbbasebin, NULL); ghost = gst_ghost_pad_new ("src", pad); gst_element_add_pad (GST_ELEMENT (dvbbasebin), ghost); dvbbasebin->programs = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, dvb_base_bin_program_destroy); dvbbasebin->streams = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free); dvbbasebin->pmtlist = NULL; dvbbasebin->pmtlist_changed = FALSE; dvbbasebin->disposed = FALSE; dvb_base_bin_reset (dvbbasebin); /* add PAT, CAT, NIT, SDT, EIT, TDT to pids filter for dvbsrc */ i = 0; while (initial_pids[i] >= 0) { stream = dvb_base_bin_add_stream (dvbbasebin, (guint16) initial_pids[i]); ++stream->usecount; i++; } dvb_base_bin_rebuild_filter (dvbbasebin); }
static void dvb_base_bin_dispose (GObject * object) { DvbBaseBin *dvbbasebin = GST_DVB_BASE_BIN (object); if (!dvbbasebin->disposed) { /* remove mpegtsparse BEFORE dvbsrc, since the mpegtsparse::pad-removed * signal handler uses dvbsrc */ dvb_base_bin_reset (dvbbasebin); gst_bin_remove (GST_BIN (dvbbasebin), dvbbasebin->mpegtsparse); gst_bin_remove (GST_BIN (dvbbasebin), dvbbasebin->dvbsrc); gst_bin_remove (GST_BIN (dvbbasebin), dvbbasebin->buffer_queue); dvbbasebin->disposed = TRUE; } if (G_OBJECT_CLASS (parent_class)->dispose) G_OBJECT_CLASS (parent_class)->dispose (object); }
static GstStateChangeReturn dvb_base_bin_change_state (GstElement * element, GstStateChange transition) { DvbBaseBin *dvbbasebin; GstStateChangeReturn ret; dvbbasebin = GST_DVB_BASE_BIN (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (dvbbasebin->tsparse == NULL) { GST_ELEMENT_ERROR (dvbbasebin, CORE, MISSING_PLUGIN, (NULL), ("No 'tsparse' element, check your GStreamer installation.")); return GST_STATE_CHANGE_FAILURE; } break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_poll_set_flushing (dvbbasebin->poll, FALSE); g_rec_mutex_lock (&dvbbasebin->lock); gst_task_start (dvbbasebin->task); g_rec_mutex_unlock (&dvbbasebin->lock); break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_poll_set_flushing (dvbbasebin->poll, TRUE); g_rec_mutex_lock (&dvbbasebin->lock); gst_task_stop (dvbbasebin->task); g_rec_mutex_unlock (&dvbbasebin->lock); dvb_base_bin_reset (dvbbasebin); break; default: break; } return ret; }
static void dvb_base_bin_init (DvbBaseBin * dvbbasebin, DvbBaseBinClass * klass) { DvbBaseBinStream *stream; int i; dvbbasebin->dvbsrc = gst_element_factory_make ("dvbsrc", NULL); dvbbasebin->buffer_queue = gst_element_factory_make ("queue", NULL); dvbbasebin->mpegtsparse = gst_element_factory_make ("mpegtsparse", NULL); g_object_connect (dvbbasebin->mpegtsparse, "signal::pad-added", dvb_base_bin_pad_added_cb, dvbbasebin, "signal::pad-removed", dvb_base_bin_pad_removed_cb, dvbbasebin, NULL); gst_bin_add_many (GST_BIN (dvbbasebin), dvbbasebin->dvbsrc, dvbbasebin->buffer_queue, dvbbasebin->mpegtsparse, NULL); gst_element_link_many (dvbbasebin->dvbsrc, dvbbasebin->buffer_queue, dvbbasebin->mpegtsparse, NULL); dvbbasebin->programs = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free); dvbbasebin->streams = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free); dvbbasebin->pmtlist = NULL; dvbbasebin->pmtlist_changed = FALSE; dvbbasebin->disposed = FALSE; dvb_base_bin_reset (dvbbasebin); /* add PAT, CAT, NIT, SDT, EIT to pids filter for dvbsrc */ i = 0; while (initial_pids[i] >= 0) { stream = dvb_base_bin_add_stream (dvbbasebin, (guint16) initial_pids[i]); ++stream->usecount; i++; } dvb_base_bin_rebuild_filter (dvbbasebin); }
static GstStateChangeReturn dvb_base_bin_change_state (GstElement * element, GstStateChange transition) { DvbBaseBin *dvbbasebin; GstStateChangeReturn ret; dvbbasebin = GST_DVB_BASE_BIN (element); ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: dvb_base_bin_init_cam (dvbbasebin); break; case GST_STATE_CHANGE_PAUSED_TO_READY: dvb_base_bin_reset (dvbbasebin); break; default: break; } return ret; }
static void dvb_base_bin_dispose (GObject * object) { DvbBaseBin *dvbbasebin = GST_DVB_BASE_BIN (object); if (!dvbbasebin->disposed) { /* remove mpegtsparse BEFORE dvbsrc, since the mpegtsparse::pad-removed * signal handler uses dvbsrc */ dvb_base_bin_reset (dvbbasebin); if (dvbbasebin->tsparse != NULL) gst_bin_remove (GST_BIN (dvbbasebin), dvbbasebin->tsparse); gst_bin_remove (GST_BIN (dvbbasebin), dvbbasebin->dvbsrc); gst_bin_remove (GST_BIN (dvbbasebin), dvbbasebin->buffer_queue); g_free (dvbbasebin->program_numbers); gst_poll_free (dvbbasebin->poll); gst_object_unref (dvbbasebin->task); g_rec_mutex_clear (&dvbbasebin->lock); dvbbasebin->disposed = TRUE; } if (G_OBJECT_CLASS (parent_class)->dispose) G_OBJECT_CLASS (parent_class)->dispose (object); }
static void dvb_base_bin_init (DvbBaseBin * dvbbasebin) { DvbBaseBinStream *stream; GstPad *ghost, *pad; int i; dvbbasebin->dvbsrc = gst_element_factory_make ("dvbsrc", NULL); dvbbasebin->buffer_queue = gst_element_factory_make ("queue", NULL); dvbbasebin->tsparse = gst_element_factory_make ("tsparse", NULL); g_object_set (dvbbasebin->buffer_queue, "max-size-buffers", 0, "max-size-bytes", 0, "max-size-time", (guint64) 0, NULL); gst_bin_add_many (GST_BIN (dvbbasebin), dvbbasebin->dvbsrc, dvbbasebin->buffer_queue, dvbbasebin->tsparse, NULL); gst_element_link_many (dvbbasebin->dvbsrc, dvbbasebin->buffer_queue, dvbbasebin->tsparse, NULL); /* Proxy dvbsrc signals */ g_signal_connect (dvbbasebin->dvbsrc, "tuning-start", G_CALLBACK (tuning_start_signal_cb), dvbbasebin); g_signal_connect (dvbbasebin->dvbsrc, "tuning-done", G_CALLBACK (tuning_done_signal_cb), dvbbasebin); g_signal_connect (dvbbasebin->dvbsrc, "tuning-fail", G_CALLBACK (tuning_fail_signal_cb), dvbbasebin); /* Expose tsparse source pad */ if (dvbbasebin->tsparse != NULL) { pad = gst_element_get_static_pad (dvbbasebin->tsparse, "src"); ghost = gst_ghost_pad_new ("src", pad); } else { ghost = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC); } gst_element_add_pad (GST_ELEMENT (dvbbasebin), ghost); dvbbasebin->programs = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, dvb_base_bin_program_destroy); dvbbasebin->streams = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free); dvbbasebin->pmtlist = NULL; dvbbasebin->pmtlist_changed = FALSE; dvbbasebin->disposed = FALSE; dvb_base_bin_reset (dvbbasebin); /* add PAT, CAT, NIT, SDT, EIT, TDT to pids filter for dvbsrc */ i = 0; while (initial_pids[i] >= 0) { stream = dvb_base_bin_add_stream (dvbbasebin, (guint16) initial_pids[i]); dvb_base_bin_ref_stream (stream); i++; } dvb_base_bin_rebuild_filter (dvbbasebin); g_rec_mutex_init (&dvbbasebin->lock); dvbbasebin->task = gst_task_new ((GstTaskFunction) dvb_base_bin_task, dvbbasebin, NULL); gst_task_set_lock (dvbbasebin->task, &dvbbasebin->lock); dvbbasebin->poll = gst_poll_new_timer (); }