static void dvb_base_bin_pmt_info_cb (DvbBaseBin * dvbbasebin, GstStructure * pmt) { DvbBaseBinProgram *program; guint program_number; gst_structure_get_uint (pmt, "program-number", &program_number); program = dvb_base_bin_get_program (dvbbasebin, program_number); if (program == NULL) { GST_WARNING ("got PMT for program %d but program not in PAT", program_number); program = dvb_base_bin_add_program (dvbbasebin, program_number); } program->old_pmt = program->pmt; program->pmt = gst_structure_copy (pmt); /* activate the program if it's selected and either it's not active or its pmt * changed */ if (program->selected && (!program->active || program->old_pmt != NULL)) dvb_base_bin_activate_program (dvbbasebin, program); if (program->old_pmt) { gst_structure_free (program->old_pmt); program->old_pmt = NULL; } }
static void dvb_base_bin_set_program_numbers (DvbBaseBin * dvbbasebin, const gchar * pn) { gchar **strv, **walk; DvbBaseBinProgram *program; /* Split up and update programs */ strv = g_strsplit (pn, ":", 0); for (walk = strv; *walk; walk++) { gint program_number = strtol (*walk, NULL, 0); program = dvb_base_bin_get_program (dvbbasebin, program_number); if (program == NULL) { program = dvb_base_bin_add_program (dvbbasebin, program_number); program->selected = TRUE; } } g_strfreev (strv); /* FIXME : Deactivate programs no longer selected */ if (dvbbasebin->program_numbers) g_free (dvbbasebin->program_numbers); dvbbasebin->program_numbers = g_strdup (pn); if (0) dvb_base_bin_deactivate_program (dvbbasebin, NULL); }
static void dvb_base_bin_pad_added_cb (GstElement * mpegtsparse, GstPad * pad, DvbBaseBin * dvbbasebin) { DvbBaseBinProgram *program; gint program_number; gchar *padname; program_number = get_pad_program_number (pad); if (program_number == -1) return; program = dvb_base_bin_get_program (dvbbasebin, program_number); if (program == NULL) program = dvb_base_bin_add_program (dvbbasebin, program_number); program->selected = TRUE; padname = gst_pad_get_name (pad); program->ghost = gst_ghost_pad_new (padname, pad); gst_pad_set_active (program->ghost, TRUE); gst_element_add_pad (GST_ELEMENT (dvbbasebin), program->ghost); gst_element_no_more_pads (GST_ELEMENT (dvbbasebin)); /* if the program has a pmt, activate it now, otherwise it will get activated * when there's a PMT */ if (!program->active && program->pmt_pid != G_MAXUINT16) dvb_base_bin_activate_program (dvbbasebin, program); g_free (padname); }
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_pad_removed_cb (GstElement * mpegtsparse, GstPad * pad, DvbBaseBin * dvbbasebin) { DvbBaseBinProgram *program; gint program_number; program_number = get_pad_program_number (pad); if (program_number == -1) return; program = dvb_base_bin_get_program (dvbbasebin, program_number); program->selected = FALSE; dvb_base_bin_deactivate_program (dvbbasebin, program); gst_element_remove_pad (GST_ELEMENT (dvbbasebin), program->ghost); program->ghost = NULL; }
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_pmt_info_cb (DvbBaseBin * dvbbasebin, GstMpegtsSection * section) { const GstMpegtsPMT *pmt; DvbBaseBinProgram *program; guint program_number; pmt = gst_mpegts_section_get_pmt (section); if (G_UNLIKELY (pmt == NULL)) { GST_WARNING_OBJECT (dvbbasebin, "Received invalid PMT"); return; } program_number = section->subtable_extension; program = dvb_base_bin_get_program (dvbbasebin, program_number); if (program == NULL) { GST_WARNING ("got PMT for program %d but program not in PAT", program_number); program = dvb_base_bin_add_program (dvbbasebin, program_number); } program->old_pmt = program->pmt; program->old_section = program->section; program->pmt = pmt; program->section = gst_mpegts_section_ref (section); /* activate the program if it's selected and either it's not active or its pmt * changed */ if (program->selected && (!program->active || program->old_pmt != NULL)) dvb_base_bin_activate_program (dvbbasebin, program); if (program->old_pmt) { gst_mpegts_section_unref (program->old_section); program->old_pmt = NULL; } }