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_add_pmt_streams (DvbBaseBin * dvbbasebin, GstStructure * pmt) { DvbBaseBinStream *stream; const GValue *streams; guint program_number; gint i; const GValue *value; GstStructure *stream_info; guint pid; guint stream_type; gst_structure_get_uint (pmt, "program-number", &program_number); streams = gst_structure_get_value (pmt, "streams"); for (i = 0; i < gst_value_list_get_size (streams); ++i) { value = gst_value_list_get_value (streams, i); stream_info = g_value_get_boxed (value); gst_structure_get_uint (stream_info, "pid", &pid); gst_structure_get_uint (stream_info, "stream-type", &stream_type); GST_DEBUG ("filtering stream %d stream_type %d", pid, stream_type); stream = dvb_base_bin_get_stream (dvbbasebin, (guint16) pid); if (stream == NULL) stream = dvb_base_bin_add_stream (dvbbasebin, (guint16) pid); ++stream->usecount; } }
static void dvb_base_bin_remove_pmt_streams (DvbBaseBin * dvbbasebin, GstStructure * pmt) { const GValue *streams; guint program_number; gint i; const GValue *value; GstStructure *stream_info; DvbBaseBinStream *stream; guint pid; guint stream_type; gst_structure_get_uint (pmt, "program-number", &program_number); streams = gst_structure_get_value (pmt, "streams"); for (i = 0; i < gst_value_list_get_size (streams); ++i) { value = gst_value_list_get_value (streams, i); stream_info = g_value_get_boxed (value); gst_structure_get_uint (stream_info, "pid", &pid); gst_structure_get_uint (stream_info, "stream-type", &stream_type); stream = dvb_base_bin_get_stream (dvbbasebin, (guint16) pid); if (stream == NULL) { GST_WARNING_OBJECT (dvbbasebin, "removing unknown stream %d ??", pid); continue; } --stream->usecount; } }
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_add_pmt_streams (DvbBaseBin * dvbbasebin, const GstMpegtsPMT * pmt) { DvbBaseBinStream *stream; gint i; for (i = 0; i < pmt->streams->len; i++) { GstMpegtsPMTStream *pmtstream = g_ptr_array_index (pmt->streams, i); GST_DEBUG ("filtering stream %d stream_type %d", pmtstream->pid, pmtstream->stream_type); stream = dvb_base_bin_get_stream (dvbbasebin, pmtstream->pid); if (stream == NULL) stream = dvb_base_bin_add_stream (dvbbasebin, pmtstream->pid); dvb_base_bin_ref_stream (stream); } }
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); } }