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_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_remove_pmt_streams (DvbBaseBin * dvbbasebin, const GstMpegtsPMT * pmt) { gint i; DvbBaseBinStream *stream; for (i = 0; i < pmt->streams->len; i++) { GstMpegtsPMTStream *pmtstream = g_ptr_array_index (pmt->streams, i); stream = dvb_base_bin_get_stream (dvbbasebin, pmtstream->pid); if (stream == NULL) { GST_WARNING_OBJECT (dvbbasebin, "removing unknown stream %d ??", pmtstream->pid); continue; } dvb_base_bin_unref_stream (stream); } }