static void dvb_base_bin_deactivate_program (DvbBaseBin * dvbbasebin, DvbBaseBinProgram * program) { DvbBaseBinStream *stream; stream = dvb_base_bin_get_stream (dvbbasebin, program->pmt_pid); if (stream != NULL) { dvb_base_bin_unref_stream (stream); } stream = dvb_base_bin_get_stream (dvbbasebin, program->pcr_pid); if (stream != NULL) { dvb_base_bin_unref_stream (stream); } if (program->pmt) { dvb_base_bin_remove_pmt_streams (dvbbasebin, program->pmt); dvbbasebin->pmtlist = g_list_remove (dvbbasebin->pmtlist, program->pmt); dvbbasebin->pmtlist_changed = TRUE; } dvb_base_bin_rebuild_filter (dvbbasebin); program->pmt_active = FALSE; program->active = FALSE; }
static void dvb_base_bin_pat_info_cb (DvbBaseBin * dvbbasebin, const GstStructure * pat_info) { DvbBaseBinProgram *program; DvbBaseBinStream *stream; const GValue *value; GstStructure *program_info; guint program_number; guint pid; guint old_pmt_pid; gint i; gboolean rebuild_filter = FALSE; const GValue *programs; programs = gst_structure_get_value (pat_info, "programs"); for (i = 0; i < gst_value_list_get_size (programs); ++i) { value = gst_value_list_get_value (programs, i); program_info = g_value_get_boxed (value); gst_structure_get_uint (program_info, "program-number", &program_number); gst_structure_get_uint (program_info, "pid", &pid); program = dvb_base_bin_get_program (dvbbasebin, program_number); if (program == NULL) program = dvb_base_bin_add_program (dvbbasebin, program_number); old_pmt_pid = program->pmt_pid; program->pmt_pid = pid; if (program->selected) { /* PAT update */ if (old_pmt_pid != G_MAXUINT16 && old_pmt_pid != program->pmt_pid) dvb_base_bin_get_stream (dvbbasebin, old_pmt_pid)->usecount -= 1; stream = dvb_base_bin_get_stream (dvbbasebin, program->pmt_pid); if (stream == NULL) stream = dvb_base_bin_add_stream (dvbbasebin, program->pmt_pid); stream->usecount += 1; rebuild_filter = TRUE; } } if (rebuild_filter) dvb_base_bin_rebuild_filter (dvbbasebin); }
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_activate_program (DvbBaseBin * dvbbasebin, DvbBaseBinProgram * program) { DvbBaseBinStream *stream; if (program->old_pmt) { dvb_base_bin_remove_pmt_streams (dvbbasebin, program->old_pmt); dvbbasebin->pmtlist = g_list_remove (dvbbasebin->pmtlist, program->old_pmt); } /* activate the PMT and PCR streams. If the PCR stream is in the PMT its * usecount will be incremented by 2 here and decremented by 2 when the * program is deactivated */ if (!program->pmt_active) { stream = dvb_base_bin_get_stream (dvbbasebin, program->pmt_pid); if (stream == NULL) stream = dvb_base_bin_add_stream (dvbbasebin, program->pmt_pid); dvb_base_bin_ref_stream (stream); program->pmt_active = TRUE; } if (program->pmt) { guint16 old_pcr_pid; old_pcr_pid = program->pcr_pid; program->pcr_pid = program->pmt->pcr_pid; if (old_pcr_pid != G_MAXUINT16 && old_pcr_pid != program->pcr_pid) { dvb_base_bin_unref_stream (dvb_base_bin_get_stream (dvbbasebin, old_pcr_pid)); } stream = dvb_base_bin_get_stream (dvbbasebin, program->pcr_pid); if (stream == NULL) stream = dvb_base_bin_add_stream (dvbbasebin, program->pcr_pid); dvb_base_bin_ref_stream (stream); dvb_base_bin_add_pmt_streams (dvbbasebin, program->pmt); dvbbasebin->pmtlist = g_list_append (dvbbasebin->pmtlist, (gpointer) program->pmt); dvbbasebin->pmtlist_changed = TRUE; program->active = TRUE; } dvb_base_bin_rebuild_filter (dvbbasebin); }
static void dvb_base_bin_pat_info_cb (DvbBaseBin * dvbbasebin, GstMpegtsSection * section) { GPtrArray *pat; DvbBaseBinProgram *program; DvbBaseBinStream *stream; guint old_pmt_pid; gint i; gboolean rebuild_filter = FALSE; if (!(pat = gst_mpegts_section_get_pat (section))) { GST_WARNING_OBJECT (dvbbasebin, "got invalid PAT"); return; } for (i = 0; i < pat->len; i++) { GstMpegtsPatProgram *patp = g_ptr_array_index (pat, i); program = dvb_base_bin_get_program (dvbbasebin, patp->program_number); if (program == NULL) program = dvb_base_bin_add_program (dvbbasebin, patp->program_number); old_pmt_pid = program->pmt_pid; program->pmt_pid = patp->network_or_program_map_PID; if (program->selected) { /* PAT update */ if (old_pmt_pid != G_MAXUINT16 && old_pmt_pid != program->pmt_pid) { dvb_base_bin_unref_stream (dvb_base_bin_get_stream (dvbbasebin, old_pmt_pid)); } stream = dvb_base_bin_get_stream (dvbbasebin, program->pmt_pid); if (stream == NULL) stream = dvb_base_bin_add_stream (dvbbasebin, program->pmt_pid); dvb_base_bin_ref_stream (stream); rebuild_filter = TRUE; } } g_ptr_array_unref (pat); if (rebuild_filter) dvb_base_bin_rebuild_filter (dvbbasebin); }
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 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 (); }